FileInputStream和FileReader中的read()方法返回的int值有什么不一样?

而且将相同的文件内容读出,分别将返回的int值转换成char类型,结果用字节流读出的中文是乱码,而用字符流读出的中文是正确的。为什么?谁能告诉我?

首先,返回值都是int类型的。读取结果,都是当返回为-1时,表现全部信息读取完毕。
FileInputStream字节流是 以一个一个字节来读。
FileReader字符流是 以一个一个字符来读取的。字节跟字符的不同,去查java相关信息。
乱码问题:是由于 字节流不指定编码方式,取的是系统默认的编码方式。
请看以下程序,可以帮助你:(C盘根目录 建个 test.txt 内容为 java软件开发),运行看结果。

import java.io.FileInputStream;
import java.io.FileReader;
import java.io.InputStreamReader;

public class TestIoReader {
public static void main(String[] args) {
try {
//字符流
FileReader fr = new FileReader("c:\\test.txt");
int flag = -1;
while((flag=fr.read())!=-1){
System.out.print((char)flag);
}
System.out.println();
//字节流 不指定编码。取系统底层编码
InputStreamReader isr = new InputStreamReader(new FileInputStream("c:\\test.txt"));
while((flag = isr.read())!=-1)
{
System.out.print((char)flag);
}
System.out.println();
//编码gb2312
isr = new InputStreamReader(new FileInputStream("c:\\test.txt"),"gb2312");
while((flag = isr.read())!=-1)
{
System.out.print((char)flag);
}
System.out.println();
//编码UTF-8
isr = new InputStreamReader(new FileInputStream("c:\\test.txt"),"UTF-8");
while((flag = isr.read())!=-1)
{
System.out.print((char)flag);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2018-12-10
因为字节流是一个字节一个字节的读,而一个中文是两个字节,所以用字节流读到第一个“软”的时候,他只能读到第一个字节,然后在对应码表里找不到对应的字符就会用“?”代替,而字符流,它的读操作是将字节转换成了字符,就是说它读到“软”的时候,直接把他的码表对应字符读出来,就不会乱码,所以一般读取文本文件的时候,用字符流,如果用字节流可能会出现只读了半个字的情况,出现乱码~
第2个回答  2015-12-09
从输入流中读取字节
int read(); //从输入流中读取单个字节数据(0~255),如到输入流末尾则返回-1
int read(byte b[]); //读多个字节
一、构造方法
FileInputStream(String name); //使用给定的文件名创建对象
FileInputStream(File file); //使用File对象创建FileInputStream对象
二、读取文件
使用文件输入流读取文件
FileInuputStream istream=new FileInputStream("myfile.dat");
或:
File f=new File("myfile.dat");
FileInputStream istream=new FileInputStream(f);
构造方法可能会产生异常IOException,故为了把一个文件输入流对象与一个文件关联起来,需:
try { FileInputStream ins=new FileInputStream("myfile.dat");}
catch (IOException e){ System.out.println("File read error:"+e);}
关闭流
Java在程序结束时自动关闭所有打开的流,但显式关闭任何打开的流是一个好习惯。
close();本回答被网友采纳

FileInputStream和FileReader的区别
FileInputStream 类或者 FileReader 类的构造函数有多个,其中典型的两个分别为:一个使用 File 对象为参数;而另一个使用表示路径的 String 对象作为参数;自己以前一直觉得直接用了 String 指定路径就可以了,一直不明白为什么很多人都先构造一个 File 对象,现在终于明白了,“如果处理文件或者目录名,就...

关于BufferedInputStream和FileInputStream的区别
区别:FileInputStream是字节流,BufferedInputStream是字节缓冲流,使用BufferedInputStream读资源比FileInputStream读取资源的效率高(BufferedInputStream的read方法会读取尽可能多的字节),且FileInputStream对象的read方法会出现阻塞。1、FileInputStream,直接操作本机I\/O,把持着一个文件的句柄,说白了它是面向文...

java 中配置文件路径读取使用FileReader和InputStream区别和用法?
1、从Stream到Reader,Writer的转换类:InputStreamReader, OutputStreamWriter 2、对象输入输出:ObjectInputStream, ObjectOutputStream 3、进程间通信:PipeInputStream, PipeOutputStream, PipeReader, PipeWriter 4、合并输入:SequenceInputStream 5、更特殊的需要:PushbackInputStream, PushbackReader, LineNu...

java中File文件读取的区别和用法
InputStreamReader可以将读如stream转换成字符流方式,是reader和stream之间的桥梁.Reader类及其子类提供的字符流的读取char(16位,unicode编码),inputStream及其子类提供字节流的读取byte(8位),所以FileReader类是将文件按字符流的方式读取,FileInputStream则按字节流的方式读取文件;FileInputStream以字节为...

6 请简述java io中stream流和read流的区别,并分别列举2个常用的strea...
StringBufferInputStream(String) 据指定串创建一个读取数据的输入流串。 注释:不使用 StringBufferInputStream 方法。此类不能将字符正确的转换为字节。 同JDK 1.1 版中的类似,从一个串创建一个流的最佳方法是采用 StringReader 类。 1.3 FileInputStream -- 把一个文件作为 InputStream ,实现对文件的读取操作 cons...

Java中有几种类型的流?
FileInputStream istream=new FileInputStream(“myfile.dat”);} Catch(IOException e){} 从输入流中读取字节 Int read();从输入流中顺序读取源中的单个字节数据,返回字节值(0~255之间的一个整数),如果到达源的末尾,则返回-1 Read方法还可以吧多个字节读入到字节数组中:Int read(byte b...

关于BufferedInputStream和FileInputStream的区别
FileInputStream是字节流,BufferedInputStream是字节缓冲流,使用BufferedInputStream读资源比FileInputStream读取资源的效率高(BufferedInputStream的read方法会读取尽可能多的字节),且FileInputStream对象的read方法会出现阻塞;FileInputStream与FileReader区别:FileInputStream是字节流,FileReader是字符流,用字节流...

java中read()方法的原理是什么?
参数是InputStream的,在方法中,直接把这个参数赋给了变量in。所以FilterInputStream实质上只是对InputStream类做了一个简单的封装,实际调用的方法是在构造方法里传过来的InputStream对象的方法。所以想看read()方法的具体实现,应给去找InputStream类或InputStream类的子类 ...

Java中的FileInputStream,FileOutputStram,BufferedWriter
1、public class FileInputStream extends InputStream FileInputStream 从文件系统中的某个文件中获得输入字节。哪些文件可用取决于主机环境。FileInputStream 用于读取诸如图像数据之类的原始字节流。要读取字符流,请考虑使用 FileReader。2、public class FileOutputStream extends OutputStream 文件输出流是...

不懂JAVA中OutputStreamWriter和InputStreamReader到底有什么用?请教...
FileReader,FileWriter 是读字符的,1个字符是2个字节,16位 OutputStream ,InputStream是读字节的,1个字节是8位 你要是读汉字,一个汉字是2个字节,你用InputStream读就把汉字活生生的拆一半了,自己可以写程序验证下 字符流主要读文本比较效率 字节流主要读二进制文件,图片 ,,,就是为了防止出现...

相似回答