Java文件IO在使用BufferedInputStream读取大文件时被截断
我有一个函数,其中只给我一个BufferedInputStream,没有关于要读取的文件的其他信息。不幸的是,我无法更改方法定义,因为它是由我无权访问的代码调用的。我一直在使用下面的代码读取文件并将其内容放入字符串中:Java文件IO在使用BufferedInputStream读取大文件时被截断,java,file,file-io,bigdata,Java,File,File Io,Bigdata,我有一个函数,其中只给我一个BufferedInputStream,没有关于要读取的文件的其他信息。不幸的是,我无法更改方法定义,因为它是由我无权访问的代码调用的。我一直在使用下面的代码读取文件并将其内容放入字符串中: public String[] doImport(BufferedInputStream stream) throws IOException, PersistenceException { int bytesAvail = stream.available();
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
仅描述如何访问底层流,它没有对最终如何从其中读取数据施加任何限制。您可以像使用任何其他InputStream
一样使用它
也就是说,你可以一行一行地读
InputStreamReader streamReader = new InputStreamReader(stream);
BufferedInputReader lineReader = new BufferedInputReader(streamReader);
String line = lineReader.readLine();
...
[编辑]此回答是针对问题的原始措辞,该问题专门要求一种逐行阅读输入文件的方法。我不确定“你为什么认为”每个文件都有行。他们没有。也很难理解为什么您认为每个文件都有字符。他们没有。从一个文件中读取一行数据,而这个数据可能有一行,也可能没有一行,或者多行,并不能解决实际问题-1.原问题已予修改。最初,海报表明他们更喜欢逐行读取文件,因此我假设输入是一个带换行符的字符流。