【问题标题】:Is it possible read from a file using only FileReader?是否可以仅使用 FileReader 从文件中读取?
【发布时间】:2012-02-27 00:43:28
【问题描述】:

我知道正确的做法是

BufferedReader br = new BufferedReader(FileReader(file));

但我在 Java API 中检查了 FileReader 类的方法,它有一个 read() 方法返回读取的字符。但这对我不起作用。我正在读取包含以下文本行的文件:“我正在读取文件”,并将其打印到屏幕上,但是当我运行程序时,它会为每个字符打印等效的 ASCII 代码。

这是我的代码:

String lectura = "";
try{
    lectura = String.valueOf(fr.read());
} catch(IOException ioex){
    ioex.printStackTrace();
}

while((Integer.parseInt(lectura)) != -1){
    System.out.print(lectura);
    try{
        lectura = String.valueOf(fr.read());
    } catch(IOException ioex){
        ioex.printStackTrace();
    }
}

【问题讨论】:

    标签: java filereader


    【解决方案1】:

    这是怎么回事——

    fr.read() 返回的是整数而不是字符,尽管返回的整数是该字符的等效 ASCII 码。

    当您对该整数调用 String.valueOf() 时,会调用 String.valueOf(int i) 方法,而不是您期望调用的 String.valueOf(char c) 方法,因此它会返回ASCII 值作为字符串,而不是字符值作为字符串。

    那就试试吧

        lectura = String.valueOf( (char) (fr.read()) );
    

    【讨论】:

    • 几乎——整数不是 ASCII 值,FileReader 使用平台的默认编码。
    • 好吧,如果文件是用普通的 7 位 ASCII 字符编写的,则没有区别。但是,如果文本编辑器使用 latin1 编写它,例如 fr.read() 将返回一些不是有效 ASCII 代码的 int。 (或者它可能会返回废话,如果 Charset.defaultCharset() 类似于 UTF-8。)
    • 好的,但是现在我在停止阅读 cicle 时遇到了麻烦,因为我使用 while(Integer.parseInt(lectura) != -1) 执行此操作,当 lectura 的值不是数字时,我得到一个 NumberFormatException仅在到达文件末尾时发生。
    • @Aikanáro 您需要检查fr.read() 没有返回-1,如果返回,请停止而不更改lectura
    • 好吧,这就是我所做的:
      while(true){if(fr.read() == -1) break; else lectura = String.valueOf((char)fr.read())}
    【解决方案2】:

    这是预期的行为,文本存储为字节,每个字节都有字符的 ASCII 值。您可以将这些字节收集到一个字节数组中,然后使用 new String(array);将它们转换为字符串。或者您可以转换为 char 以转换单个字符。

    【讨论】:

    • 一个 InputStream 读取字节,一个 Reader 读取字符。 (令人困惑的是两者都被编码为整数。)这就是 InputStreamReader 需要 Charset 的原因。将字节视为字符是不正确的,尽管它适用于 ASCII。您不想从 Reader 构建字节数组并调用 new String(byte[]);您将构建一个字符数组并调用new String(char[])
    【解决方案3】:

    FileReader 的read 返回一个int。您只需要将其转换为 char

    Readerread 不只是返回char 的原因是使用int 让它使用-1 来表示文件结束。

    【讨论】:

      猜你喜欢
      • 2018-10-24
      • 2017-12-01
      • 2011-06-29
      • 2018-11-14
      • 2020-09-21
      • 2019-07-04
      • 1970-01-01
      • 2012-09-04
      • 2017-01-04
      相关资源
      最近更新 更多