使用 BufferedInputStream 读取大文件时 Java 文件 IO 被截断

标签 java file file-io bigdata

我有一个函数,其中只给我一个 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/

相关文章:

c - 文件与句柄 - 这两件事有什么区别

c - 动态从文件中获取数据

c - c中的open和creat系统调用有什么区别?

java - 如何使用 AssertJ 检查 boolean 值 getter?

html - 如何使用 Watir 直接从文件读取(解析)html?

java - 用数据填充网格 (Vaadin)

c++ - 在 C++ 中将数据从文件加载到数据结构并进行解释

java - 解决向double Arraylist添加新值时Java堆空间错误

java - 使用 @AspectJ 元素进行自动代理

java - Android 通过后台服务启动 Activity