Day19 转换流、缓冲流、序列化、打印流

转换流

处理流,需要传入节点流

OutputStreamWriter

字节输出流转为字符输出流

		// 字节输出流
		FileOutputStream fos = new FileOutputStream("D:\\123.txt");
		// 转换为字符流
		OutputStreamWriter osw = new OutputStreamWriter(fos);
		osw.write("xxxxxxxxxxxxx");
		osw.flush();
		// osw 关闭后 会自动把 fos也关闭
		osw.close();

InputStreamReader

字节输入流转为字符输入流
InputStreamReader(InputStream in)
InputStreamReader(InputStream in , Charset cs) //指定字符集
InputStreamReader(InputStream in , CharsetDecoder dec) //指定字符集解码器
void close()
String getEncoding()
int read()
int read(char[] char , int start , int length)
boolean ready()
先开启的流后关闭

缓冲流

Day19 转换流、缓冲流、序列化、打印流_第1张图片

BufferedReader

字符输入缓冲流
作用 : 提供效率,把输入和输出先保存到缓冲区,然后一次写入/写出

		// 字节流
				FileInputStream fis = new FileInputStream("./src/com/Test_01.java");
				// 转换为字符
				InputStreamReader isr = new InputStreamReader(fis);
				// 字符缓冲流
				BufferedReader br = new BufferedReader(isr);
				){
     
			
			String temp = null;
			while ((temp=br.readLine()) != null) {
     
				System.out.println(temp);
			}

BufferedWriter

			bw.write("anisa萨迪克");
			// 写出换行
			bw.newLine();
			bw.write("anisa萨迪克");
			// 刷缓存
			bw.flush();

打印流

打印流默认指向控制台

// 使用system中打印流,默认打印控制台
		System.out.println("Hello");
		PrintStream out  = System.out;
		out.println("java.....");
		
		// 自己创建打印流
		FileOutputStream fos = new FileOutputStream("D:/log.txt");
		// 创建打印流,方便输出操作
		PrintStream ou1 = new PrintStream(fos);
		// 使用原始的字节输出流,操作麻烦,并且类型受限
		fos.write("开始执行...".getBytes());
		// 打印流中,封装了操作,使操作更加方便,另外有很多print方法重载,支持所有类型
		ou1.println("开始执行.....");
		ou1.println(true);
		ou1.println(1);
		ou1.println(1.2);
		
		// System 提供了 设置 out打印路径的方法
		System.setOut(ou1);
		// 下面所有的打印语句,都是向指定文件打印
		System.out.println("xxxxxxxxxxxxxxxxxx");

文件复制

先输入再输出
输入和输出 目录不能一致

// 默认是覆盖写入,当创建输出流对象的时候,由于是覆盖写入,会直接把对应文件清空
		// FileOutputStream fos = new FileOutputStream("D:/log.txt");
		
		// 如果是追加写入,则不会清空对应的文件
		// 但是如果是文件复制的话,会出现死循环问题
		FileOutputStream fos = new FileOutputStream("D:/log.txt", true);

数据流

DataInputStream和DataOutputStream
写入与读取的顺讯保持一致

		dos.writeByte(b);
		dos.writeInt(i);
		dos.writeLong(l);
		dos.writeChar(c);
		dos.writeBoolean(flag);
		dos.writeUTF("你好吗");
		
		System.out.println(dis.readByte());
		System.out.println(dis.readInt());
		System.out.println(dis.readLong());
		System.out.println(dis.readChar());
		System.out.println(dis.readBoolean());
		System.out.println(dis.readUTF());

序列化

创建对象的4种方式 :
1. new 用的最多
2. 反射机制 : 通过字符串就可以创建对象
3. 反序列化
4. clone 不使用了,被序列化代替
序列化流 就是将对象转换为二进制流的一种实现手段,通过序列化可以将该对象持久化存储和进行传输
序列化的对象必须实现Serializable接口,但是该接口中没有任何功能,仅仅是一种标记

序列化 就是把对象持久化存储到硬盘 中的过程
反序列化就是把硬盘中的对象载入到堆内存当中

应用场景 :
序列化将数据对象转换为二进制流,能够做到持久化存储和网络传输,如果不经过序列化处理,就无法进行数据传输和存储
数据由网络传输,从不同机器之间的传递,需要经过一个序列化与反序列化的流程
对象 --> 序列化 --> 数据加密处理 --> 网络传输 --> 数据解密处理 --> 反序列化 --> 对象

// System.out.println(user);
		// 创建序列化流对象
		ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D:/123.o"));
		// 序列化对象
		oos.writeObject(user);
		// 刷缓存
		oos.flush();
		// 关闭
		oos.close();
		// 创建反序列化流对象
		ObjectInputStream ois = new ObjectInputStream(new FileInputStream(
				"D:/123.o"));
		// 反序列化,读取对象,返回Object类型
		User user = (User) ois.readObject();
		// 关闭资源
		ois.close();

要序列化的对象必须实现Serializable接口

版本控制

如果序列化之后,我们的类文件发生了更改
每个类都有UID,来表示当前版本,只要发生更改,UID也会随着更改
所以只要类更改了,或者添加新功能了,此时如果再进行反序列化 就会报错
所以 一般我们会单独指定一个UID 来保证版本一致,一般写1L即可

Transient

如果不想让某个变量被序列化,可以使用transient修饰符修饰
可以把没必要的数据不进行序列化操作,从而提升序列化和反序列化的效率

	private static final long serialVersionUID = 1L;
	public transient String name;

File类

Day19 转换流、缓冲流、序列化、打印流_第2张图片
常用方法

// 获取文件对象
		// 如果路径是 "" 空字符串 就等于是 ./  当前目录
		File file = new File("D:\\17期\\课件");
		// 绝对位置 D:\\17期\\课件
		System.out.println(file.getAbsolutePath());
		// 名字 课件
		System.out.println(file.getName());
		// 父路径 D:\17期
		System.out.println(file.getParent());
		// 是否是目录 true
		System.out.println(file.isDirectory());
		// 是否是文件 false
		System.out.println(file.isFile());
		// 最后一次修改时间 返回毫秒数
		System.out.println(new Date(file.lastModified()));
		// 判断是否存在 true
		System.out.println(file.exists());
		file = null;
		
		File file1 = new File("D:\\com\\a\\b.docx");
		// 删除.,成功返回true
		System.out.println(file1.delete());
		
		file1 = new File("D:\\com\\a\\b\\c");
		// 判断是否存在
		System.out.println(file1.exists());
		// 递归创建所有目录,但是不会创建文件
		// mkdir 只能创建一个子目录.,如果上级目录也不存在,就不创建
		file1.mkdirs();
		
		file1 = new File("D:/com/a/a.txt");
		// 创建文件,创建成功是true,否则是false
		file1.createNewFile();
		// 改名字
		file1.renameTo(new File("D:/com/a/把.txt"));
		
		file1 = new File("D:/com/a");
		// 获取所有子文件对象
		File[] subFiles = file1.listFiles();
		for (File file2 : subFiles) {
     
			System.out.println(file2.getAbsolutePath());
		}

你可能感兴趣的:(笔记,java)