【问题标题】:FileReader combined with BufferedReader or FileInputStreamFileReader 与 BufferedReader 或 FileInputStream 结合使用
【发布时间】:2016-07-15 08:34:05
【问题描述】:

我很困惑什么时候应该使用FileReaderBufferedReader 的组合以及什么时候使用FileInputStream 来读取文件(并输出到日志)?

/**
 * Created by mona on 3/26/16.
 */
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.BufferedReader;
public class FileExample {


    public static void main (String[] args) throws java.io.IOException {

        File newFile = new File("tweet.txt");

        FileWriter fileWriter = new FileWriter(newFile);
        fileWriter.write("Mona Jalal");
        fileWriter.append("\nMona Mona");
        fileWriter.close();
        /*FileReader fileReader = new FileReader(newFile);
        BufferedReader bufferedReader = new BufferedReader(fileReader);
        String line;
        while ((line = bufferedReader.readLine()) != null) {
            System.out.println(line);
        }
        fileReader.close();
        bufferedReader.close();
        */
        FileInputStream fis = new FileInputStream(newFile);
        System.out.println("fis");
        System.out.println(fis.read()); //prints 77
        int content;
        while ((content=fis.read())!=-1){
            System.out.print((char) content);
        }
        fis.close();

    }
}

我正在使用Java 8

【问题讨论】:

  • FileInputStream 将读取一个字节,然后您将其转换为一个字符。 BufferedReader 正在读取整行文本。字节与文本
  • 两者都可以输出相同的东西。就像被注释的部分和未注释的部分都输出相同的东西,这就是为什么我很困惑
  • 他们做同样的事情——更多的是关于效率。原始图像、音频、视频数据将使用 FileInputStream。在您的情况下,您检索文本,因此使用 BufferedReader 会更好

标签: java file bufferedreader filereader fileinputstream


【解决方案1】:

用于读取原始字节:FileInputstream https://docs.oracle.com/javase/7/docs/api/java/io/FileInputStream.html

FileInputStream 从文件系统中的文件获取输入字节。可用的文件取决于主机环境。 FileInputStream 用于读取原始字节流,例如图像数据。要读取字符流,请考虑使用 FileReader。


用于有效地读取字符、数组、行(使用缓冲区) https://docs.oracle.com/javase/7/docs/api/java/io/BufferedReader.html

从字符输入流中读取文本,缓冲字符,以便高效读取字符、数组和行。 可以指定缓冲区大小,也可以使用默认大小。对于大多数用途,默认值足够大。

通常,由 Reader 发出的每个读取请求都会导致对底层字符或字节流发出相应的读取请求。因此,建议将 BufferedReader 包裹在 read() 操作可能成本高昂的任何 Reader 周围,例如 FileReaders 和 InputStreamReaders。例如,

BufferedReader 中 = new BufferedReader(new FileReader("foo.in"));

将缓冲来自指定文件的输入。如果没有缓冲,每次调用 read() 或 readLine() 都可能导致从文件中读取字节,转换为字符,然后返回,这可能非常低效。

Java 有非常好的文档!

【讨论】:

    【解决方案2】:

    Reader 它正在扩展类

    java.io.Reader
        java.io.InputStreamReader
             java.io.FileReader
    

    假设input stream 是一个文本并自动转换为(char)

    InputStream 及其子类

    java.io.InputStream
        java.io.FileInputStream
    

    不做任何假设,只读取字节。

    如果您知道这是一个文本文件 - 请使用 Reader, 如果你不能假设 - 使用InputStream

    【讨论】:

      【解决方案3】:
      public class FileReader    extends InputStreamReader
      

      读取字符文件的便利类。此类的构造函数假定默认字符编码和默认字节缓冲区大小是适当的。要自己指定这些值,请在 FileInputStream 上构造一个 InputStreamReader。

      FileReader 用于读取字符流。要读取原始字节流,请考虑使用FileInputStream.

      public class BufferedReader extends Reader
      

      从字符输入流中读取文本,缓冲字符,以便高效读取字符、数组和行。 可以指定缓冲区大小,也可以使用默认大小。对于大多数用途,默认值足够大。

      通常,由 Reader 发出的每个读取请求都会导致对底层字符或字节流发出相应的读取请求。因此,建议将 BufferedReader 包裹在 read() 操作可能成本高昂的任何 Reader 周围,例如 FileReaders 和 InputStreamReaders。例如,

       BufferedReader in  = new BufferedReader(new FileReader("foo.in"));
      

      将缓冲来自指定文件的输入。如果没有缓冲,每次调用 read() 或 readLine() 都可能导致从文件中读取字节,转换为字符,然后返回,这可能非常低效。 使用 DataInputStreams 进行文本输入的程序可以通过将每个 DataInputStream 替换为适当的 BufferedReader.

      来本地化

      【讨论】:

      猜你喜欢
      • 2011-07-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-04
      • 2023-04-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多