JAVA_IO

1 File

  • File可以将程序和电脑的文件夹或者文件关联起来

相对路径

绝对路径

2 基本概念

分类

image

  • 流向

输入流,输出流

  • 数据

字节流:二进制,可以使一切文件包括文件,文本音视频

字符流:文本文件,只可以处理纯文本

  • 功能

节点流:包裹源头

处理流:增强功能,提供性能

字节流和字符流

  1. 字节流
  • 输入流
InputStream;
read(byte[] b)
read(byte[] b,int off,int len);
close();
  • 输出流
OutputStream;
write(byte[] b) + flush() + close()

  1. 字符流
  • 输入流:Reader
read(char[] buffer)
  • 输出流:Writer
write(byte[] buffer)+flush()+close()

2 字节流

步骤

  • 建立与文件的联系
  • 选择对应流
  • 读取|写出
  • 数组大小读取或者写出
  • 释放资源

读取文件与写出文件与拷贝

  • 读取
// 建立联系
		File file = new File("F://zhao.txt");
		// 选择流
		InputStream inputStream = new FileInputStream(file);
		// 读取的大小每次
		byte[] b = new byte[10];
		
		int len = 0;// 实际读取的字节数
		while((len = inputStream.read(b)) != -1){
			System.out.println(len);
		}
		inputStream.close();
  • 写入文件
FileOutputStream(File file) // 创建一个向指定 File 对象表示的文件中写入数据的文件输出流。

FileOutputStream(File file, boolean append) //创建一个向指定 File 对象表示的文件中写入数据的文件输出流。

FileOutputStream(String name) //   创建一个向具有指定名称的文件中写入数据的输出文件流。

FileOutputStream(String name, boolean append) // 创建一个向具有指定 name 的文件中写入数据的输出文件流。




// f://zhaodi.txt在写的时候自动创建这个文件
		OutputStream os = new FileOutputStream(new File("f://zhaodi.txt"),true);
		String info ="zhaodi  is 赵迪";
		// 字符串转字节
		byte[] data = info.getBytes();
		os.write(data);
		os.flush();

  • 拷贝文件

就是先读取一个文件,然后写到另一个文件

InputStream is = null;
		OutputStream os = null;
		os = new FileOutputStream("f://zhaodiishao.txt",true);
		is = new FileInputStream(new File("f://zhao.txt"));
		
		byte[] car = new byte[1024];
		int len = 0;
		while((len = is.read(car)) != -1){
			os.write(car);
		}
		os.flush();
		is.close();
		os.close();
  • 拷贝文件夹

3 字符流

只可以操作纯文本

步骤:

  • 建立联系
  • 选择流 Writer、Reader
  • 读取|写出 char[] data = new char[10] 注意这里是字符数组!!
  • 关闭

原理同字节流,此处省略

4 处理流

  • 节点流处于io操作的第一线,所有操作必须通过他们进行;处理流可以对其它流进行处理(提高效率或者操作灵活性)
  • 记住处理流是对其它流的处理哦
  • 提高性能,增强功能

字节缓冲流

  • 字节缓冲流

没有加入新的方法

InputStream is = null;
		OutputStream os = null;
		os = new BufferedOutputStream(new FileOutputStream("f://zhaodiishao.txt",true));
		is = new BufferedInputStream(new FileInputStream(new File("f://zhao.txt")));
		
		byte[] car = new byte[1024];
		int len = 0;
		while((len = is.read(car)) != -1){
			os.write(car);
		}
		os.flush();
		is.close();
		os.close();

字符缓冲流

加入新的重要的方法

readLine() //读取一个文本行,包含该行内容的字符串,不包含任何行终止符,如果已到达流末尾,则返回 null
newLine() // 写入一个行分隔符

// 选择流
		BufferedReader bufferedReader = null;// 多态是不可以访问新增加的方法的所以这里不可以使用多态
		BufferedWriter bufferedWriter = null;
		
		try {
			// 包装节点流
			bufferedReader = new BufferedReader(new FileReader(new File("f://zhao.txt")));
			bufferedWriter = new BufferedWriter(new FileWriter(new File("f://zhaozhao.txt")));
			
			
			String line_info = null;
			// 读取  写入
			while((line_info=bufferedReader.readLine())!=null){
				bufferedWriter.write(line_info);
				bufferedWriter.newLine();
			}
			bufferedWriter.flush();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}finally {
			try {
				// 关闭
				bufferedReader.close();
				bufferedWriter.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		

转换流

作用

  • 字节流转换为字符流
  • 处理乱码编码集
  • 解码

编码

graph LR
字符-->二进制

解码

graph LR
二进制-->字符

乱码出现原因

  • 编码与解码的字符集不统一
String user_name = "zhaodi 赵迪";
		// 编码
		byte[] data = user_name.getBytes("utf-8");
		// 解码
		String user_name1 = new String(data,"utf-8");
		System.out.println(user_name1);
  • 字节缺少,长度丢失

5 序列化,反序列化

程序运行时,只要需要,对象可以一直存在,并且我们可以随时访问对象的一些状态信息,如果程序终止,那么对象是肯定不会存在的,但是有时候,我们需要再程序终止时保存对象的状态信息,之后程序再次运行时可以重新恢复到之前的状态,如,玩家玩游戏退出时,需要保存玩家的状态信息(如等级、装备等等),之后玩家再此登入时,必须要恢复这些状态信息。我们可以通过数据库手段来达到这个保存状态的目的,在Java中,我们有更简便的方法进行处理,那就是序列化与反序列化。序列化是一种对象持久化的手段,反序列化与序列化相反,其是通过序列化后的信息重新组装成对象。

-序列化 需要实现Serializable 接口,反序列化不需要

一个小小的程序员
原文地址:https://www.cnblogs.com/zhaod/p/8351693.html