开始研究jdk的开始,限于个人理解,不准确或理解错的地方还望指教。
/*
* Copyright (c) 1994, 2006, Oracle and/or its affiliates. All rights reserved. Applications that need to define a subclass of InputStream
* must always provide a method that returns the next byte of input.
*
* 所有需要定义InputStream子类的应用必须提供一个方法返回下一字节的输入。
*
* @author Arthur van Hoff
* @see java.io.BufferedInputStream
* @see java.io.ByteArrayInputStream
* @see java.io.DataInputStream
* @see java.io.FilterInputStream
* @see java.io.InputStream#read()
* @see java.io.OutputStream
* @see java.io.PushbackInputStream
* @since JDK1.0
*/
public abstract class InputStream implements Closeable {
// MAX_SKIP_BUFFER_SIZE is used to determine the maximum buffer size to
// use when skipping.
// 最大可略过的缓存数据
private static final int MAX_SKIP_BUFFER_SIZE = 2048;
/**
* Reads the next byte of data from the input stream. The value byte is
* returned as an int
in the range 0
to
* 255
. If no byte is available because the end of the stream
* has been reached, the value -1
is returned. This method
* blocks until input data is available, the end of the stream is detected,
* or an exception is thrown.
*
* 从输入流读取下一字节。返回一个int型的值从0到255.
* 当到达流的尾部是,没有合适的字节返回,此时返回-1.
* 方法被阻塞直到有合适的输入数据或流的尾部被找到或者抛异常。
*
*
A subclass must provide an implementation of this method.
* 子类必须实现这个方法。
*
* @return the next byte of data, or -1
if the end of the
* stream is reached.
* @exception IOException if an I/O error occurs.
*/
public abstract int read() throws IOException;
/**
* Reads some number of bytes from the input stream and stores them into
* the buffer array b
. The number of bytes actually read is
* returned as an integer. This method blocks until input data is
* available, end of file is detected, or an exception is thrown.
*
* 从输入流中读取一定量的的字节并存储在缓存数组b中。
* 实际上字节读取数量作为一个integer数值返回。
* 方法被阻塞直到输入合适数据或文件结尾或抛出异常
*
*
If the length of b
is zero, then no bytes are read and
* 0
is returned; otherwise, there is an attempt to read at
* least one byte. If no byte is available because the stream is at the
* end of the file, the value -1
is returned; otherwise, at
* least one byte is read and stored into b
.
*
* 如果缓存数组b的长度是0,没有字节被读取,0被返回;否则会尝试至少读取一个字节。
* 因为到达文件结尾而没有合适字节,返回值-1;否则至少读取一个字节并存在缓存b中。
*
*
The first byte read is stored into element b[0]
, the
* next one into b[1]
, and so on. The number of bytes read is,
* at most, equal to the length of b
. Let k be the
* number of bytes actually read; these bytes will be stored in elements
* b[0]
through b[
k-1]
,
* leaving elements b[
k]
through
* b[b.length-1]
unaffected.
*
* 读取的第一个字节存储在缓存数组第一个位置b[0],读取的第二个字节存在b[1]位置,以此类推。
* 最多可读取缓存数组长度的字节。
* 设置k为实际读取的字节数量,这些字节存在从b[0]到b[k-1]的位置,
* 余下的位置不受影响。
*
*
The read(b)
method for class InputStream
* has the same effect as:
read(b, 0, b.length)
-1
if there is no more data because the end of
b
is null
.
len
bytes of data from the input stream into
len
bytes, but a smaller number may be read.
This method blocks until input data is available, end of file is
* detected, or an exception is thrown.
*
* 当数据读取完,到达文件末尾或抛出异常时方法被阻塞。
*
*
If len
is zero, then no bytes are read and
* 0
is returned; otherwise, there is an attempt to read at
* least one byte. If no byte is available because the stream is at end of
* file, the value -1
is returned; otherwise, at least one
* byte is read and stored into b
.
*
* 如果len是0,没有字节读取,返回0;否则至少读取一个字节。如果因为流到达文件末尾没有字节可读取,返回-1;
* 否则至少读取一个字节并存储在缓存b中。
*
*
The first byte read is stored into element b[off]
, the
* next one into b[off+1]
, and so on. The number of bytes read
* is, at most, equal to len
. Let k be the number of
* bytes actually read; these bytes will be stored in elements
* b[off]
through b[off+
k-1]
,
* leaving elements b[off+
k]
through
* b[off+len-1]
unaffected.
*
* 读取的第一个字节存在b[off]位置,下一个字节存在b[off+1]位置,以此类推。
* 读取字节数量最多为len的长度。
* 假设k为实际读取的字节,这些字节存储在从b[off]到b[k-1]的位置,
* 余下的位置不受影响。
*
*
In every case, elements b[0]
through
* b[off]
and elements b[off+len]
through
* b[b.length-1]
are unaffected.
*
* 在每一个例子中,b[0]到b[off]的元素和b[off+len]到b[b.length-1]的元素互不影响。
*
*
The read(b,
off,
len)
method
* for class InputStream
simply calls the method
* read()
repeatedly. If the first such call results in an
* IOException
, that exception is returned from the call to
* the read(b,
off,
len)
method. If
* any subsequent call to read()
results in a
* IOException
, the exception is caught and treated as if it
* were end of file; the bytes read up to that point are stored into
* b
and the number of bytes read before the exception
* occurred is returned. The default implementation of this method blocks
* until the requested amount of input data len
has been read,
* end of file is detected, or an exception is thrown. Subclasses are encouraged
* to provide a more efficient implementation of this method.
*
* read(b,off,len)方法是InputStream类的read()方法的简单重复。
* 如果第一次调用导致IO异常,这个异常从调用的read(b,off,len)方法返回。
* 如果是后续的调用read()方法导致IO异常,这个异常会在文件末尾引起;
* 字节读取直到发生异常的位置,这些字节会存储在b缓存中,在异常发生前读取的字节数会被返回。
* 默认方法会被阻塞当需要输入的数据数据达到len长度或到达文件末尾或异常抛出。
* 子类最好可以提供一个更好的有效率的方法实现。
*
* @param b the buffer into which the data is read.
* @param off the start offset in array b
* at which the data is written.
* 向缓存写入的起始位置
* @param len the maximum number of bytes to read.
*
对大读取字节数
* @return the total number of bytes read into the buffer, or
* -1
if there is no more data because the end of
* the stream has been reached.
* 如果到达流的末尾没有更多数据读取,读取的所有字节存入缓存或者存入-1.
* @exception IOException If the first byte cannot be read for any reason
* other than end of file, or if the input stream has been closed, or if
* some other I/O error occurs.
* @exception NullPointerException If b
is null
.
* @exception IndexOutOfBoundsException If off
is negative,
* len
is negative, or len
is greater than
* b.length - off
* 如果off为负数或len是负数或len大于缓存b的长度和off的差,抛出IndexOutOfBounds异常。
* @see java.io.InputStream#read()
*/
public int read(byte b[], int off, int len) throws IOException {
if (b == null) {
throw new NullPointerException();
} else if (off < 0 || len < 0 || len > b.length - off) {
throw new IndexOutOfBoundsException();
} else if (len == 0) {
return 0;
}
int c = read();
if (c == -1) {
return -1;
}
b[off] = (byte)c;
int i = 1;
try {
for (; i < len ; i++) {
c = read();
if (c == -1) {
break;
}
b[off + i] = (byte)c;
}
} catch (IOException ee) {
}
return i;
}
/**
* Skips over and discards n
bytes of data from this input
* stream. The skip
method may, for a variety of reasons, end
* up skipping over some smaller number of bytes, possibly 0
.
* This may result from any of a number of conditions; reaching end of file
* before n
bytes have been skipped is only one possibility.
* The actual number of bytes skipped is returned. If n
is
* negative, no bytes are skipped.
*
* 跳过或者丢弃n字节的数据从输入流中。
* 由于多种原因,跳过方法可以略过较小数量的字节数,也可能是0.
* 略过这些字节源自很多条件;在跳过n字节前就已经到达文件尾部只是一种可能性。
* 返回实际跳过的字节数,如果n为负数,没有字节呗跳过。
*
*
The skip
method of this class creates a
* byte array and then repeatedly reads into it until n
bytes
* have been read or the end of the stream has been reached. Subclasses are
* encouraged to provide a more efficient implementation of this method.
* For instance, the implementation may depend on the ability to seek.
*
* 这个类的skip方法创建了一个字节数组,之后向数组读入数据直到读取到n字节或是文件流结尾。
* 子类最好可提供更有效的实现方法。实现方法取决于seek的能力。
*
* @param n the number of bytes to be skipped.
*
要求跳过的字节数
* @return the actual number of bytes skipped.实际跳过的字节数
* @exception IOException if the stream does not support seek,
* or if some other I/O error occurs.
* 流不支持seek或其他IO错误,抛出IO异常。
*/
public long skip(long n) throws IOException {
long remaining = n;
int nr;
if (n <= 0) {
return 0;
}
int size = (int)Math.min(MAX_SKIP_BUFFER_SIZE, remaining);
byte[] skipBuffer = new byte[size];
while (remaining > 0) {
nr = read(skipBuffer, 0, (int)Math.min(size, remaining));
if (nr < 0) {
break;
}
remaining -= nr;
}
return n - remaining;
}
/**
* Returns an estimate of the number of bytes that can be read (or
* skipped over) from this input stream without blocking by the next
* invocation of a method for this input stream. The next invocation
* might be the same thread or another thread. A single read or skip of this
* many bytes will not block, but may read or skip fewer bytes.
*
*
Note that while some implementations of {@code InputStream} will return
* the total number of bytes in the stream, many will not. It is
* never correct to use the return value of this method to allocate
* a buffer intended to hold all data in this stream.
*
* 注意,一些此方法的实现会返回流中的总字节数,但是很多也不会。
* 不要使用此方法的返回值去分配一个存有所有流数据的缓存。
*
*
A subclass' implementation of this method may choose to throw an
* {@link IOException} if this input stream has been closed by
* invoking the {@link #close()} method.
*
*
The {@code available} method for class {@code InputStream} always
* returns {@code 0}.
*
*
This method should be overridden by subclasses.
* 此方法应该被子类重写
*
* @return an estimate of the number of bytes that can be read (or skipped
* over) from this input stream without blocking or {@code 0} when
* it reaches the end of the input stream.
* 当读取到文件流末尾时,从没有被阻塞的输入流中评估中可读或可略过的字节数
* @exception IOException if an I/O error occurs.
*/
public int available() throws IOException {
return 0;
}
/**
* Closes this input stream and releases any system resources associated
* with the stream.
*
* 关闭输入流释放和流有关的系统资源
*
*
The close
method of InputStream
does
* nothing.
*
* @exception IOException if an I/O error occurs.
*/
public void close() throws IOException {}
/**
* Marks the current position in this input stream. A subsequent call to
* the reset
method repositions this stream at the last marked
* position so that subsequent reads re-read the same bytes.
*
* 标记在输入流中当前位置。
*
*
The readlimit
arguments tells this input stream to
* allow that many bytes to be read before the mark position gets
* invalidated.
*
*
The general contract of mark
is that, if the method
* markSupported
returns true
, the stream somehow
* remembers all the bytes read after the call to mark
and
* stands ready to supply those same bytes again if and whenever the method
* reset
is called. However, the stream is not required to
* remember any data at all if more than readlimit
bytes are
* read from the stream before reset
is called.
*
*
Marking a closed stream should not have any effect on the stream.
*
*
The mark
method of InputStream
does
* nothing.
*
* @param readlimit the maximum limit of bytes that can be read before
* the mark position becomes invalid.
* @see java.io.InputStream#reset()
*/
public synchronized void mark(int readlimit) {}
/**
* Repositions this stream to the position at the time the
* mark
method was last called on this input stream.
*
* 将流复位到mark方法最后一次在这个输入流中掉用是的位置
*
*
The general contract of reset
is:
*
*
markSupported
returns
true
, then:
mark
has not been called since
mark
was last called is larger than the argument
mark
at that last call, then an
IOException
might be thrown.
IOException
is not thrown, then the
mark
(or since the start of the
mark
has not been called) will be resupplied
read
method, followed by
reset
. markSupported
returns
false
, then:
reset
may throw an
IOException
.
IOException
is not thrown, then the stream
read
method depend on the
The method reset
for class InputStream
* does nothing except throw an IOException
.
*
* InputStream类的reset方法只会抛出IO异常不会有其他的作用。
*
* @exception IOException if this stream has not been marked or if the
* mark has been invalidated.
* @see java.io.InputStream#mark(int)
* @see java.io.IOException
*/
public synchronized void reset() throws IOException {
throw new IOException("mark/reset not supported");
}
/**
* Tests if this input stream supports the mark
and
* reset
methods. Whether or not mark
and
* reset
are supported is an invariant property of a
* particular input stream instance. The markSupported
method
* of InputStream
returns false
.
*
* 检测此输入流是否支持mark和reset方法。
* 对于一个特定的输入流,是否支持mark和reset方法是一个不变的属性。
* 输入流的MarkSupport方法返回false。
*
* @return true
if this stream instance supports the mark
* and reset methods; false
otherwise.
* @see java.io.InputStream#mark(int)
* @see java.io.InputStream#reset()
*/
public boolean markSupported() {
return false;
}
}