关于IO中的read()方法

hy158753228 2009-09-07 09:26:14
今天复习IO中的知识时发现一个问题有点怪异,哪位帮忙解释下,问题如下:
FileReader和FileInputStream中的read()方法分别是读取文件中的一个字符(2字节)和一个字节的方法。我写了个例子程序,运行时发现FileInputSteam下的一个字节在FileReader中被当作一个字符了,难道是read()在做怪?!
下面是程序:
import java.io.*;

public class TestFileInputStream {
public static void main(String [] args) {
FileInputStream fis = null;
int c = 0;
int num = 0;
try {
fis = new FileInputStream("E://JAVA//2009//09//123.txt");
while((c=fis.read())!=-1) {
num++;
System.out.print((char)c);
}
System.out.println("\n"+"Read "+num+" byte .");
fis.close();
}
catch(FileNotFoundException e) {
System.out.println("File not found !"+e.toString());
}
catch(IOException e) {
System.out.println("Read file error !"+e.toString());
}
}
}


我的123.txt文件中写的是“123中”
上面文件编译运行输出:
123??
Read 5 byte .
然后我将源文件中的FileInputStream 改成对应的FileReader ,打印语句中的“byte”改成“character”
文件编译运行输出:
123中
Read 4 character

问题就在于,对于同一个文件中的“123”,FileInputStream把其中的每个当作了一个字节,而FileRead却当作了一个字符!不解。
...全文
158 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
sjkof 2009-09-07
  • 打赏
  • 举报
回复
字符不是固定大小的,由单字节字符,双字节字符等等
gesanri 2009-09-07
  • 打赏
  • 举报
回复
啊,说错了,c是char类型的,1个char占2个字节,但你读出来只计数1,因为你的程序是一个字符一个字符读的
closewbq 2009-09-07
  • 打赏
  • 举报
回复
一点问题也没有。
gesanri 2009-09-07
  • 打赏
  • 举报
回复

public class Test4{
public static void main(String[] args)throws Exception{
char c = '中';
byte b[] = "中".getBytes();
System.out.println(b.length);
}
}

这里c为1个字节毋庸置疑,b[]就是2个字节了
hy158753228 2009-09-07
  • 打赏
  • 举报
回复
java.io.Reader 和 java.io.InputStream 组成了 Java 输入类。Reader 用于读入16位字符,也就是 Unicode 编码的字符;而 InputStream 用于读入 ASCII 字符和二进制数据。


清楚了,看来是我想多了,也想晕了.我目光就盯在了那一个文件"123.txt"中了.见笑了!
justinavril 2009-09-07
  • 打赏
  • 举报
回复
没错啊 “中”是1个字符啊,是2个byte啊。你想说什么啊...字符跟字节本来就不是一个东西啊...
Chuyun130 2009-09-07
  • 打赏
  • 举报
回复
Stream读字节,Reader读字符

java.io.Reader 和 java.io.InputStream 组成了 Java 输入类。Reader 用于读入16位字符,也就是 Unicode 编码的字符;而 InputStream 用于读入 ASCII 字符和二进制数据。
在 Java 中,有不同类型的 Reader 输入流对应于不同的数据源: FileReader 用于从文件输入;
CharArrayReader 用于从程序中的字符数组输入; StringReader 用于从程序中的字符串输入;
PipedReader 用于读取从另一个线程中的 PipedWriter 写入管道的数据。
相 应的也有不同类型的 InputStream 输入流对应于不同的数据源:FileInputStream,ByteArrayInputStream, StringBufferInputStream,

62,614

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧