在java中有效地读取任何文件作为字符串

时间:2018-04-14 15:09:14

标签: java compression bufferedreader filereader huffman-code

我正在开发一个简单的霍夫曼编码实现,它适用于使用某种形式的文本编码的任何文件但是当我尝试读取任何其他格式(例如.mp4 .png .exe)时它仍然工作但变得极其缓慢 (对于相同大小的文件,分钟而不是不到一秒)。

我的问题是我应该使用另一种方法来读取这些文件,以便读取速度取决于文件的大小而不是其格式,如果是这样,它是什么?感谢。

这是我的IO类,它使用包装在bufferedReader中的fileReader根据在控制台中输入的路径读取文件。

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 个答案:

答案 0 :(得分:0)

使用returnString,您将通过将新行附加到上一行来创建String的新实例。相反,我建议您使用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

答案 1 :(得分:0)

也许这会有所帮助:FileInputStream vs FileReader

当然,更改您的方法以使用var express = require('express'); var app = express(); app.listen(3000); (但这是另一个问题)。

答案 2 :(得分:0)

只要您尝试将文件解释为String,您就会遇到效率问题。任何二进制格式都可能产生一个巨大的字符串,甚至超过一个字符串可以容纳的最大64K,因为可能永远不会有一个字节,你将其解释为行尾字符(&#39; { {1}}&#39;。)

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