学习javaEE的日子 Day36 字符流

news2024/12/24 9:59:40

Day36

1.字符流

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

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

编译器:可以识别中文字符和非中文字符,非中文字符获取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]

在这里插入图片描述

1.1 利用 字符输出转换流 向文件写入数据OutputStreamWriter

1)不处理异常的方式

2)文件存在的情况

3)文件不存在的情况

经验:所有的输出流,文件不存在的情况都会创建文件

public class Test01 {
	public static void main(String[] args) throws IOException {
		
		//1.创建流对象(将文件字节输出流 转换为 字符输出转换流)
		OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("io.txt"));
		
		//2.写入数据
		//osw.write(97);//写入码值
		
		//char[] cs = {'1','2','3','a','b','c','我','爱','你'};
		//osw.write(cs);//写入字符数组
		//osw.write(cs, 3, 4);//写入字符数组,偏移量,写入长度
		
		//osw.write("123abc我爱你");//字符串
		osw.write("123abc我爱你", 3, 4);//写入字符串,偏移量,写入长度
		
		//3.关闭资源
		osw.close();
				
	}
}
  1. 文件末尾追加

经验:考虑基础流的构造方法

注意:使用字符转换流最好加上编码格式!!!!!!!

public class Test02 {
	public static void main(String[] args) throws IOException {
		
		//1.创建流对象(将文件字节输出流 转换为 字符输出转换流)
		OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("io.txt",true),"UTF-8");
		
		//2.写入数据
		osw.write("123abc我爱你");
		
		//3.关闭资源
		osw.close();		
		
	}
}

1.2 利用 字符输入转换流 读取文件里的数据InputStreamReader

  1. 不处理异常

  2. 文件存在

  3. 文件不存在

经验:所有的输入流,在文件不存在时都会报错

public class Test05 {
	public static void main(String[] args) throws IOException {
		
		//1.创建流对象
		InputStreamReader isr = new InputStreamReader(new FileInputStream("io.txt"));
		
		//2.读取数据
		//int read;
		//while((read = isr.read()) != -1){
		//	System.out.println((char)read);
		//}
		
        //2.读取数据
		//isr.read(cs):读入cs数组长度的字符,将字符数据存入到数组中,并返回读取到的有效字节数,如果读取到文件末尾,则返回-1
		char[] cs = new char[1024];
		int len;
		while((len = isr.read(cs)) != -1){
			System.out.println(new String(cs, 0, len));
		}       
        
		//3.关闭资源
		isr.close();
		
	}
}

1.3 拷贝文件

public class Copy {
	public static void main(String[] args) throws UnsupportedEncodingException, IOException {
		
		InputStreamReader isr = new InputStreamReader(new FileInputStream("小说.txt"), "GBK");
		OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("copy.txt"), "GBK");
		
		char[] cs = new char[1024];
		int len;
		while((len = isr.read(cs)) != -1){
			osw.write(cs, 0, len);
		}
		
		isr.close();
		osw.close();
	}
}

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

public class Test01 {
	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();
		
	}
}

1.5 利用 文件字符输入流 读取文件里的数据FileReader

public class Test02 {
	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();
	}
}

1.6 拷贝文件

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();
		
	}
}

1.7 利用 带缓冲区的字符输出流 向文件写入数据BufferedWriter

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();		
		
	}
}

1.8 利用 带有缓冲区的字符输入流 读取文件里的数据BufferedReader

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.9 拷贝文件

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();
		
	}
}

另一种方法

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();
		
	}
}

2.各种流

2.1 对象流

class ObjectInputStream – 对象输入流

class ObjectOutputStream – 对象输出流

理解:

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

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

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

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

注意:

  1. 如果对象想写入文件,对象所属的类就必须实现序列化接口(Serializable)
  2. Serializable序列化接口没有任何的属性和方法,这种接口称之为标记型接口
  3. 对象所属的类实现了序列化接口一定要添加序列化ID(serialVersionUID)
  4. 属性使用transient修饰,该属性不会随着对象而写入到文件中
2.1.1 利用对象输出流 向文件写入数据ObjectOutputStream
public class Test01 {
	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();
	}
}
2.2.2 利用对象输入流 读取文件里的数据ObjectInputStream
public class Test02 {
	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();
		
	}
}
2.2.3 利用对象输出流 向文件写入自定义对象ObjectOutputStream
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"));
		oos.writeObject(new User("1534534534", "111222"));
		oos.writeObject(new User("5345356683", "123456"));
		oos.writeObject(null);
		
		//3.关闭资源
		oos.close();
		
	}
}

User类

public class User implements Serializable{//要实现序列化接口(Serializable)
	
	private static final long serialVersionUID = 4907921883130742331L;
	
	private String username;
	private transient String password;
	
    //无参构造,有参构造,get,set方法省略
2.2.4 利用对象输入流 读取文件中的自定义对象ObjectInputStream
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.InputStreamReader 和 OutputStreamWriter
理解转换流(字节流 -> 字符流)

2.FileReader、FileWriter

3…BufferedReader、BufferedWriter
注意:缓冲区大小-8192字符

4…字符流继承图

5.ObjectInputStream、ObjectOutputStream
注意:
序列化接口

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1591882.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python测试框架 —— pytest与unittest的区别!

前言 在Python中进行测试时,两个最流行的测试框架是unittest和pytest。虽然它们的目标相同,但它们之间存在许多不同之处。 本文将详细比较它们在用例编写规则、前置和后置方法、参数化、断言功能、用例执行和报告生成等方面的差异,并适当补…

分类预测 | Matlab实现SSA-LSSVM麻雀算法优化最小二乘支持向量机数据分类预测

分类预测 | Matlab实现SSA-LSSVM麻雀算法优化最小二乘支持向量机数据分类预测 目录 分类预测 | Matlab实现SSA-LSSVM麻雀算法优化最小二乘支持向量机数据分类预测分类效果基本介绍程序设计参考资料 分类效果 基本介绍 1.Matlab实现SSA-LSSVM麻雀算法优化最小二乘支持向量机数据…

本地知识库搭建教程来了,跟着做就行

你是不是常常因为找不到几个月前那个重要的工作笔记而头疼?或者是厌倦了反复在互联网的海洋中搜寻相同的信息?一个本地的知识库可能是你需要的解决方案。今天,我就要为你分享如何简单地搭建起自己的知识库,让你的信息更有组织、更…

别等Sora了!字节跳动旗下国产AI工具Dreamina,AI视频生成虽不完美,但够惊艳!

别等 Sora 了,试试字节跳动的 Dreamina!Dreamina 是剪映旗下的一个 AI 创作平台,目前支持「文生图」、「智能画布」和「视频生成」功能。 Dreamina 官网:https://dreamina.jianying.com/ai-tool/home 之前对 Dreamina 的「文生图…

大数据------JavaWeb------JDBC(完整知识点汇总)

JDBC 定义 全称为Java数据库连接(Java DataBase Connectivity):是使用java语句来操作所有关系型数据库的一套API JDBC本质 它是官方定义的一套操作所有关系型数据库的规则(即接口),各个数据库厂商会去实现…

socat神器解密:网络数据传输的利器

欢迎来到我的博客,代码的世界里,每一行都是一个故事 socat神器解密:网络数据传输的利器 前言socat简介基本用法常见功能常见功能:1. 端口转发和数据重定向:2. 加密和解密数据流: 高级功能1. 代理服务器和隧…

Tomcat启动闪退的10个解决小技巧

引言 大家好!在我们日常开发中,使用Tomcat作为Web服务器是相当常见的。 然而,遇到Tomcat启动后立即闪退的问题也不是什么稀罕事。 这种情况可能会让人感到困惑和沮丧,特别是当你急需完成一个项目或者修复一个重要的bug时。 不过…

单链表的创建与修改

链表的分类: 链表可按照:1.双向,单向。2.循环,不循环。3.带头,不带头。 根据不同组合可分为8类。其中不带头单项不循环链表为单链表。 单链表的第一个节点为头节点: 节点的创建: 通过这样一…

2024 年排名前 5 的 CSS 框架

文章目录 1、Bootstrap2、Tailwind CSS3、Foundation4、Bulma5、UIKit 1、Bootstrap Bootstrap框架是由Twitter的设计师Mark Otto和Jacob Thornton合作开发的,于2011年8月在GitHub上发布。它是目前最受欢迎的前端框架之一,被广泛应用于各种Web项目中。Bo…

基于机器学习预测岗位薪资

本文根据某招聘网站抓取的岗位信息,来预测该岗位平均薪资。 数据预处理 数据示例如下: 因为本文重点介绍如何实现预测,因此对于数据的预处理部分讲解一下处理逻辑: 1、统一薪资的单位,要么统一为年薪(万/…

【Linux】序列化与反序列化{服客编程/守护进程/JSON}

文章目录 1.引入2. 静态成员函数3.TCP:传输控制协议4.守护进程4.0前台进程4.1介绍4.2认识4.3会话4.3ps axj4.4理解4.5/dev/null4.6守护进程和孤儿进程 5.JSON6.完整代码6.1Makefile6.2Socket.hpp6.3Protocol.hpp6.4Log.hpp6.5Daemon.hpp6.6TcpServer.hpp6.7Client.c…

PBXAI:将疾病预测转为沿知识图谱的随机游走

PBXAI:将疾病预测转为沿知识图谱的随机游走 PBXAI 知识图谱构建 病人特征与知识图谱连接 强化学习 疾病发展路径的生成PBXAI 流程PBXAI 算法设计 论文: https://arxiv.org/ftp/arxiv/papers/2010/2010.08300.pdf 代码:https://github.co…

NLP_知识图谱_介绍、构建、问答知识

文章目录 知识图谱的介绍图图能做些什么任务基于图的推荐系统图的一些基本概念与表述有向图与无向图节点的度节点的边的数量有向图又分为入度和出度 什么是知识图谱知识图谱属于异质图知识图谱的schema知识图谱的应用场景 知识图谱的构建三元组如何构建知识图谱构建知识图谱通常…

基于springboot+vue+Mysql的简历系统

开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…

C语言输出不同颜色的字体

本文章在Linux进行演示!!! 使用C语言输出不同颜色字体和背景 格式: printf("\033[字体背景颜色;字体颜色m字符串\033[0m"); 上边的 \033 也可以用 \e 来代替。 字体颜色与字符的对应关系 字符颜色30黑色31红…

小白学视觉 | 各种各样神奇的自注意力机制(Self-attention) 建议收藏!

本文来源公众号“小白学视觉”,仅用于学术分享,侵权删,干货满满。 原文链接:收藏!各种各样神奇的自注意力机制(Self-attention) 编者荐语 文章总结了关于李宏毅老师在 2022 年春季机器学习课…

MAC(M1芯片)编译Java项目慢且发热严重问题解决方案

目录 一、背景二、排查三、解决四、效果以及结果展示五、总结 一、背景 使用idea编译项目等操作,经常性发热严重,并且时间慢。直到昨天编译一个项目用时30分钟,电脑温度很高,并且有烧灼的味道,于是有了此篇文章。 二、…

关于Jar包提示找不到主类 找不到或无法加载主类

关于Jar包提示找不到主类 找不到或无法加载主类 当时看到教程打包一个正常的小型增删改查为50MB,也就是几十MB,可我打包得到的Jar包只有几MB,一直提示找不到主类application。经检查 根据方法,只需使用mvn clean 和 mvn packa…

大米自动化生产线设备:现代粮食加工的核心力量

随着科技的不断进步和粮食加工行业的快速发展,大米自动化生产线设备在现代粮食加工中的地位愈发重要。这些设备不仅大大提高了生产效率,还保证了产品的质量和安全,成为了现代粮食加工行业不可或缺的核心力量。 一、自动化生产线设备助力效率提…

厂房起火3D消防灭火安全救援模拟演练

深圳VR公司华锐视点依托前沿的VR虚拟现实制作、三维仿真和图形图像渲染技术,将参训者带入栩栩如生的火灾现场。佩戴VR头盔,参训者将真切体验火势蔓延的紧张与危机,身临其境地感受火灾的恐怖。 并且消防安全VR虚拟现实演练系统精心模拟了住宅、…