I: input 输入
O:output 输出
java中的基本流有:
类型:字节流和字符流
字节流:在传输数据时使用的处理数据的单位是字节的IO流叫做字节流
流向:输入流 和输出流
IO流的使用流程:
1. 导入资源
2. 创建IO流对象 和对异常的处理
3. 调用类中定义好的数据处理
4.关闭流资源(一般实在finally中关闭)
InputSteam:字节输入流
概述:
所有字节输入流的父类,为抽象类。内部定义了所有字节输入数据的相关功能,但是自己不能使用,需要子类对象调用。
常用方法:
1. int read() //默认一次读取一个字节
2. int read(byte[] bytes) //使用指定大小的字节数组去读取字节内容金内存,每次读取指定字节数组的的大小的字节。每次都是从头加入
3. int avaliable() //获取未读取的剩下的字节个数
4. close()//关闭流对象方法
常见子类:
FileInputStream:
构造:FileInputSteam(File file)
FileInputSteam(String path)
OutputStream: 字节输出流
概述:
是所有字节输出流的顶层父类,也是一个父类,定义了输出传输数据出内存的相关功能,但是不能创建对象,因此只能用其子类调用方法。
常用方法:
1. void write(int b):每次内存写出一个字节到目标文件中
2. void write(byte[] arr):每次写出指定字节数组中的所有字节内容到目标文件
3. void write(byte[] arr, int offset, int len):每次写出指定字节数组中的指定长度内容到目标文件
4. void close():关闭流资源
常见子类:
FileOutputStream:
构造:
FileOutputStream(File file)
FileOutputStream(String path)
注意:
1. 字节输出流对象创建的时候指定的目标文件不存在会自动创建文件(前提是文件所在的目录是真实存在的)
2. 字节输出流对象创建的时候指定的目标文件存在,会对已存在的文件进行格式化
追加续写功能:(想要不格式化原文件)
FileOutputStream(File file, boolean b)
FileOutputStream(String path, boolean b)
文件拷贝
把一个指定的文件复制带指定的另一个路径文件中,要把复制的文件中的所有数据 复制一份到另一个路径文件中,硬盘之间不能直接数据交互,需要使用内存作为中转站
分析:
硬盘A的数据需要先通过输入流读取到内存中,内存通过输出流把读到的内容写到硬盘B中,读取的时候不能保证一次性读取完毕,需要多次读取,多次读取每个下一次读取需要及时把上一次的读取的内容写到目标文件中,否则会出现数据丢失
一边读取一边及时的写出 使用循环实现,当所有的数据读取完毕结束写出来的过程
读取完毕:
1. avaliable方法返回值为0
2. read方法返回-1,表示文件读取到最后了
package com.loop.demo;
import java.io.*;
public class FileCopyDemo {
public static void main(String[] args) {
/*File file2 = new File("Demo20220308/test02");
file2.mkdir();*/
FileCopyDemo copyDemo = new FileCopyDemo();
copyDemo.fileCopy();
}
/**
* 文件copy
*/
public void fileCopy(){
File file1 = new File("Demo20220308/test01/a.txt");
File file2 = new File("Demo20220308/test02/a.txt");
FileInputStream inputStream1 = null;
FileOutputStream outputStream2 = null;
try {
inputStream1 = new FileInputStream(file1);
outputStream2 = new FileOutputStream(file2);
// copyAndPaste(inputStream1, outputStream2);
copyAndPaste1(inputStream1, outputStream2);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 复制方法1 使用 available来作为循环条件使用数组来进行读取写入
* @param inputStream1
* @param outputStream2
* @throws IOException
*/
public void copyAndPaste1(FileInputStream inputStream1, FileOutputStream outputStream2) throws IOException {
byte[] bytes = new byte[1024 * 8];
while (true){
if (inputStream1.available()==0){
break;
}
int read = inputStream1.read(bytes);
outputStream2.write(bytes,0,read);
}
}
/**
* 复制方法2 使用 available来作为循环条件
* @param inputStream1
* @param outputStream2
*/
public void copyAndPaste(FileInputStream inputStream1, FileOutputStream outputStream2){
while (true){
try {
if (!(inputStream1.available()>0)) break;
outputStream2.write(inputStream1.read());
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
字节缓冲流【字节高效率】
概述:
就是用来对字节流进行效率提高的一个流,这个流本身没有读写的功能,他的读写都是内部修饰的字节流来读写的,字节缓冲流使用前提是必须有字节流
作用:
就是对字节流进行修饰提效的
分类:
BufferedOutputStream 字节输出缓冲流
BufferedInputStream 字节输入缓冲流
普通功能:
内部的字节流功能
字节输出缓冲流的特有方法:
flush():刷新缓冲区
flush方法和close方法的区别:
1. flush方法只是用来刷新字节缓冲流的缓冲区域的内容的,方法调用之后对象还存在可以继续使用
2. close 方法用来关闭流对象,默认先flush后close
字符流
概述:
对文件进行读写过程中会有以下情形:
1. 文件全部都是英文使用字节流读写没有问题的
2. 文件中全中文使用字节流读写可能会发生问题
【中文在不同的编码集中有不同的字节数,读写的时候对读取的字节数有要求】
3. 文件中是中英文混合的字节流读取绝对会出现问题
解决思路:
当读写的时候如果可以去判断是中文还是英文,是中文对应使用对应字节数去读取,英文使用一个字节去读取,这样就不会乱了jdk把判断进行整理并设计出字符流
结论:
字符流只能操作有文字的文件【纯文本文件】,不能操作非纯文本文件【图片,视频,视频等】
使用场景:
操作数据的过程中需要查看数据,数据需要转变为文字【解码】,字节流有可能乱码,这种情况下使用在字符集
概念:
编码:把计算机中存放的数字【编码】转变为对应的编码集中的字符【数组变文字】就是解码
中文为什么会乱码?
中文在编码和解码时使用的编码集不一致
字符流的操作原理:
输入流:
先把字节从文件中读取出来,根据文件的编码集把字节数变为对应的字符,把字符读取到内存中【解码的过程】
输出流:
先把输出的内容以字符形式写出,把字符根据流中的编码集变成字节流,在把字节写到目标文件【编码的过程】
分类
字符输入流
字符输出流
Reader【字符输入流】
概述:
在读取文件时对数据操作使用单位是字符的输入流就是字符输入流
是字符输入的底层父类,抽象类,定义字符输入的流的共性功能,想要使用找他的子类,不一样的设备子类就不一样 使用典型子类FileReader
共性功能:
read():一次读取一个字符 返回值是读到的字符
read(char[] ch):一次读取多个字符 返回字是读到的有效字符的个数
close():关闭流资源
FileReader
概述:
是Reader的子类(子孙类),负责内存和磁盘之间的字符的读取交互的流,他没有自己的功能,其功能就是Reader提供的功能
Writer【字符输入流】
概述:
在读取文件时对数据操作使用单位是字符的输出流就是字符输出流
是字符输入的底层父类,抽象类,定义字符输入的流的共性功能,想要使用找他的子类,不一样的设备子类就不一样 使用典型子类FileWriter
共性功能:
write():一次写入一个字符 返回值是读到的字符
write(char[] ch):一次写入多个字符
close():关闭流资源
FileWriter
概述:
是Writer的子类(子孙类),负责内存和磁盘之间的字符的读取交互的流,他没有自己的功能,其功能就是Writer提供的功能