7

我真的不知道,为什么这对于读取包含很多类的文件来说如此复杂和困难

  • 输入流
  • 数据输入流
  • 输入流
  • 缓冲区读取器

下面有什么好处?这里的哲学是什么?

private static String fileToString(String filename) throws IOException
{
    InputStream resourceAsStream;
    resourceAsStream        = "".getClass().getResourceAsStream(filename);
    DataInputStream in      = new DataInputStream(resourceAsStream);
    BufferedReader reader   = new BufferedReader(new InputStreamReader(in));
    StringBuilder builder   = new StringBuilder();
    String line;    
    // For every line in the file, append it to the string builder
    while((line = reader.readLine()) != null)
    {
        builder.append(line);
    }
    return builder.toString();
}
4

5 回答 5

10

如果你想读取一个有路径的文件,你甚至可以这样做:

List<String> lines = Files.readAllLines(Paths.get("/path/to/your/file"), charset);

注意:需要 Java 7+

于 2012-08-24T16:33:18.213 回答
9

哲学是灵活性之一。使用不同类型的数据流,您可以轻松地从 I/O 源一次读取和写入不同类型的数据,例如字节、文本行或整个用户定义的对象。

来自Java 教程 - I/O 流

I/O 流表示输入源或输出目标。一个流可以表示许多不同类型的源和目标,包括磁盘文件、设备、其他程序和内存阵列。

流支持多种不同类型的数据,包括简单字节、原始数据类型、本地化字符和对象。有些流只是简单地传递数据;其他人以有用的方式操纵和转换数据。

从课程线索课程开始:基本 I/O以获得对 Java I/O 的良好概述。


如果您想查看如何简化 Java 中各种数据类型的 I/O 的具体示例,我建议您查看Sedgewick & Wayne标准库中的In.javaOut.java类。

于 2012-08-24T16:38:42.610 回答
1

好吧,既然你说了两次 InputStream,它实际上只有 3 件事;​​)但这是因为你可以存储不同的东西(序列化对象、图像、文本等),所以它们都有一个共同的基础(InputStream) . 然后,对于基本文本,您有一个新类 BufferedReader 来处理这种特定类型的文件存储/读取。最后,BufferReader 只是为了提高效率;你可能不想要它,所以它是可选的

此外,Johan Sjöberg 是正确的,那里不需要 DataInputStream,只需执行以下操作:

BufferedReader reader   = new BufferedReader(new InputStreamReader(resourceAsStream));
于 2012-08-24T16:28:49.570 回答
0

不必太难,检查Project Lombok:这是通过简单包含单个 jar 文件读取文件的样子:

@Cleanup InputStream in = new FileInputStream("File.txt");
byte[] b = new byte[10000];
while (true) {
 int r = in.read(b);
 if (r == -1) break;
}
于 2012-08-24T16:34:10.313 回答
0

您可以稍微缩短代码,省略不必要的DataInputStream,您可以使用 aFileReader代替:

private static String fileToString(String filename) throws IOException {
    BufferedReader reader   = new BufferedReader(new FileReader(filename));
    StringBuilder builder   = new StringBuilder();
    String line;    
    // For every line in the file, append it to the string builder
    while((line = reader.readLine()) != null)
        builder.append(line);
    return builder.toString();
}

我还在http://rosettacode.org/wiki/Read_entire_file#Java找到了以下单行代码:

new Scanner(new File("foo"), "UTF-8").useDelimiter("\\A").next();
于 2012-08-24T16:45:54.810 回答