首先,返回值都是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();
}
}
}
因为字节流是一个字节一个字节的读,而一个中文是两个字节,所以用字节流读到第一个“软”的时候,他只能读到第一个字节,然后在对应码表里找不到对应的字符就会用“?”代替,而字符流,它的读操作是将字节转换成了字符,就是说它读到“软”的时候,直接把他的码表对应字符读出来,就不会乱码,所以一般读取文本文件的时候,用字符流,如果用字节流可能会出现只读了半个字的情况,出现乱码~
从输入流中读取字节
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();