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

一、简单介绍

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();//输出是对字符进行操作,因此必须清缓存



版权声明:本文为lpp1234567原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。