java进阶笔记九(IO流/FileInputStream/FileOutputStream/复制文件)
观看B站java老师视频记的笔记,【Java零基础教程视频(适合Java 0基础,Java初学入门)-哔哩哔哩】 https://b23.tv/PoMKCxO,视频地址有需要的可以去视频学习,并给这个老师一键三连哟~
一、IO流
二、流分类
1按流的流向分
(1)从内存流出,output,写
(2)流入内存,input,读
2按读取数据方式分
(1)字节读取,类型不受限制(输入流、输出流)
(2)字符读取,普通文本文件(字节流、字符流)
三、java流掌握
(1)new流对象
(2)调用流对象的读和写
四、java流四大家族
java.io.InputStream字节输入流
java.io.OutputStream字节输出流
java.io.Reader字符输入流
java.io.Writer字符输入流
结尾有stream的是字节流,Reader/Writer是字符流,都是抽象类。
注:
(1)java.io.closeable接口都是可关闭的,都有close()方法,流使用完一定要关闭,避免占用资源。
(2)所有输出流都实现了java.io.Flushable,都是可刷新的,有flush()方法,将未输出的数据强行输出完(清空管道),输出流在最终输出后,一定要刷新。
文件专属
java.io.FileInputStream
java.io.FileOutputStream
FileReader
FileWriter
转换流(字节流转字符流)
InputStreamReader
OutputStreamWriter
缓冲流
BufferedInputStream
BufferedOutputStream
BufferedReader
BufferedWriter
数据流
DataInputStream (可以把数据的类型一起读,比如:int a,会把int一起除了)
DataOutputStream(可以把数据的类型一起写)
标准输出流
PrintStream
PrintWriter
对象专属
ObjectInputStream
ObjectOutputStream
五、还剩余可读字节量available()
六、跳过skip,eg:file1.skip(3);
七、FileOutputStream注意append
/*
* 字节流,out,流出内存,写
*/
public class FileOutputStreamTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
FileOutputStream file1 = null;
// 创建
try {
byte[] byte1 = {97,98,99,100};
// true是append的值,如果不加append,会把整个文件清空,如果加了会在原文件后面写入
file1 = new FileOutputStream("/home/hanware/桌面/1.txt", true);
try {
// 会先删除内容,再写入
file1.write(byte1);
file1.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
try {
file1.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
八、复制文件,使用读fileInputStream和写fileOutStream一起实现
/*
* 文件复制
* 一边读,一边写入
*/
public class CopyTest {
public static void main(String[] args) {
// TODO Auto-generated method stub
FileInputStream fileInputStream = null;
FileOutputStream fileOutStream = null;
// 建读的
try {
fileInputStream = new FileInputStream("/home/hanware/桌面/1.txt");
fileOutStream = new FileOutputStream("/home/hanware/桌面/2.txt", true);
int readCont = 0;
byte [] bytes = new byte[10*1024];
while ((readCont = fileInputStream.read(bytes)) != -1) {
fileOutStream.write(bytes,0, readCont);
}
// 输出完要刷新
fileOutStream.flush();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
// 分开try,不要一起try
if (fileOutStream != null) {
try {
fileInputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (fileInputStream != null) {
try {
fileInputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
九、BufferedReader、BufferedWriter缓冲区
1、不用指定bytes数组,直接传入流
2、传入的流叫节点流,外面的叫处理流、包装流
3、当入参不满足要求时,可以使用InputStreamReader/OutputStreamWriter进行转换
4、关闭只需要关闭最外面的流。
十、标准输出流PrintStream
1、system.out.print就是。
2、system.setOut改变输出的文件,应用:日志输出工具输出到日志文件。
十一、file常用的方法
十二、序列化和反序列化
1、序列化,内存里的拆分成一块块的放到硬盘ObjectOutputStream
2、反序列化,硬盘里的组装到内存ObjectInputStream
3、参与序列化和反序列化的对象,必须实现Serializable接口,java虚拟机看到后会自动生成个序列化版本号。
4、序列化writeObject,序列化多个,放到集合里循坏,反序列化readObject。
5、transient关键字:游离的,不参加序列化。
// 表示i是游离的,不参加序列化
transient int i;
6、序列化版本号作用:用来区分类,不用自动生成的序列号,手动生成固定的