【java】字符流

字符串的解码编码问题
 getEncoding() 获取此流使用的字符编码的名称。

(一般中文使用GBK编码 国际通用为UTF-8)
 编码 
* byte[] getBytes() 使用平台默认的字符集将该String编码为一系列字节,将结果存储到新的字节数组中
* byte[] getBytes(String charsetName) 使用指定的字符集将该String编码为一系列字节,将结果存储到新的字节数组中
 解码
 *String(byte[] bytes) 通过平台默认的字符集解码指定的字节数组来构造新的String
 *String(byte[] bytes,String charsetName) 通过指定的字符集解码指定的字节数组来构造新的String

字符流输入流InputStreamReader 与 字符输出流 OutputStreamWriter的构造方法
* OutputStreamWriter(OutputStream out)
* OutputStreamWriter(OutputStream out,String charsetName)
 

字符流写数据的五种方式
 * void write(int c) 写一个字符
 * void write(char[] cbuf) 写入一个字符数组
 * void write(char[]cbuf,int off,int len) 写入字符数组的一部分
 * void write(String str) 写入一个字符串
 * void write(String str,int off,int len) 写入一个字符串的一部分


 字符流读数据的两种方式
 * int read() 一次读一个字符数据
 * int read(char[] cbuf) 一次读一个字符数组数据

转换流 用于读写文件的便携类 

FileReader extends OutputStreamWriter 用于读取文件

FileWrite extends InputStreamReader 用于写入文件

字符流实例

实际上,字符流就是字节流与编码表的结合;字节流默认不使用缓冲区,字符流使用缓冲区。

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class Ooutputstreamwrite {

	public static void main(String[] args) throws IOException {

		OutputStreamWriter o= new OutputStreamWriter(new FileOutputStream("D:\\FILE\\a.txt"),"UTF-8");
		/* 构造方法
		 * OutputStreamWriter(OutputStream out)
		 * OutputStreamWriter(OutputStream out,String charsetName) */
		InputStreamReader i= new InputStreamReader(new FileInputStream("D:\\FILE\\java.txt"),"UTF-8");

		char[]  b=new char[100];
		while(i.read(b)!=-1) {
			o.write(b);
		}
		o.close();
		i.close();

	}

}

 字符缓冲流 BufferedReader 与 BufferedWriter

回顾一下字节缓冲流,二者类似

BufferedReader 特有方法

public String readLine() 读一行文字,结构包括行的内容的字符串,不包括任何的行终止符,如果到达流的结尾,则返回null

BufferedWriter 特有方法

void newLine() 写一行行分隔符,行分隔符字符串由系统属性定义

<think> 我们参考提供的引用资料来回答关于Java字符流的问题。 根据引用[1]和[2]:Java IO流按照操作数据的不同分为字节流和字符流字符流专门用于处理字符数据,它们能够自动处理字符编码问题,简化了字符数据的读写。 字符流的两个核心抽象类:Reader和Writer。 引用[2]指出:在IO包中,字符流的输入输出流分别用java.io.Reader和java.io.Writer表示。 引用[5]提供了关于字符流更详细的内容,包括转换流(如OutputStreamWriter)和编码解码问题。 因此,我们可以将回答分为以下几个部分: 1. 字符流概述 2. 字符流的核心类:Reader和Writer 3. 字符流的使用方法(包括转换流) 4. 编码与解码 5. 缓冲流(BufferedReader/BufferedWriter)提高效率 注意:根据引用[3]和[4],缓冲流是一种包装流,用于提高IO效率。对于字符流,同样有缓冲流。 另外,引用[4]提到了使用try-with-resources自动关闭资源。 下面开始组织回答: </think> ### Java字符流介绍 Java字符流Java I/O体系中专门处理**字符数据**的API,基于Unicode编码设计,适用于文本数据处理。与字节流直接操作字节不同,字符流通过自动处理字符编码和解码,简化了文本读写操作。 #### 一、字符流核心类 1. **输入流** - `Reader`:抽象基类 - 常用子类: - `InputStreamReader`:字节到字符的桥梁(转换流) - `FileReader`:文件字符输入流(`InputStreamReader`子类) - `BufferedReader`:带缓冲的字符输入流 2. **输出流** - `Writer`:抽象基类 - 常用子类: - `OutputStreamWriter`:字符到字节的桥梁(转换流) - `FileWriter`:文件字符输出流(`OutputStreamWriter`子类) - `BufferedWriter`:带缓冲的字符输出流 #### 二、字符流核心方法 ```java // 读取方法(Reader) int read():读取单个字符 → 返回字符的ASCII值(-1表示结束) int read(char[] cbuf):读取字符数组 → 返回实际读取长度 // 写入方法(Writer) void write(int c):写入单个字符 void write(char[] cbuf):写入字符数组 void write(String str):写入字符串 ``` #### 三、关键特性 1. **编码与解码** - 编码(字符→字节):`String.getBytes(charsetName)` - 解码(字节→字符):`new String(bytes, charsetName)` - 示例(引用[5]): ```java byte[] bytes = {97, 98, 99}; String str = new String(bytes, "UTF-8"); // 解码为"abc" ``` 2. **转换流** - `InputStreamReader`/`OutputStreamWriter`解决字节流→字符流转换: ```java // 构造方法(引用[5]) OutputStreamWriter(OutputStream out) // 默认编码 OutputStreamWriter(OutputStream out, String charsetName) // 指定编码 ``` 3. **缓冲流优化** - 包装基础流提升性能(引用[3][4]): ```java // 缓冲读取示例 try (BufferedReader br = new BufferedReader(new FileReader("file.txt"))) { String line; while ((line = br.readLine()) != null) System.out.println(line); } // try-with-resources自动关闭 ``` #### 四、字符流使用场景 1. 文本文件读写(`.txt`, `.csv`等) 2. 需处理字符编码的场景(如UTF-8/GBK转换) 3. 需按行读取内容的场景(`BufferedReader.readLine()`) 4. 需高频读写文本时(缓冲流减少I/O操作) > ⚠️ **注意事项** > - 字符流**不能**处理非文本数据(如图片、音频) > - 必须显式关闭流或使用`try-with-resources`(引用[4]) > - 指定编码避免乱码(推荐UTF-8) ### 典型示例 写入文件(引用[4]优化版): ```java try (OutputStreamWriter writer = new OutputStreamWriter( new FileOutputStream("data.txt"), StandardCharsets.UTF_8)) { writer.write("Hello, 字符流!"); // 自动编码为UTF-8字节 } // 自动关闭流并刷新缓冲区 ``` --- ### 相关问题 1. 字符流和字节流的本质区别是什么?各自适用哪些场景? 2. 为什么处理中文文本时推荐使用字符流而非字节流? 3. 如何通过`BufferedReader`实现高效的大文本文件读取? 4. 字符流处理过程中出现乱码的可能原因有哪些?如何解决? [^1][^2][^4][^5]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老坛酸菜吃鸭子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值