我有一个函数,其中只给我一个 BufferedInputStream 而没有有关要读取的文件的其他信息。不幸的是,我无法更改方法定义,因为它是由我无权访问的代码调用的。我一直在使用下面的代码来读取文件并将其内容放入字符串中:
public String[] doImport(BufferedInputStream stream) throws IOException, PersistenceException {
int bytesAvail = stream.available();
byte[] bytesRead = new byte[bytesAvail];
stream.read(bytesRead);
stream.close();
String fileContents = new String(bytesRead);
//more code here working with fileContents
}
我的问题是,对于大文件 (>2Gb),此代码会导致程序运行极其缓慢或截断数据,具体取决于执行程序的计算机。有人对如何在这种情况下处理大文件有建议吗?
最佳答案
您假设 available()
返回文件的大小;它不是。它返回可供读取的字节数,并且可以是小于或等于文件大小的任何数字。
不幸的是,如果没有有关文件数据长度的其他信息源(即通过调用java.io.File.length()),就无法一次性完成您想要的事情
)。相反,您可能必须从多次读取中积累。一种方法是使用ByteArrayOutputStream
。读入固定的、有限大小的数组,然后将读取的数据写入 ByteArrayOutputStream
。最后,将字节数组拉出。您需要使用 read()
和 write()
的三参数形式,并查看 read()
的返回值这样您就可以准确地知道每次调用时读入缓冲区的字节数。
关于使用 BufferedInputStream 读取大文件时 Java 文件 IO 被截断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16311485/