一、IO流的框架
1.IO流的概述
- IO流用来处理设备之间的数据传输
- Java对数据的操作是通过流的方式
- Java用于操作流的类都在IO包中
2.IO流的分类
- 流按流向分:输入流、输出流
- 流按操作类型分为两种:
- 字节流:字节流可以操作任何数据,因为在计算机中任何数据都是以字节的形式储存的
- 字符流:字符流只能操作纯字符数据,比较方便
3.IO流的常用父类
- 字节流的抽象父类
- InputStream
- OutputStream
- 字符流的抽象父类
- Reader
- Writer
4.IO流程序的书写
- 使用前:导入IO包中的类
- 使用时:进行IO异常处理
- 使用后:释放资源,关闭流
5.IO流(FileInputStream)
-
read()
:一次读取一个字节
public class Demo {
public static void main(String[] args) throws IOException {
//创建流对象
FileInputStream fis=new FileInputStream("/Users/xiayubao/IDEA/springboot-quick/src/main/java/com/stram/xxx.txt");
//从硬盘上读取一个字节
int x=fis.read();
System.out.println(x);
int y=fis.read();
System.out.println(y);
int z=fis.read();
System.out.println(z);
int a=fis.read();
System.out.println(a);
int b=fis.read();
System.out.println(b);
//关闭流。释放资源
fis.close();
}
}
输出:
97
98
99
-1
-1
代码优化:
public class Demo {
public static void main(String[] args) throws IOException {
//创建流对象
FileInputStream fis = new FileInputStream("/Users/xiayubao/IDEA/springboot-quick/src/main/java/com/stram/xxx.txt");
//定义变量,记录每次读到的字节
int b;
//将每次读到的字节赋值给b并判断是否是-1
while ((b = fis.read()) != -1) {
//打印每一个字节
System.out.println(b);
}
//关闭流。释放资源
fis.close();
}
}
输出:
97
98
99
6.Read()方法返回值类型为什么是int
- read()方法读取的是一个字节,为什么返回是int,而不是byte
- 因为字节输入流可以操作任意类型的文件,比如图片音频等,这些文件底层都是以二进制形式的存储的,如果每次读取都返回byte,有可能在读到中间的时候遇到111111111
- 那么这11111111是byte类型的-1,我们的程序是遇到-1就会停止不读了,后面的数据就读不到了,所以在读取的时候用int类型接收,如果11111111会在其前面补上
- 24个0凑足4个字节,那么byte类型的-1就变成int类型的255了这样可以保证整个数据读完,而结束标记的-1就是int类型
7.FileOutputStream
-
write()
一次写出一个字节
public class Demo {
public static void main(String[] args) throws IOException {
//创建字节输出流对象
FileOutputStream fos = new FileOutputStream("/Users/xiayubao/IDEA/springboot-quick/src/main/java/com/stram/xxx.txt");
//虽然写出的是一个int数,但是在写出的时候会将前面24个0去掉,所以写出的是一个byte
fos.write(97);
fos.write(98);
fos.write(99);
//关闭流。释放资源
fos.close();
}
}
写入:abc
8.IO流标准输入输出格式
public class Demo {
public static void main(String[] args) throws IOException {
//创建输入流对象,关联xxx.txt
FileInputStream fis = new FileInputStream("xxx.txt");
//创建输出流对象,关联zzz.txt
FileOutputStream fos = new FileOutputStream("xxx.txt");
int b;
while ((b = fis.read()) != -1) {
fos.write(b);
}
fis.close();
fos.close();
}
}
9.字节数组拷贝之available()方法