2013-05-01 58 views
0

我有一个函数,在该函数中只给出一个BufferedInputStream,并且没有关于要读取的文件的其他信息。不幸的是,我不能改变方法定义,因为它被我无法访问的代码调用。我一直在使用下面的代码来读取文件并将其内容的字符串:Java文件使用BufferedInputStream读取大文件时截断的IO

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),该代码会导致程序运行要么极为缓慢或截断数据,取决于程序在其上执行的计算机。有没有人有关于如何在这种情况下处理大文件的建议?

回答

1

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

不幸的是,在没有其他关于文件数据长度的其他信息来源(即通过调用java.io.File.length())的情况下,没有办法只做一次就做什么。相反,你必须从多次读取中累积。一种方法是使用ByteArrayOutputStream。读入固定的有限大小的阵列,然后将读取的数据写入ByteArrayOutputStream。最后,将字节数组拉出。您需要使用read()write()这三个参数形式,并查看read()的返回值,以便您确切知道每次调用时读入缓冲区的字节数。

0

我不确定为什么你不认为你可以一行一行读取它。 BufferedInputStream只描述了底层流如何被访问,它并没有对你最终如何从中读取数据施加任何限制。您可以像使用其他InputStream一样使用它。

也就是说,读它行由行,你可以做

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

[编辑]这种反应的问题,其中特别要求的方式来读取输入文件中的行内的原有字句逐线。

+0

*我*“不确定你为什么认为”每个文件都有行。他们不。也很难理解为什么你认为每个文件都有字符。他们不。从一个文件中读取一行,可能有或没有一个或多个文件,并不能解决实际问题。 -1。 – EJP 2013-05-01 10:15:08

+0

原始问题已修改。最初,海报表明他们倾向于逐行读取文件,因此我假设输入是带有换行符的字符流。 http://stackoverflow.com/posts/16311485/revisions – Jacob 2013-05-01 15:14:13

相关问题