java进阶笔记九(IO流/FileInputStream/FileOutputStream/复制文件)

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、序列化版本号作用:用来区分类,不用自动生成的序列号,手动生成固定的

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值