前言
在Java程序中,数据的输入和输出操作以“流”(stream)的方式进行,Java语言提供了各种各样的“流”类来获取不同种类的数据。
我习惯把流分为四大类:
字节流 | 字符流 | |
---|---|---|
输入流 | InputStream | Reader |
输出流 | OutPutStream | Writer |
今天我们先来看输入流中的字节流,即字节输入流
一、InputStream
InputStream抽象类是所有字节输入流的超类,作用是将数据从文件中读取出来。
这里有一个问题,为什么是从文件中读取数据,而不是直接从电脑磁盘中读取呢?
这是因为程序并不能直接操作磁盘文件,只能操作文件缓冲区里的数据,所以我们需要先将文件从磁盘加载到内存中的文件缓冲区。
InPutStream的直接子类有:
FileInputStream
FilterInputStream
ByteArrayInputStream
等等
我们今天主要学习FileInputStream
二、FileInputStream(字节输入流)
从文件系统中的文件获取输入字节。 什么文件可用取决于主机环境。
用于读取二进制文件,如图片、音频、视频 等。每次读取一个字节
构造方法
通过打开与实际文件的连接创建一个FileInoutStream,该文件由File对象file命名。
FileInputStream(File file)
//例如
File file=new File("one.text");
FileInputStream fism=new FileInputStream(file);
通过打开与实际文件的连接创建一个FileInoutStream,该文件由文件系统中的路径名name名字。
FileInputStream(String name)
//例如
File file=new File("one.text");
FileInputStream fism1=new FileInputStream("one.text");
创建 FileInputStream通过使用文件描述符 fdObj ,其表示在文件系统中的现有连接到一个实际的文件。
FileInputStream(FileDescriptor fdObj)
文件描述符 fdObj
是一个用来标识正在被进程使用的文件或者I/O设备的整数值。在操作系统中,每个打开的文件都会被分配一个唯一的文件描述符,用于访问和操作该文件。
由于文件描述符是操作系统层面的概念,在集成开发环境中不能直接查询某文件的文件描述符,在idea里可以通过下面的方法获取文件描述符。
FileInputStream fism1=new FileInputStream("src/one.text");
try {
FileDescriptor fd=fism1.getFD();
int fdValue=fd.hashCode();//hashCode()方法获得文件描述符的整数值
System.out.println("该文件的文件描述符为:"+fdValue);
} catch (IOException e) {
e.printStackTrace();
}
结果:
2.常用方法
FileInputStream fism1=new FileInputStream("src/one.text");
//1、返回与此文件输入流相关联的唯一的FileChannel对象。
FileChannel fich=fism1.getChannel();
try {
//2、从该输入流读取一个字节的数据
int byye=fism1.read();
//3、从该输入流读取最多b.length个字节的数据为字节数组。
byte[]bytes=new byte[10];
int count=0;
while ((count=fism1.read(bytes))!=-1){
System.out.println(new String(bytes,0,count));
}
} catch (IOException e) {
e.printStackTrace();
}
//4、关流
fism1.close();