压缩以字符串的形式高效地读取java中的任何文件
我正在研究哈夫曼编码的一个简单实现,它适用于任何使用某种文本编码形式的文件,但当我尝试以任何其他格式(例如mp4.png.exe)读取时,它仍然有效,但速度非常慢 (对于相同大小的文件,时间为分钟,而不是不到一秒钟)
我的问题是,我是否应该使用另一种方法来读取这些文件,以便读取速度取决于文件的大小,而不是其格式,如果是的话,它是什么?谢谢
这是我的IO类,它使用一个包在bufferedReader中的文件读取器,根据控制台中输入的路径读取文件
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class IO {
public String readFile(String path, boolean includeNewLine) {
String returnString = "";
try {
FileReader fileReader = new FileReader(path);
BufferedReader bufferedReader = new BufferedReader(fileReader);
String line;
int nLines = 0;
while((line = bufferedReader.readLine()) != null) {
if(nLines > 0 && includeNewLine) {
returnString += "\n";
}
returnString += line;
nLines++;
}
bufferedReader.close();
} catch(FileNotFoundException e) {
System.out.println("Unable to open file '" + path + "'");
} catch(IOException e) {
System.out.println("Error reading file '" + path + "'");
}
return returnString;
}
}
# 1 楼答案
在
returnString
中,通过将新行追加到前一行来创建字符串的新实例。相反,我建议您使用StringBuilder
如下:这样,就可以继续重用同一个生成器对象。此外,如果您正在阅读二进制内容,那么最好使用
InputStream
层次结构中的类我们确实有nio包中的
Files
类,您可以使用它来获取以下行:另一种方法是使用Apache commons IO api
FileUtils.readFileToString
提供的已经测试过的代码# 2 楼答案
只要您试图将文件解释为
String
,您就会遇到效率问题。任何二进制格式都可能产生一个巨大的字符串,甚至超过一个字符串可以容纳的64K最大值,因为可能永远不会有一个字节被解释为行尾字符(“\n
”)您应该将文件解释为字节序列。使用内存映射^{} 以获得最大效率
# 3 楼答案
也许这会有帮助:FileInputStream vs FileReader
当然,将方法更改为使用
StringBuilder
(但这是另一个问题)