2012-02-27 36 views
1

我知道正确的做法是是否可以使用FileReader从文件读取?

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(); 
    } 
} 

回答

5

正在发生的事情是这样的 -

fr.read()将返回一个整数,而不是一个角色,虽然返回的整数是该字符等效的ASCII码。

当您调用该整数的String.valueOf()时,将调用String.valueOf(int i)方法,而不是您希望调用的String.valueOf(char c)方法,因此它以字符串形式返回ASCII值,而不是以字符串形式显示字符值。

因此,不是,尝试

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

几乎 - 整数不是ASCII值,FileReader使用平台的默认编码。 – 2012-02-27 01:02:08

+0

好的,有什么区别? – CodeBlue 2012-02-27 01:03:15

+1

那么,如果文件是用普通的7位ASCII字符编写的,那么就没有区别。但是,如果文本编辑器使用latin1编写它,fr.read()将返回一些不是有效ASCII码的int。 (或者它可能会返回废话,如果'Charset.defaultCharset()'是类似于UTF-8) – 2012-02-27 01:13:21

1

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

Reader原因的read不只是返回char是使用int让它使用-1代表档案结尾。

2

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

+1

的InputStream读取字节,一个阅读器读取字符。 (令人困惑的是它们都被编码为整数)。这就是为什么InputStreamReader需要一个字符集;只将字节视为字符是不正确的,尽管它可以用于ASCII。你不想从Reader中建立一个字节数组并调用'new String(byte [])';你会建立一个字符数组并调用'new String(char [])'。 – 2012-02-27 02:52:07

相关问题