首页 > 其他分享 >IO流【 文件字符输入、出流;带缓冲区的字符输入、出流;对象流】

IO流【 文件字符输入、出流;带缓冲区的字符输入、出流;对象流】

时间:2024-04-10 22:58:06浏览次数:12  
标签:字符 String 对象 出流 缓冲区 new txt 输入

day36

IO流

字符流继承图

字符流继承图

字符流

继day35

应用场景:操作纯文本数据

注意:字符流 = 字节流+编译器

编译器:可以识别中文字符和非中文字符,非中文字符获取1个字节(一个字节=一个字符),编译器会根据编码格式获取中文字符对应的字节数(GBK获取两个字节,UTF-8获取三个字节)

abstract class Reader – 字符输入流的基类(抽象类)

abstract class Writer – 字符输出流的基类(抽象类)

class InputStreamReader extends Reader – 字符输入转换流

class OutputStreamWriter extends Writer – 字符输出转换流

特点:将字节流转换为字符流,字符转换流是字节流和字符流的桥梁

class FileReader extends InputStreamReader – 文件字符输入流

class FileWriter extends OutputStreamWriter – 文件字符输出流

class BufferedReader extends Reader – 带缓冲区的字符输入流

class BufferedWriter extends Writer – 带缓冲区的字符输出流

默认缓冲区:8192字符 – new char[8192]

文件字符输入、出流

利用 文件字符输出流 向文件写入数据

学习类比前面的学习思路,这里简化

	public static void main(String[] args) throws IOException {
		
		//1.创建流对象
		//FileWriter fw = new FileWriter("io.txt");
		
		//1.创建流对象
		FileWriter fw = new FileWriter("io.txt", true);
		
		//2.写入数据
		fw.write("迪士尼");
		
		//3.关闭资源
		fw.close();
		
	}
利用 文件字符输入流 读取文件里的数据
	public static void main(String[] args) throws IOException {
		
		//1.创建流对象
		FileReader fr = new FileReader("io.txt");
		
		//2.读取数据
		char[] cs = new char[1024];
		int len;
		while((len = fr.read(cs)) != -1){
			System.out.println(new String(cs, 0, len));
		}
		
		//3.关闭资源
		fr.close();
	}
拷贝文件

利用 文件字符输入、输出流

思路:读取源文件,写入目标文件

public class Copy {

	public static void main(String[] args) throws IOException {
		
		FileReader fr = new FileReader("小说.txt");
		FileWriter fw = new FileWriter("copy.txt");
		
		char[] cs = new char[1024];
		int len;
		while((len = fr.read(cs)) != -1){
			fw.write(cs, 0, len);
		}
		
		fr.close();
		fw.close();
		
	}
}

带缓冲区的字符输入、出流

利用 带缓冲区的字符输出流 向文件写入数据
public class Test01 {
	public static void main(String[] args) throws UnsupportedEncodingException, IOException {
		
		//1.创建流对象(文件字节输出流 -> 字符输出转换流 -> 带有缓冲区的字符输出流)
		//默认缓冲区大小:8192字符
		//BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("io.txt"), "GBK"));
		
		//1.创建流对象(文件字节输出流 -> 字符输出转换流 -> 带有缓冲区的字符输出流)+ 末尾追加
		//默认缓冲区大小:8192字符
		//BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("io.txt",true), "GBK"));
		
		//1.创建流对象(文件字符输出流 -> 带缓冲区的字符输出流)
		//默认缓冲区大小:8192字符
		//BufferedWriter bw = new BufferedWriter(new FileWriter("io.txt"));
		
		//1.创建流对象(文件字符输出流 -> 带缓冲区的字符输出流)+ 末尾追加
		//默认缓冲区大小:8192字符
		//BufferedWriter bw = new BufferedWriter(new FileWriter("io.txt",true));
		
		//1.创建流对象(文件字符输出流 -> 带缓冲区的字符输出流)+ 末尾追加 
		//自定义缓冲区大小:2048字符
		BufferedWriter bw = new BufferedWriter(new FileWriter("io.txt",true),2048);
		
		//2.写入数据
		bw.write("迪士尼");
		
		//3.关闭资源
		bw.close();	
	}
}
利用 带有缓冲区的字符输入流 读取文件里的数据
public class Test02 {
    
	public static void main(String[] args) throws UnsupportedEncodingException, IOException {
		
		//1.创建流对象(文件字节输入流 -> 字符输入转换流 -> 带有缓冲区的字符输入流)
		//默认缓冲区大小:8192字符
		//BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("io.txt"), "GBK"));
		
		//1.创建流对象(文件字节输入流 -> 字符输入转换流 -> 带有缓冲区的字符输入流)
		//默认缓冲区大小:8192字符
		//BufferedReader br = new BufferedReader(new FileReader("io.txt"));
		
		//1.创建流对象(文件字节输入流 -> 字符输入转换流 -> 带有缓冲区的字符输入流)
		//自定义缓冲区大小:2048字符
		BufferedReader br = new BufferedReader(new FileReader("io.txt"),2048);
		
		//2.读取数据
		char[] cs = new char[1024];
		int len;
		while((len = br.read(cs)) != -1){
			System.out.println(new String(cs, 0, len));
		}
		
		//3.关闭资源
		br.close();
	}
}
拷贝文件

利用 带有缓冲区的字符输入、输出流

思路:读取源文件,写入目标文件

方式1

public class Copy01 {
	public static void main(String[] args) throws IOException {
		
		BufferedReader br = new BufferedReader(new FileReader("小说.txt"));
		BufferedWriter bw = new BufferedWriter(new FileWriter("copy.txt"));
		
		char[] cs = new char[1024];
		int len;
		while((len = br.read(cs)) != -1){
			bw.write(cs, 0, len);
		}
		
		br.close();
		bw.close();
	}
}

方式2:行

public class Copy02 {

	public static void main(String[] args) throws IOException {
		
		BufferedReader br = new BufferedReader(new FileReader("小说.txt"));
		BufferedWriter bw = new BufferedWriter(new FileWriter("copy.txt"));
		
//		String readLine;
//		while((readLine = br.readLine()) != null){
//			bw.write(readLine);//写一行
//			bw.newLine();//换行
//		}
		
		boolean bool = false;
		String readLine;
		while((readLine = br.readLine()) != null){
			
			//第一行不换行
			if(bool){
				bw.newLine();//换行
			}
			
			bw.write(readLine);//写一行
			bool = true;
		}
		
		br.close();
		bw.close();
		
	}
}

各种流

对象流

class ObjectInputStream – 对象输入流

class ObjectOutputStream – 对象输出流

理解:

​ 将程序中的对象写入到文件

​ 并且从文件中读取出对象到程序里

ps:服务器宕机,文件里的对象没事,又可以拿出来

序列化(钝化):将程序里的对象写入到文件

反序列化(活化):将文件里的对象读取到程序中

注意:

  1. 如果对象想写入文件,对象所属的类就必须实现序列化接口(Serializable)
  2. Serializable序列化接口没有任何的属性和方法,这种接口称之为标记型接口
  3. 对象所属的类实现了序列化接口一定要添加序列化ID(serialVersionUID)
  4. 属性使用transient修饰,该属性不会随着对象而写入到文件中
利用对象输出流 向文件写入数据
	public static void main(String[] args) throws FileNotFoundException, IOException {
		
		//1.创建流对象
		ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("io.txt"));
		
		//2.写入数据
		oos.writeInt(100);//写入int值
		oos.writeDouble(123.123);//写入double值
		oos.writeUTF("迪士尼");//写入字符串
		oos.writeObject(new Date());//写入对象
		
		//3.关闭资源
		oos.close();
	}
利用对象输入流 读取文件里的数据

取出来能用,看不懂其中内容正常,读取和写入顺序一致,不然会报错

	public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
		
		//1.创建流对象
		ObjectInputStream ois = new ObjectInputStream(new FileInputStream("io.txt"));
		
		//2.读取数据(读取顺序必须和写入顺序一致)
		int readInt = ois.readInt();
		double readDouble = ois.readDouble();
		String str = ois.readUTF();
		Date date = (Date) ois.readObject();
		
		System.out.println(readInt);
		System.out.println(readDouble);
		System.out.println(str);
		System.out.println(date);
		
		//3.关闭资源
		ois.close();	
	}
利用对象输出流 向文件写入自定义对象

序列化id类似于版本,版本变化会导致读取不了的问题

public class User implements Serializable{//序列化接口
	
	private static final long serialVersionUID = 4907921883130742331L;//static final处理序列化id
	
	private String username;
	private transient String password;
	private String nickName;
	private String name;
	private String role;
	private double hp;
	private double mp;
    //无参、有参构造、get、set、toString方法【略】
}
public class Test03 {

	public static void main(String[] args) throws FileNotFoundException, IOException {
		
		//1.创建流对象
		ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("io.txt"));
		
		//2.写入自定义对象
		oos.writeObject(new User("1445584980", "123123", "昨夜的酒", "小小", "无极剑圣", 10000, 10000));
		oos.writeObject(new User("1534534534", "111222", "撕裂的忧伤", "大大", "九尾妖狐", 8000, 9000));
		oos.writeObject(new User("5345356683", "123456", "落日黄昏", "奇男子", "逆羽", 9000, 8000));
		oos.writeObject(null);//不加会导致对象输入流读取对象报错
		
		//3.关闭资源
		oos.close();
		
	}
}
利用对象输入流 读取文件中的自定义对象
public class Test04 {

	public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
		
		//1.创建流对象
		ObjectInputStream ois = new ObjectInputStream(new FileInputStream("io.txt"));
		
		//2.读取自定义对象
		User user;
		while((user = (User)ois.readObject()) != null){
			System.out.println(user);
		}
		
		//3.关闭资源
		ois.close();
	}
}

内存流

打印流

随机访问流

总结

1.FileReader、FileWriter

2.BufferedReader、BufferedWriter
注意:缓冲区大小-8192字符

3.字符流继承图

4.ObjectInputStream、ObjectOutputStream
注意:
序列化接口
序列化、反序列的概念

标签:字符,String,对象,出流,缓冲区,new,txt,输入
From: https://blog.csdn.net/gangain/article/details/137614642

相关文章

  • 利用列表编写一个发红包程序,要求输入红包金额money,红包个数n,显示由每个红包的金额所构
    声明:著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。【第7次课]实验五组合数据类型(一)4.简答题利用列表编写一个发红包程序,要求输入红包金额money,红包个数n,显示由每个红包的金额所构成的列表。程序运行输出格式参考下图:[提示](1)可以使用random......
  • STM32 HAL库F103系列之OLED显示一个字符
    原理图:OLED对应IO口OLED_CS对应OV_WRST,即:PD6;OLED_RS对应OV_SCL,即:PD3,高电平为命令,低电平为数据;OLED_WR对应OV_RRST,即:PG14;OLED_RD对应DCMI_SDA,即:PG13;OLED_RST对应DCMI_RESET,即:PG15;OLED_D[7:0]对应DCMI_D[7:0],即:PC[7:0]配置步骤:1,确定IO连接关系        开发......
  • 加入预测新数据,最小二乘支持向量机(lssvm)回归预测(多输入单输出)-附代码
    最小二乘支持向量机(lssvm)回归预测最小二乘支持向量机(LeastSquaresSupportVectorMachine,LS-SVM)是支持向量机(SupportVectorMachine,SVM)的一种变体,用于回归问题。其原理基本上与标准的支持向量机相似,但在损失函数和优化过程上有所不同。最小二乘支持向量机(LS-SVM)回归预......
  • unordered_map在计算最大长度的无重复字符子串的作用总结
    例如:abcadfee计算结果为3,即abc或adf这里定义一个unordered_map<char,int>的哈希表,键为字符,值为该字符的下标intleft=0,len=0;for(inti=0;i<s.length();i++){charc=str[i];if(hash.count(c)){len=max(len,i-left);//计算最大长度left=max(left,hash[c]+1);//就算左指针......
  • C语言: 字符串函数(下)
    片头在上一篇中,我们介绍了字符串函数。在这一篇章中,我们将继续学习字符串函数,准备好了吗?开始咯!1.strncpy函数1.1strncpy函数的用法strncpy是C语言中的一个字符串处理函数,它用于将一个字符串的一部分内容复制到另一个字符串中。其函数原型为:char*strncpy(char*dest......
  • leedcode-反转字符串中的元音字母
    自己写的,双指针,一次通过classSolution:defreverseVowels(self,s:str)->str:#将输入的字符串转换为列表s_list=list(s)#定义元音字母列表vowels=['a','e','i','o','u','A&......
  • 扩展ueditor中公式插件kityformula的字符集
    https://blog.csdn.net/hshuaile/article/details/86079147 例如,我想在公式中使用"▱"符号,但是现有公式插件不支持输入,所以需要扩展,扩展步骤如下在网上找到"▱"符号,并起一个名字,例如叫parallelogram打开kity-formula-render.all.js文件,找到如下代码/*!*字体主文件*/_p[29]......
  • 下载文件时处理URL中出现特殊字符
    文章目录概要整体架构流程技术名词解释技术细节概要在URL中,有些字符具有特殊含义或可能引起歧义因此需要进行编码以确保在网络上传输时能正确解释。例如:空格:空格在URL中会被编码为%20或+,因为在URL中空格是不允许的。保留字符:某些字符在URL中具有特殊含义,如......
  • 后缀数组--SA--字符串
    SA(SuffixArray)--后缀数组简介这里明白两个定义:\(SA_i\):按字典序排列后大小为\(i\)的后缀的后缀头的下标。\(Rank_i\):后缀头的下标为\(i\)按字典序排列后的排名。一个显而易见却很重要的结论:\[SA[Rank[i]]=Rank[SA[i]]=i\]如何进行后缀排序?暂且挂oi......
  • 【TensorRT】TensorRT C# API 项目更新 (1):支持动态Bath输入模型推理(下篇)
    4.接口应用关于该项目的调用方式在上一篇文章中已经进行了详细介绍,具体使用可以参考《最新发布!TensorRTC#API:基于C#与TensorRT部署深度学习模型》,下面结合Yolov8-cls模型详细介绍一下更新的接口使用方法。4.1创建并配置C#项目 首先创建一个简单的C#项目,然后添加项......