缓冲读卡器与扫描仪,FileInputStream与FileReader?

时间:2014-11-26 19:27:40

标签: java android

有人可以向我解释为什么我可以将FileInputStream或FileReader用于BufferedReader?有什么区别?与此同时,扫描仪优于BufferedReader的优势是什么。我正在阅读它有助于标记化,但这意味着什么?

3 个答案:

答案 0 :(得分:12)

try {
    //Simple reading of bytes
    FileInputStream fileInputStream = new FileInputStream("path to file");
    byte[] arr = new byte[1024];
    int actualBytesRead = fileInputStream.read(arr, 0, arr.length);

    //Can read characters and lines now
    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(fileInputStream));
    String lineRead = bufferedReader.readLine();
    char [] charArrr = new char[1024];
    int actulCharsRead = bufferedReader.read(charArrr, 0, charArrr.length);

    //File reader allows reading of characters from a file
    FileReader fileReader = new FileReader("path to file");
    actulCharsRead = fileReader.read(charArrr, 0, charArrr.length);

    //It is a good idea to wrap a bufferedReader around a fileReader
    BufferedReader betterFileReader = new BufferedReader(new FileReader(""));
    lineRead = betterFileReader.readLine();
    actulCharsRead = betterFileReader.read(charArrr, 0, charArrr.length);

    //allows reading int, long, short, byte, line etc. Scanner tends to be very slow
    Scanner scanner = new Scanner("path to file");
    //can also give inputStream as source
    scanner = new Scanner(System.in);
    long valueRead = scanner.nextLong();

    //might wanna check out javadoc for more info

} catch (IOException e) {
    e.printStackTrace();
}

答案 1 :(得分:3)

德克斯特的答案已经有用了,但是一些额外的解释可能仍然有用:

在genereal中: InputStream仅提供对源的字节数据的访问。 Reader可以包裹在流中并添加适当的文本编码,因此您现在可以读取字符。 BufferedReader可以围绕Reader进行缓冲操作,因此每次调用不是一个字节,而是一次读取一堆,从而减少系统调用并在大多数情况下提高性能。

对于文件:

FileInputStream是从文件中读取数据的最基本方法。 如果您不想自己处理文本编码,可以将其包装到InputStreamReader中,该InputStreamReader可以包装到BufferedReader中。 或者,您可以使用FilerReader,它应该与FileInputStream + InputStreamReader基本相同。

现在,如果您不想只读取任意文本,但只读取特定数据类型(int,long,double,...)或正则表达式,则Scanner非常有用。但如上所述,它将为构建这些表达式增加一些开销,因此只在需要时使用它。

答案 2 :(得分:0)

在Java 8中引入Files.lines。这支持足够简单的文件操作来减轻至少一些Perl嫉妒: - )

File.lines(Path.path("input.txt"))
    .filter(line -> line.startsWith("ERROR:"))
    .map(String::toUpperCase).forEach(System.out::println);