使用Java';文件输入流

使用Java';文件输入流,java,io,stream,fileinputstream,Java,Io,Stream,Fileinputstream,在java.io.FileInputStream中,有一个方法int read(Byte[]buffer,int offset,int numBytes);如何使用此函数-此方法与读取(字节[]缓冲区)之间有什么区别吗?正如Javadoc所指出的(以及参数名称所指示的),带有偏移量和numBytes的方法仅使用缓冲区的一部分将其输出放入 public int read(byte[] b, int off, int len) throws

java.io.FileInputStream
中,有一个方法
int read(Byte[]buffer,int offset,int numBytes)
;如何使用此函数-此方法与读取(字节[]缓冲区)之间有什么区别吗?

正如Javadoc所指出的(以及参数名称所指示的),带有偏移量和numBytes的方法仅使用缓冲区的一部分将其输出放入

public int read(byte[] b,
            int off,
            int len)
     throws IOException

Parameters:
    b - the buffer into which the data is read.
    off - the start offset of the data.
    len - the maximum number of bytes read. 
如果您想重用现有缓冲区,而该缓冲区中已有您不想删除的数据(当然,从
偏移量开始的
numBytes
将被覆盖),则可以使用此方法


在Java中,几乎所有缓冲区上的操作都提供这种接口。如果使用得当,您可以避免复制/缓冲数据的次数过多。

刚刚从javadoc获得这一点

将此输入流中最多len字节的数据读入字节数组。如果len不为零,该方法将阻塞,直到有一些输入可用;否则,不读取字节,返回0

参数:

  • b-数据读取到的缓冲区
  • off—目标阵列b中的起始偏移量
  • len—读取的最大字节数
返回: 读取到缓冲区的总字节数,如果由于已到达文件结尾而没有更多数据,则为-1


,int,int)

此函数对于将整个文件读入内存非常有用。看这个例子

File = new File("/anywhere/anyfile");
InputStream is = new FileInputStream(file);
long fileSize = file.length();
byte[] bytes = new byte[(int)fileSize];
int offset = 0;
int count=0; 
while (offset < fileSize) {
    count=is.read(bytes, offset, fileSize-offset));
    if (count >= 0)
        offset += count;
    else
        throw new IOException("Can't read file "+file.getName());
}
is.close();
// Now bytes has all the complete file. 
File=新文件(“/anywhere/anyfile”);
InputStream is=新文件InputStream(文件);
long fileSize=file.length();
字节[]字节=新字节[(int)文件大小];
整数偏移=0;
整数计数=0;
while(偏移量<文件大小){
count=is.read(字节、偏移量、文件大小偏移量));
如果(计数>=0)
偏移量+=计数;
其他的
抛出新IOException(“无法读取文件”+file.getName());
}
is.close();
//现在bytes已经拥有了所有完整的文件。

回答这个问题只需要一些批判性思考。既然您知道这两个函数的方法参数有什么不同,那么您认为会有什么不同呢?将您的猜测与文档进行比较。如果您使用缓冲区来同时缓冲和处理来自流的数据,这一点尤其有趣。例如,用于某些媒体格式的解码器可以将数据从流读入缓冲区,而另一个线程从该缓冲区获取值以处理它们。由于缓冲区之前可能会填充一些值,因此您希望在给定偏移量处开始重新填充(因此使用第二个参数)。如果完全填充了缓冲区,则将从头开始,但仅使用另一个线程已处理的空间,并使用len参数来实现这一点。