字节流和字符流的转换(及BufferedReader类的重要性)

Java编程中,字节流与字符流可以通过InputStreamReader和OutputStreamWriter进行转换,而BufferedReader和BufferedWriter提供高效的读写。使用缓冲流可以避免频繁的转换操作,提高效率。例如,使用BufferedReader包装InputStreamReader,BufferedWriter包装OutputStreamWriter,以优化I/O操作。在转换时,InputStreamReader和OutputStreamWriter分别接受InputStream和OutputStream,并可指定字符集。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、简单介绍

Java支持字节流和字符流,也支持它们之间的转换。通过两个类实现:InputStreamReader、OutputStreamWriter。


1.  InputStreamReader

java.lang.Object
  java.io.Reader
    java.io.InputStreamReader

public class InputStreamReader
  
   extends 
   Reader
  

InputStreamReader 继承自Reader字符流类,将读取的字节解码为字符。(在内存中处理的是字符)

2.  OutputStreamWriter

java.lang.Object
  java.io.Writer
      java.io.OutputStreamWriter

public class OutputStreamWriter
  
   extends 
   Writer
  

OutputStreamWriter 继承自Writer字符流类,将向其写入的字符编码为字节。(在内存中处理的是字符)


二、BufferedReader、BufferedWriter类的使用

为了达到最高的效率,避免频繁地进行字符与字节间的相互转换,最好不要直接使用InputStreamReader、OutputStreamWriter这两个类来进行读写,应尽量使用ufferedWriter类包装OutputStreamWriter类,用BufferedReader类包装InputStreamReader类。例如:


BufferedWriter out  =  new BufferedWriter(newOutputStreamWriter(System.out));
BufferedReader in  =  new BufferedReader(new InputStreamReader(System.in));


字节流中没有BufferedReader类,是由于字符流在读写过程中需要借助缓存,而字节流不需要。

缓冲的优点:从字符输入流中读取文本,缓冲各个字符,从而提供字符、数组和行的高效读取。若没有缓冲,则每次调用read()或readLine()都会导致直接从文本读取字节,并将其转换为字符后返回,这是及其低效的。


1.  BufferedReader类

java.lang.Object
  java.io.Reader
      java.io.BufferedReader

public class BufferedReader
  
   extends 
   Reader
  

继承自Reader类,是字符流。

构造方法摘要
BufferedReader(Reader in)
          创建一个使用默认大小输入缓冲区的缓冲字符输入流。


2.  BufferedWriter类

java.lang.Object
  java.io.Writer
      java.io.BufferedWriter

public class BufferedWriter
 
  extends 
  Writer
 
 

 
继承自Writer类,是字符流。

构造方法摘要
BufferedWriter(Writer out)
          创建一个使用默认大小输出缓冲区的缓冲字符输出流。


三、字节流、字符流转换使用方法

1.  InputStreamReader

有两个主要的构造函数:

InputStreamReader(InputStream in)// 用默认字符集创建一个InputStreamReader对象

InputStreamReader(InputStream in,String CharsetName)// 接受已指定字符集名的字符串,并用该字符集创建对象


示例):

BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
String str = null;
while(true)
{
System.out.print("输入的数字:");
try
{
str = in.readLine();//  public  String  readLine()
}
catch(Exception e)
{

}

int i = -1;

try
{
i = Integer.parseInt(str);
System.out.println("输入的数字修改后为:" + i);
break;
}
catch(Exception e)
{

}

输入是对字符进行操作,因此不用清缓存

2.  OutputStreamWriter

有两个主要的构造函数:

OutputStreamWriter(OutputStream in)    // 用默认字符集创建一个OutputStreamWriter对象

OutputStreamWriter(OutputStream in,String CharsetNarme)    // 接受已指定字符集名的字符串,并用该字符集创建OutputStreamWriter对象


示例(不考虑异常):

BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));

String str = "kooljjhhnb";

out.write(str,0,str.length);

out.close();//输出是对字符进行操作,因此必须清缓存


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值