FileInputStream和FileReader中的read()方法返回的int值有什么不一样? 5
而且将相同的文件内容读出,分别将返回的int值转换成char类型,结果用字节流读出的中文是乱码,而用字符流读出的中文是正确的。为什么?谁能告诉我?...
而且将相同的文件内容读出,分别将返回的int值转换成char类型,结果用字节流读出的中文是乱码,而用字符流读出的中文是正确的。为什么?谁能告诉我?
展开
3个回答
展开全部
首先,返回值都是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();
}
}
}
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();
}
}
}
展开全部
因为字节流是一个字节一个字节的读,而一个中文是两个字节,所以用字节流读到第一个“软”的时候,他只能读到第一个字节,然后在对应码表里找不到对应的字符就会用“?”代替,而字符流,它的读操作是将字节转换成了字符,就是说它读到“软”的时候,直接把他的码表对应字符读出来,就不会乱码,所以一般读取文本文件的时候,用字符流,如果用字节流可能会出现只读了半个字的情况,出现乱码~
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
2015-12-09 · 做真实的自己 用良心做教育
千锋教育
千锋教育专注HTML5大前端、JavaEE、Python、人工智能、UI&UE、云计算、全栈软件测试、大数据、物联网+嵌入式、Unity游戏开发、网络安全、互联网营销、Go语言等培训教育。
向TA提问
关注
展开全部
从输入流中读取字节
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();
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();
本回答被网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询