0

我有一个函数,其中我只得到一个 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),此代码会导致程序运行速度极慢或截断数据,具体取决于执行程序的计算机。有人对在这种情况下如何处理大文件有建议吗?

4

2 回答 2

1

您假设available()返回文件的大小;它不是。它返回可供读取的字节数,可以是小于或等于文件大小的任何数字。

不幸的是,如果没有关于文件数据长度的其他信息源(即,通过调用java.io.File.length()),就无法一次性完成您想要的操作。相反,您可能必须从多次读取中累积。一种方法是使用ByteArrayOutputStream. 读入一个固定的、有限大小的数组,然后将读入的数据写入ByteArrayOutputStream. 最后,拉出字节数组。您需要使用 and 的三个参数形式read()write()查看 的返回值,read()以便准确了解每次调用时将多少字节读入缓冲区。

于 2013-05-01T01:36:33.997 回答
0

我不知道为什么你不认为你可以逐行阅读。BufferedInputStream仅描述如何访问底层流,它不会对您最终从中读取数据的方式施加任何限制。您可以像使用其他任何InputStream.

也就是说,要逐行阅读,您可以这样做

InputStreamReader streamReader = new InputStreamReader(stream);
BufferedInputReader lineReader = new BufferedInputReader(streamReader);
String line = lineReader.readLine();
...

[编辑] 此回复是对问题的原始措辞,该措辞专门要求一种逐行读取输入文件的方法。

于 2013-05-01T01:42:45.100 回答