常见字符流

开发者福利!热门AI工具限时免费用 购周边即赠Coding Plan Lite,Claude Code、Cursor等20+工具畅享,效率翻倍! 阅读详情


  以字符为单位获取数据的流,称为字符流,它们都继承于Reader/Writer抽象类。

  常用的字符流有:

  • FileReader/FileWriter,文件字符流(节点流)
  • BufferedReader/BufferedWriter,字符缓存流(处理流)
  • InputStreamReader/OutputStreamWriter,转换流(处理流)

  下面分别介绍一下这三组字符流及用法。

FileReader/FileWriter

  FileReader/FileWriter是最常用的字符流,当数据源为文本文件时,选择这组数据流进行处理。我们可以通过构造器快速了解它的操作数据类型:

    public FileReader(File file)

    public FileWriter(File file)

  它的使用基本与FileInputStream/FileOutputStream一致,只是数据单位是字符数组char[ ]。

  来一个文件的拷贝实例,了解其用法(对比着字节流看,更有感觉):

public class FileRW {

	public static void main(String[] args) {
		//1.指定数据源
		File in_scr = new File("a.txt");
		File out_scr = new File("a-copy.txt");
		
		Reader reader = null;
		Writer writer = null;
		try {
			//2.选择合适的数据流
			reader = new FileReader(in_scr);
			writer = new FileWriter(out_scr);
			
			//3.进行数据操作
			char[] flush = new char[1024]; //字符流,数据以字符数组为单位
			int len = -1;
			while( (len = reader.read(flush)) != -1 ) {
				for(int i=0;i<len;i++) {
					System.out.print(flush[i]); //输出为字符
				}
				writer.write(flush, 0, len);
			}
			writer.flush();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			//4.关闭流,释放资源
			//先打开的先关闭
			try {
				if(reader != null) {
					reader.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
			try {
				if(writer != null) {
					writer.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

}

BufferedReader/BufferedWriter

  BufferedReader/BufferedWriter,字符缓存流(处理流),与BufferedInputStream/BufferedOutputStream类似,增加了缓存机制,大大提高了读写文本文件的效率。构造器源码如下:

    public BufferedReader(Reader in)

    public BufferedWriter(Writer out)

  同时,提供了更方便的按行读取的方法:readLine(); 处理文本时,我们一般可以使用缓冲字符流。

  BufferedReader/BufferedWriter也可以对FileReader/FileWriter进行装饰,然后继续使用read()方法。在这里就不再举例说明了。这里举一个使用readLine()方法的实例:

public class BufferedRW {

	public static void main(String[] args) {
		//1.指定数据源
		File in_scr = new File("a.txt");
		File out_scr = new File("a-copy.txt");
		
		BufferedReader reader = null;
		BufferedWriter writer = null;
		try {
			//2.选择合适的数据流
			reader = new BufferedReader(new FileReader(in_scr));
			writer = new BufferedWriter(new FileWriter(out_scr));
			
			//3.进行数据操作
			String str = null;
			while((str = reader.readLine()) != null) { //一行一行读
				writer.write(str); // 一行一行写,所以没有缓存,不需要flush()
				writer.newLine(); //换行
			}
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			//4.关闭流,释放资源
			//先打开的先关闭
			try {
				if(reader != null) {
					reader.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
			try {
				if(writer != null) {
					writer.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

}

InputStreamReader/OutputStreamWriter

  InputStreamReader/OutputStreamWriter,转换流(处理流),是一种将字节流转化成字符流的处理流,构造器源码:

public class InputStreamReader extends Reader {
    public InputStreamReader(InputStream in)
}

public class OutputStreamWriter extends Writer {
    public OutputStreamWriter(OutputStream out)
}

  可以看到,InputStreamReader/OutputStreamWriter是继承了Reader/Writer的字符流,但是构造器中传入的是InputStream/OutputStream的字节流,内部实现了从字节流到字符流的转换。

  使用实例:

public class StreamRW {

	public static void main(String[] args) {
		//1.指定数据源
		File in_scr = new File("a.txt");
		File out_scr = new File("a-copy.txt");
		
		
		BufferedReader reader = null;
		BufferedWriter writer = null;
		try {
			FileInputStream fis = new FileInputStream(in_scr);
			FileOutputStream fos = new FileOutputStream(out_scr);
			
			//2.选择合适的数据流
			reader = new BufferedReader(new InputStreamReader(fis));//对InputStreamReader来说,数据源是FileInputStream字节流
			writer = new BufferedWriter(new OutputStreamWriter(fos));//对OutputStreamWriter来说,数据源是FileOutputStream字节流
			//从字节流转换为了字符流,然后再使用BufferedWriter进行处理装饰,后续操作就可以按字符流进行处理了
			//3.进行数据操作
			String str = null;
			while((str = reader.readLine()) != null) {
				writer.write(str);
				writer.newLine();
			}
		
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			//4.关闭流,释放资源
			//先打开的先关闭
			try {
				if(reader != null) {
					reader.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
			try {
				if(writer != null) {
					writer.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}

}
深入浅出:Java中的字节流和字符流详解 字节流是以**字节(byte)**为单位操作数据的流。它用于处理所有类型的文件,包括文本文件、图片、视频等。字节流不关心数据的编码方式,直接传输文件的原始字节。:表示输入字节流,用于读取数据。:表示输出字节流,用于写入数据。字符流是以**字符(char)**为单位操作数据的流,专为处理文本文件而设计。它会自动根据编码格式将字节转换为字符或将字符转换为字节。Reader:表示输入字符流,用于读取字符。Writer:表示输出字符流,用于写入字符。字节流。 阅读详情

相关推荐

java中的IO流(字符流,字节流)及一些常见面试题

目录 一.File类 1.1File类的概述与构造方法 1.1.1File类的介绍 1.1.2File类的构造方法 1.2File类的常用方法 1.2.1File类的创建功能 1.2.2File类的判断与获取功能 1.2.3File类的删除功能​ 1.2.4绝对路径与相对路径 1.3递归 1.3.1递归介绍 1.3.2递归的注意事项 1.3.3递归遍历目录 二 .IO流 2.1IO流概述和分类 2.1.1IO流介绍 2.1.2IO流的分类 2.1.3IO流的使用...

qingmenghan的博客 1582

字符流

3.字符流 3.1为什么会出现字符流 由于字节流操作中文不是特别方便,所以Java就提供了字符流 字符流=字节流+编码表 用字节流复制文本时,文本文件也会有中文,但是没有问题,原因是最终底层操作会自动进行字节拼接成中文,如何识别是中文的呢? 汉字在存储的时候,无论选择哪种编码存储,第一个字节都是负数 3.2编码表 基础知识 计算机中存储的信息都是用二进制数表示的;我们在屏幕上看到的英文,汉子等字符都是二进制数转化之后的结果 按照某种规则,将字符储存到计算机中,

qq_52770793的博客 2732

Java之字符流的详细解析

当使用字节流读取文本文件时,可能会有一个小问题。就是遇到中文字符时,可能不会显示完整的字符,那是因为一个中文字符可能占用多个字节存储。所以Java提供一些字符流类,以字符为单位读写数据,专门用于处理文本文件。

qq_69748833的博客 1303

2、字符流详解

2、字符流详解

shiyu_951的博客 1732

字节流和字符流详解

1.流的概念 在编程中是一种抽象的概念,就好比“水流”,从一段流向另一端 在程序中所有的数据都是以流的方式进行传输或保存的,程序需要数据的时候要使用输入流读取数据,而当程序需要将一些数据保存起来的时候,就要使用输出流完成。 程序中的输入输出都是以流的形式保存的,流中保存的实际上全都是字节文件。 2.流的分类 按照流向可以分为:输入流(如:键盘,麦克风),输出流(如:显示器,音箱) 按照传输单位可以分为:字节流和字符流 3.什么是字节流,什么是字符流 字节流: 它处理单元为1个字节(byte),操作字节和

wkh18891843165的博客 3万+

IO里面的常见类,字节流、字符流的差异

JAVA IO主要有这四个类InputStream、OutputStream、Reader、Writer来处理,要处理字节流的就用InputStream、OutputStream,要处理字符流,就用Reader、Writer,现实中根据需要,我们选择他们的相关子类进行数据的读写 首先什么是流: 流(Stream)的概念来源于UNIX中的管道(pipe)概念,在unix中,管道是一条不间断的字节流,...

weixin_44867712的博客 583

Java-I/O框架06:常见字符编码、字符流抽象类

IOS-8859-1收录了除ASCII外,还包括西欧、希腊语、泰语、阿拉伯语、希伯来语对应的文字符号;UTF-8 针对Unicode码表的可变长字符编码;16.16 字符流抽象类_哔哩哔哩_bilibili。当编码方式和解码方式不一致时,或出现乱码;BGK 简体中文、扩充。BIG5 台湾繁体中文。Reader:字符输入流主要方法。Writer:字符输出流主要方法。GB2312 简体中文。

zhangjinajian759的博客 333

JavaIO系列——常见字符编码,字符流抽象类,FileReader,FileWriter

当解码和编码方式不同会出现乱码! 我们更推荐普及使用utf-8编码用于读取字符流的抽象类。 唯一的方法 子类必须实现的是 read(char[], int, int) 和 close()。 最多 但是,子类将按顺序覆盖此处定义的一些方法 提供更高的效率、附加功能或两者兼而有之。用于写入字符流的抽象类。 唯一的方法 子类必须实现的是 write(char[], int, int)、flush() 和 close()。 然而,大多数子类将覆盖此处定义的一些方法 以提供更高的效率、附加功能或两者兼而有之。使用默认

qq_51553982的博客 703

Java IO字符流常见类进行分析(四)

一、Reader 用于读取字符流的抽象类。子类必须实现的方法只有 read(char[], int, int) 和 close()。但是,多数子类将重写此处定义的一些方法,以提供更高的效率和/或其他功能。 ready() 判断是否准备读取此流。 read() 读取单个字符,这个方法将会阻塞,直到字符可用。 二、BufferedReader 从字符输入流中读取文本,缓冲各个字符,从而实现字

在风雨中奔跑 504

java IO字节流和字符流常见类总结

前述 程序在运行结束后,数据内容就会被内存回收掉,从而消失,为了使一些有用的数据可以被下一次调用该程序时候直接使用,所以需要引入IO的操作将数据从内存中传输到磁盘中,从而实现数据的持久化(或者使用数据库也可以实现数据的持久化)。 数据的传输都是通过两种类型的流:输入流和输出流,这就是IO。 流的继承关系图 需要读入数据使用输入流,需要写入数据使用输出流; 按照操作的数

weisian的博客 7308

java常见的IO字节流/字符流操作

InputStream和OutputStream字节流操作File文件 File file = new File("C://Users//fchen//Desktop//EPL4398046700991_大报文.txt"); InputStream inputStream = new FileInputStream(file); byte[] bytes = new byte[2048]; StringBuffer sb = new StringBuffer(); int len = 0; while ((

奔跑的菜鸡 210

(一)IO常见的字节流、字符流、缓冲流

详解io字节流、字符流、缓冲流

qq_52370789的博客 752

IO流及常见操作代码示例、字节流和字符流区别

在选择字节流还是字符流时,应根据处理的数据类型和需求进行选择。如果处理的是二进制数据,或者需要进行底层的字节操作,可以选择字节流。如果处理的是文本数据,或者需要进行字符集编解码操作,可以选择字符流字符流在底层会使用字节流,但提供了字符集编解码的功能,能够更方便地处理字符数据。字符流适合处理文本数据和字符流式的操作,如读取文本文件、写入字符数据等。字符流在处理数据时会进行字符集编解码操作,可能会略微降低处理效率。字节流适合处理二进制数据和字节流式的操作,如文件复制、网络传输等。

BaoZi969的博客 330

IO字符流API常见用法汇总(JAVA)

Don’t bb , show you code. 好了,废话不多说,下面我将用代码及注释给出我在学习JAVA IO字符流后,对它的理解及用法的总结,希望能对初学者们有点帮助。 import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; import java.io.FileWr...

qq_40826085的博客 253

Java IO 流:字节流、字符流、接口、实现类与阻塞方法

在 Java 中,IO(Input/Output)流是处理数据输入输出的重要部分。无论是从文件、网络还是其他数据源读取数据,或是将数据写入到这些位置,Java 都提供了丰富的流类库来支持这些操作。下面我们将详细介绍 Java IO 流中的字节流、字符流常见的接口、实现类以及阻塞方法。

✨ 欢迎来到【Seal ^_^ 的CSDN博客】!✨ 7201

JAVA中字符流详解

JAVA中字符流详解 字符流:就是在字节流的基础上,加上编码,形成的数据流 字符流出现的意义:因为字节流在操作字符时,可能会有中文导致的乱码,所以由字节流引申出了字符流。 字符输入流:Reader 常用子类:FileReader 文件字符输入流常用方法: read(); read(char[ ]); read(char[ ] ,off...

qq_38830041的博客 176

Java字符流

字符流按照流向可以分为输出字符流(Writer)和输入字符流(Reader), Reader 是一个抽象类,常用的方法如下: public int read() 以字符为单位读取数据 public int read(char ch[]) 将数据读入 char 类型数组,并返回数据长度 public abstract int read(char ch[],in...

qq_43776742的博客 579
上一篇: 常见字节流
下一篇: RandomAccessFile类
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值