代码之家  ›  专栏  ›  技术社区  ›  Adam Fraser

以字符串形式高效地读取java中的任何文件

  •  0
  • Adam Fraser  · 技术社区  · 6 年前

    我正在研究哈夫曼编码的一个简单实现,它适用于任何使用某种形式的文本编码的文件,但当我尝试以任何其他格式(例如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 回复  |  直到 6 年前
        1
  •  0
  •   Roni Koren Kurtberg    6 年前

    也许这会有帮助: FileInputStream vs FileReader

    当然,要改变你的方法 StringBuilder (但这是另一个问题)。

        2
  •  0
  •   SMA    6 年前

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

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

    这样,您就可以继续重用相同的生成器对象。如果您正在阅读二进制内容,那么最好使用 InputStream 等级制度

    我们确实有 Files 从nio包中初始化,您可以使用它来获取以下行:

    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

        3
  •  0
  •   M. le Rutte    6 年前

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

    您应该将文件解释为字节序列。使用内存映射 ByteBuffer 以实现最大效率。