FileinputStream是inputstream的一个子类,是字节输入流,有read(E)方法来实现从磁盘中读取文件。
eg:public class FileInputStream extends InputStream{}
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
public class Damo01 {
public static void main(String[] args) {
try (InputStream file = new FileInputStream("F:\\qq\\新建文件夹\\250.txt")) {
//文件中内容为250000
System.out.println((char)file.read());//读取文件中第一个字节
} catch (IOException e) {
e.printStackTrace();
}
}
}
输出结果为:
2
同时为了提高读取效率,fileinputStream还重载了read(byte[] bt)方法,定义一个字节数组作为就缓冲区,read()方法会尽可能的读取字节到缓冲区,但不会超过缓冲区大小,然后返回实际读取的多少个字节,即缓存读取
eg:public class BufferedInputStream extends FilterInputStream {}
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
public class Damo01 {
public static void main(String[] args) {
try (InputStream file = new FileInputStream("F:\\qq\\新建文件夹\\521.txt")) {
int len = -1;
//定义1000个字节的缓冲区
byte[] bt= new byte[1000];
while ((len=file.read(bt))!=-1) {
System.out.printf("读取到%d个\n",len);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
输出结果为:
读取到1000个
读取到1000个
读取到1000个
读取到1000个
读取到941个
BufferedinputStream是fileinputStream的一个子类,同时也是fileinputStream的一个装饰,虽然bufferedinputStream也有缓存读取,但与fileinputStream不同的是bufferedinputStream的缓存读取是在底层维护了一片缓冲区,它存在于内存中,其大小为8192个字节,然后每次读取时是从缓冲区,即内存中直接读取内容。
import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.IOException;
public class Damo02 {
public static void main(String[] args) {
try (BufferedInputStream f1 = new BufferedInputStream(new FileInputStream("F:\\qq\\新建文件夹\\521.txt"))) {
byte[] bt = new byte[1000];
int len =-1;
while ((len=f1.read(bt))!=-1) {
System.out.printf("读取到%d个\n",len);;
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
输出结果为:
读取到1000个
读取到1000个
读取到1000个
读取到1000个
读取到941个
大致一看述代码,似乎与fileinputStream的代码相似,然而却大有不同,fileinputStream是以文件地址作为参数,读取时是从磁盘上读取字节,而bufferedStream是以莫非输入流作为参数,其会将该输出流数据分批读取,每次读取一部分数据到到缓冲区,缓冲区的数据被读完,在读取数据到缓冲区。这种读取的方法,比从直接从磁盘上读取快的多。