有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

压缩以字符串的形式高效地读取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;
    }
}

共 (3) 个答案

  1. # 1 楼答案

    returnString中,通过将新行追加到前一行来创建字符串的新实例。相反,我建议您使用StringBuilder如下:

    StringBuilder fileContent = new StringBuilder();
    //do your stuff
    fileContent.append(line);
    

    这样,就可以继续重用同一个生成器对象。此外,如果您正在阅读二进制内容,那么最好使用InputStream层次结构中的类

    我们确实有nio包中的Files类,您可以使用它来获取以下行:

    try (Stream<String> stream = Files.lines( Paths.get(filePath), StandardCharsets.UTF_8)) {
        stream.forEach(s -> fileContent.append(s).append("\n"));
    }
    

    另一种方法是使用Apache commons IO api FileUtils.readFileToString提供的已经测试过的代码

  2. # 2 楼答案

    只要您试图将文件解释为String,您就会遇到效率问题。任何二进制格式都可能产生一个巨大的字符串,甚至超过一个字符串可以容纳的64K最大值,因为可能永远不会有一个字节被解释为行尾字符(“\n”)

    您应该将文件解释为字节序列。使用内存映射^{}以获得最大效率