Java——I/O流(二):字符流(概念理解+应用举例)

news/2025/2/26 13:27:01

1.开篇

承接博主上一篇博文的字节流,在这篇博文中,我主要为大家介绍一下I/O流中的字符流,有关字节流的内容可以参考下面博文的链接:👇👇👇 

https://blog.csdn.net/weixin_43823808/article/details/107443855 

 

2.字符流概述 

说明:除了字节流,JDK还提供了用于实现字符操作的字符流,同字节流一样,字符流也有两个抽象的顶级父类,分别是Reader Writer 它们之间的继承体系如下:👇👇👇

 

 

3.字符流应用举例 

3.1 FileReader 

import java.io.*;
public class IODemo04 {
	public static void main(String[] args) throws IOException {
		//创建FileReader对象,构造方法中绑定要读取的数据源
		FileReader fr1=new FileReader("E:/Eclipse/Java Project/Love/FOS1.txt");
		int len1=0;
		System.out.print("读取文件FOS1中的内容:");
		while((len1=fr1.read())!=-1) {
			System.out.print((char)len1 + " ");
		}
		fr1.close();//关闭流,释放资源
		System.out.println();
		
		FileReader fr2=new FileReader("E:/Eclipse/Java Project/Love/FOS2.txt");
		char[] ch1=new char[20];
		int len2=fr2.read(ch1);//将从输入流中读取的所有字符存入字符数组中
		System.out.print("读取文件FOS2中的内容:");
		for(int i=0;i<len2;i++) {//len2为字符数组的长度
			System.out.print(ch1[i] + " ");
		}
		fr2.close();//关闭流,释放资源
		System.out.println();
		
		FileReader fr3=new FileReader("E:/Eclipse/Java Project/Love/FOS3.txt");
		char[] ch2=new char[20];
		int len3=fr3.read(ch2,1,4);//将从输入流中读取的从第1个字符开始(包括第1个)往后的4个字符存入字符数组中
		System.out.print("读取文件FOS3中的内容:");
		for(int i=1;i<=4;i++) {//1表示从第一个字符开始,4表示一共读取的字符个数
			System.out.print(ch2[i] + " ");
		}
		fr3.close();//关闭流,释放资源
		System.out.println();
	}
}

3.2 FileWriter 

import java.io.*;
public class IODemo05 {
	public static void main(String[] args) throws IOException {
		//创建FileWriter对象,构造方法中绑定要写入数据的目的地
		FileWriter fw1=new FileWriter("study1.txt");
		//使用FileWriter中的write()方法把数据写入到内存缓冲区中
		fw1.write("Hello FileWriter!");
		//使用FileWriter中的方法flush,把内存缓冲区中的数据刷新到文件中
		fw1.flush();
		//释放资源(会先把内存冲区中的数据刷新到文件中)
		fw1.close();
		
		FileWriter fw2=new FileWriter("study2.txt");
		char[] ch1="编程路上的初学者".toCharArray();
		fw2.write(ch1);
		char[] ch2={97,98,99,100,101};
		fw2.write(ch2,1,3);
		fw2.flush();
		fw2.close();
		
		FileWriter fw3=new FileWriter("study3.txt",true);//续写和换行
		fw3.write("软件设计师");
		fw3.write("\n");
		fw3.write("Java工程师");
		fw3.flush();
		fw3.close();
	}
}

 

 

3.3 I/O异常的处理 

在之前的程序代码块中,我们都是通过 throws IOException 来将异常抛出。那么,下面我们对I/O异常进行处理:

import java.io.*;
public class IODemo06 {
	public static void main(String[] args) {
		FileWriter fw=null;//创建FileWriter并赋值Null
		try {
			fw=new FileWriter("study4.txt",true);//可以续写和换行
			fw.write("IO流中的字节流");//写入数据
			fw.write("\n");
			fw.write("IO流中的字符流");
			fw.flush();
		}catch (IOException e1) {
			System.out.println(e1.getMessage());//处理异常
		}finally {//无论如何,都会执行finally语句块
			try {
				assert fw!=null;//当且仅当fw!=null的时候
				fw.close();
			}catch (IOException e2) {
				e2.getMessage();//处理异常
			}
		}
	}
}

在JDK7后,可以直接在try后创建流对象,而不用写finally语句块,最后也会释放资源(自动释放资源),如下:👇👇👇 

import java.io.*;
public class IODemo07 {
	public static void main(String[] args) {
		try (//可以直接在try语句中创建流对象,自动释放资源
				FileInputStream fis=new FileInputStream("E:/Eclipse/Java Project/Love/集合.jpg");
				FileOutputStream fos=new FileOutputStream("E:/Eclipse/Java Project/Love/集合5.jpg");
			) {
			int len=0;
			while((len=fis.read())!=-1) {
				fos.write(len);//写入数据,拷贝图片
			}
		}catch(IOException e) {
			System.out.println(e.getMessage());//处理异常
		}
	}
}

3.4 字符缓冲流 

说明:使用字符流逐个字符的读写文件也需要频繁的操作文件,效率仍非常低。为此,同字节流操作文件一样,也可以使用提供的字符流缓冲区(类似于字节流缓冲区)和字符缓冲流(类似于字节缓冲流)进行读写操作,来提高执行效率。 

使用:①字符流缓冲区需要定义一个字符数组作为字符缓冲区,通过操作字符缓冲区来提高文件读写效率。

           ②字符缓冲流需要使用 BufferedReader BufferedWriter其中 BufferedReader 用于对字符输入流进行操作,BufferedWriter 用于对字符输出流进行操作。在 BufferedReader 中有一readLine() 方法,用于一次读取一行文本。

import java.io.*;
public class IODemo08 {
	public static void main(String[] args) throws IOException {
		FileReader fr=new FileReader("E:/Eclipse/Java Project/Love/FOS1.txt");
		FileWriter fw=new FileWriter("E:/Eclipse/Java Project/Love/FOS11.txt");
		int len=0;
		char[] buff1=new char[1024];
		while((len=fr.read(buff1))!=-1) {
			fw.write(buff1,0,len);
		}
		fr.close();
		fw.close();
		
		BufferedReader br=new BufferedReader(new FileReader("E:/Eclipse/Java Project/Love/FOS2.txt"));
		BufferedWriter bw=new BufferedWriter(new FileWriter("E:/Eclipse/Java Project/Love/FOS22.txt"));
		String str=null;
		while((str=br.readLine())!=null) {
			bw.write(str);
			bw.newLine();
		}
		br.close();
		bw.close();
	}
}


http://www.niftyadmin.cn/n/712628.html

相关文章

tbox使用sm2算法_【学术论文】基于非对称算法的工控核心区内嵌认证技术

导读&#xff1a;近年来&#xff0c;工业互联网成为世界范围内的关注热点。作为数字浪潮下工业体系和互联网体系深度融合的产物&#xff0c;工业互联网被视为新一轮工业革命的关键支撑。工业互联网的建设和发展&#xff0c;是新一轮科技革命和产业变革的重大历史机遇&#xff0…

一阶广义差分模型_股票价格数学模型

股票价格数学模型是针对股票价格与时间之间的数量依存关系&#xff0c;通过抽象和简化&#xff0c;采用数学语言和方法&#xff0c;概括地或近似地表述出的一种数学结构。股票价格数学模型从数量关系上对股票价格运动作形式化的描述和刻画&#xff0c;可为研究股票价格运动现象…

Uva 1587:Box

题目传送门&#xff1a;https://cn.vjudge.net/problem/UVA-1587 #include <stdio.h>struct p {int w, h; }ps[6], cps[3];bool isSame(int i, int j) {return (ps[i].w ps[j].w && ps[i].h ps[j].h)|| (ps[i].w ps[j].h && ps[i].h ps[j].w); }boo…

洛谷P1746-离开中山路(BFS)

题目背景&#xff1a; 《爱与愁的故事第三弹shopping》最终章。 题目描述&#xff1a; 爱与愁大神买完东西后&#xff0c;打算坐车离开中山路。现在爱与愁大神在x1,y1处&#xff0c;车站在x2,y2处。现在给出一个nn&#xff08;n<1000&#xff09;的地图&#xff0c;0表示马路…

解决Ubuntu无法从外部应用启动Chrome打开链接的问题

遇到的问题&#xff1a;从外部应用&#xff08;如WPS Presentation&#xff09;打开连接后&#xff0c;chrome只显示一个空的标签&#xff0c;不会自动跳转 平台&#xff1a;Ubuntu 16.04 Desktop 解决办法&#xff1a;https://askubuntu.com/questions/689449/external-links…

php 字符串截取_php+mysql模拟队列发送邮件,能不能见网友就靠这封邮件了

邮件发送原理telnet命令模拟邮件发送&#xff1a;1、cmd命令下telnet连接上QQ的smtp服务器telnet smtp.163.com 25遇到问题以及解决办法&#xff1a;telnet命令错误控制面板下windows功能开启telnet客户端后重新运行即可成功2、和smtp服务器打招呼helo Miss (hi可以为任意其他英…

epoll实现机制分析

本文只介绍epoll的主要流程而不是分析源代码&#xff0c;如果需要了解更多的细节可以自己翻阅相关的内核源代码. 相关内核代码: fs/eventpoll.c 判断一个tcp套接字上是否有激活事件:net/ipv4/tcp.c:tcp_poll函数 每个epollfd在内核中有一个对应的eventpoll结构对象.其中关键的成…

js生成随机验证码

数字字母验证 验证码&#xff1a; <html> <head> <title>纯字验证码</title> <meta http-equivcontent-type contenttext/html;charsetutf-8/> <script typetext/javascript srcjquery-1.7.2.js></script> <script typetext…