2009-08-04 43 views
2

java.io.FileInputStream,有一种方法int read(Byte[] buffer,int offset,int numBytes);我们如何使用这个功能 - 这个方法和read(byte[] buffer)有什么不同?使用Java的FileInputStream

+5

要回答这个问题只需要一些批判性思维。考虑到你知道两个函数之间的方法参数的区别,你认为*的区别是什么?将您的猜测与文档进行比较。 – 2009-08-04 10:48:49

回答

7

正如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. 

你可以使用这种方法,如果你想重新使用一个已经有数据的现有缓冲区,你不想破坏(当然,从offset开始的numBytes将被覆盖)。

在Java中,缓冲区中的几乎所有操作都提供这种类型的接口。正确使用,您可以避免多次复制/缓冲数据。

+0

如果您使用缓冲区同时缓冲和处理来自流的数据,那么这非常有趣。例如,某些媒体格式的解码器可能会将数据从流中读取到缓冲区中,而另一个线程从此缓冲区中获取值以处理它们。由于缓冲区之前可能会填充某些值,因此您需要在给定偏移量处开始重新填充(因此使用第二个参数)。如果你完全填充缓冲区,你将从头开始,但只使用已由另一个线程处理的空间,并使用len-param来实现这一点。 – Mnementh 2009-08-04 10:55:59

1

刚刚从javadoc得到了这个。

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

参数:

  • b - 将所述读取数据的缓冲器。
  • off - 目标数组中的起始偏移b
  • len - 读取的最大字节数。

返回: 读入缓冲区的总字节数,或-1,如果没有更多的数据,因为该文件的结尾已经到达。

http://java.sun.com/javase/6/docs/api/java/io/FileInputStream.html#read(byte[],INT,INT)

1

这个功能是非常有用的阅读整个文件到内存中。看到这个例子,

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. 
相关问题