InputStream基与字节(一个byte一个byte的读取)读取的输入流,它是java.io包中的一个抽像类
InputStream中定义了如下几个重要的方法,其中有一个read()方法:
int read():这个方法调用会返回流中的下一个字节做为一个byte值,如果流己读到末尾,则会返回-1,即表示流中数据己读完;
注意,此方法返回虽为int型,实际上是从流中读取的一个byte,即8bit,如果要从流中读取一个int型返回,则需要用后面所讲的DataInput对象的readInt()方法,才是读取四个byte,即32位长度;
FileInputStream中InputStream的一个直接字类,可用于构造从文件中读到数据的流,创建一个FileInputStream对象可以使用如下两个常用的构造器:
FileInputStream(File file) :通过一个文件对象做参数构造输入流对象;
FileInputStream(String name):传入一个字符串(文件路径名)构造连结到指定文件的输入流;
public class FileReader extends InputStreamReader用来读取字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是适当的。要自己指定这些值,可以先
在 FileInputStream 上构造一个 InputStreamReader。
FileReader 用于读取字符流。
为了区分按字节与按字符读取的区别,我们做了一个测试,测试按着两种读取方法读取同一个文件所需的时间有什么不同。
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class SaveData {
//字符读取
public void Fileread(){
FileInputStream fis = null;
try {
fis = new FileInputStream("E:/write.txt");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
long time1=System.currentTimeMillis();
try {
while(fis.read()>0){
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
long time2=System.currentTimeMillis();
System.out.println("字节读取共用"+(time2-time1));
}
//字节读取
public void Bread(){
FileReader fr=null;
try {
fr=new FileReader("E:/write.txt");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
long time1=System.currentTimeMillis();
try {
while(fr.read()>0){
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
long time2=System.currentTimeMillis();
System.out.println("字符读取用时间为"+(time2-time1));
}
public static void main(String[] args){
SaveData sd=new SaveData();
try {
sd.Fileread();
sd.Bread();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
由运行结果我们可以看出按字符读取的时间要比按字节读取短近10倍。
不同的方法一定会有他们的区别,我们通过多多的练习会发现他们的不同,了解了他们的区别才会更有效的运用适当的方法。