linenumberinputstream.java

来自「gcc3.2.1源代码」· Java 代码 · 共 144 行

JAVA
144
字号
/* Copyright (C) 1998, 1999  Free Software Foundation   This file is part of libgcj.This software is copyrighted work licensed under the terms of theLibgcj License.  Please consult the file "LIBGCJ_LICENSE" fordetails.  */ package java.io;/** * @author Warren Levy <warrenl@cygnus.com> * @date November 11, 1998. * @deprecated  *//* Written using "Java Class Libraries", 2nd edition, ISBN 0-201-31002-3 * "The Java Language Specification", ISBN 0-201-63451-1 * plus online API docs for JDK 1.2 beta from http://www.javasoft.com. * Status:  Believed complete and correct.  Deprecated in JDK 1.1. */ public class LineNumberInputStream extends FilterInputStream{  /* The current line number. */  private int lineNumber = 0;  /* The line number when the stream was marked. */  private int markLineNumber = 0;  /* Flag to indicate a '\r' was just read so that an immediately subsequent   * '\n' can be ignored. */  private boolean justReadReturnChar = false;  public LineNumberInputStream(InputStream in)  {    super(in);  }  public int available() throws IOException  {    // We can only guarantee half the characters that might be available    // without blocking because "\r\n" is treated as a single character.    return in.available() / 2;  }  public int getLineNumber()  {    return lineNumber;  }  public void mark(int readlimit)  {    in.mark(readlimit);    markLineNumber = lineNumber;  }  public int read() throws IOException  {    // Treat "\r\n" as a single character.  A '\r' may have been read by    // a previous call to read so we keep an internal flag to avoid having    // to read ahead.    int ch = in.read();    if (ch == '\n')      if (justReadReturnChar)	{	  ch = in.read();          justReadReturnChar = false;	}      else	lineNumber++;    else if (ch == '\r')      {	ch = '\n';	justReadReturnChar = true;	lineNumber++;      }    else      justReadReturnChar = false;    return ch;  }  public int read(byte[] b, int off, int len) throws IOException  {    if (off < 0 || len < 0 || off + len > b.length)      throw new ArrayIndexOutOfBoundsException();    // This case always succeeds.    if (len == 0)      return 0;    // The simplest, though not necessarily the most time efficient thing    // to do is simply call read(void) len times.  Since this is a deprecated    // class, that should be ok.    final int origOff = off;    while (len-- > 0)      {	int ch = read();	if (ch < 0)	  break;	b[off++] = (byte) ch;      }    // This is safe since we already know that some bytes were    // actually requested.    return off == origOff ? -1 : off - origOff;  }  public void reset() throws IOException  {    in.reset();    lineNumber = markLineNumber;    justReadReturnChar = false;  }  public void setLineNumber(int lineNumber)  {    this.lineNumber = lineNumber;  }  public long skip(long n) throws IOException  {    if (n <= 0)      return 0L;    final long origN = n;    do      {	int ch = read();	if (ch < 0)	  break;	if (ch == '\n' || ch == '\r')	  lineNumber++;      }    while (--n > 0);    return origN - n;  }}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?