Java.io包中的流的输入输出详解2(字符流) .

好了,下面我们就开始学习字符流吧。
Reader类和Writer类是以“字符”为对象进行输入和输出。如果要对字符,字符串或者文件进行输入输出操作时,请尽量首先使用Reader.Writer类。

同样,Reader和Writer也是抽象类。
那么,我们来认识下他们的方法。

Reader的方法

close()
          关闭该流并释放与之关联的所有资源。
 void mark(int readAheadLimit)
          标记流中的当前位置。
 boolean markSupported()
          判断此流是否支持 mark() 操作。
 int read()
          读取单个字符。
 int read(char[] cbuf)
          将字符读入数组。
abstract  int read(char[] cbuf, int off, int len)
          将字符读入数组的某一部分。
 int read(CharBuffer target)
          试图将字符读入指定的字符缓冲区。
 boolean ready()
          判断是否准备读取此流。
 void reset()
          重置该流。
 long skip(long n)
          跳过字符。


Writer的方法

append(char c)
          将指定字符添加到此 writer。
 Writer append(CharSequence csq)
          将指定字符序列添加到此 writer。
 Writer append(CharSequence csq, int start, int end)
          将指定字符序列的子序列添加到此 writer.Appendable。
abstract  void close()
          关闭此流,但要先刷新它。
abstract  void flush()
          刷新该流的缓冲。
 void write(char[] cbuf)
          写入字符数组。
abstract  void write(char[] cbuf, int off, int len)
          写入字符数组的某一部分。
 void write(int c)
          写入单个字符。
 void write(String str)
          写入字符串。
 void write(String str, int off, int len)
          写入字符串的某一部分。

那么基类的方法列出来了。


那么下面我们就开始学习Reader和Writer的子类InputStreamReader和OutputStreamWriter类

 

在I/O中,除了字节流和字符流之外,还存在一组字节流与字符流进行转换的类:

 

InputStreamReader和OutputStreamWriter类

 

InputStreamReader是输入的字节流通过字符流的桥梁。它按照一定的字符集读取字节并将其解码为字符。从而将字节流转换成字符流。
OutputStreamWriter是输出的字符流通向字节流的桥梁。它将字符流转换成字节流

 

整个过程是:InputStreamReader按照一定的字符集读取字节并将其解码为字符,在保存文件的时候,必须得使用OutputStreamWriter将内存中的字符数据变成字节流保存。

案例:实现一个文件的复制


import java.io.*;
public class InputStreamReader_OutputStreamWriter {

 public static void main(String[] args) {
  try {
   //构造FileInputStream
   FileInputStream fis=new FileInputStream("D://a.txt");
   //为FileInputStream加上字符处理功能
   InputStreamReader isr=new InputStreamReader(fis);
   //构造FileOutputStream
   FileOutputStream fos=new FileOutputStream("D://a2.txt");
   //为FileOutputStream加上字符处理功能
   OutputStreamWriter osr=new OutputStreamWriter(fos);
   int ch=0;
   //以字符方式显示文件内容
   //从中发现了,read方法为一个字节一个字节来读的
   while((ch=isr.read())!=-1){
    System.out.print((char)ch);
    osr.write(ch);
   }
   System.out.println("文件复制完毕");
   //关闭流
   osr.close();
   fos.close();
   isr.close();
   fis.close();
   
   
  } catch (FileNotFoundException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
   System.out.println("没有指定文件");
  }catch(IOException ex){
   ex.printStackTrace();
  }

 }

}

执行之后,我们就发现D盘多了一个a2.txt,并且和a.txt里面内容的一模一样。

那么下面我们继续学习FileReader和FileWriter
这两个东西没有太大的作用。就是如果是用来读取文件的话就比较便捷而已。因为他提供好了一些方法.

 

照样是复制一个文件

 

import java.io.*;
public class FileReader_FileWriter {

 public static void main(String[] args) {
   
  try {
    //构造FileReader
   FileReader fr=new FileReader("D://a.txt");
   //构造FileWriter
   FileWriter fw=new FileWriter("D://a2.txt");
   int in=0;
   char[]temp={'\r','\n'};
   while((in=fr.read())!=-1){
    if(in=='\n'){
     fw.write(temp);
    }else{
     fw.write(in);
    }
   }
   
   fw.close();
   fr.close();
   System.out.print("文件复制完毕");
  } catch (FileNotFoundException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }catch(IOException ex){
   ex.printStackTrace();
  }

 }

}


那么下面,我们像处理字节流一样,多一个“第三者”:BufferedReader和BufferedWriter

 

加入这个缓冲流之后有什么作用呢?
效率更好。

这个也是缓冲流:和BufferedInputStream和BufferedOutputStream一样都是缓冲流

BufferedReader尽量从文件中读入字符数据并放入缓冲区,如果之后若使用read()方法的话,就会从缓冲区中进行读取。如果缓冲区数据不足才会从文件中读取。如果没有缓冲,则每次都会调用read()和readLine()都会导致从文件中读取字节,并转换成字符。这个是非常低效的。
对于BufferedWriter也是一样,先存储入缓冲区中,如果缓冲区中的数据满了之后,才会一次行进行写出。

BufferedReader

close()
          关闭该流并释放与之关联的所有资源。
 void mark(int readAheadLimit)
          标记流中的当前位置。
 boolean markSupported()
          判断此流是否支持 mark() 操作(它一定支持)。
 int read()
          读取单个字符。
 int read(char[] cbuf, int off, int len)
          将字符读入数组的某一部分。
 String readLine()
          读取一个文本行。
 boolean ready()
          判断此流是否已准备好被读取。
 void reset()
          将流重置到最新的标记。
 long skip(long n)
          跳过字符。

BufferedWriter

close()
          关闭此流,但要先刷新它。
 void flush()
          刷新该流的缓冲。
 void newLine()
          写入一个行分隔符。
 void write(char[] cbuf, int off, int len)
          写入字符数组的某一部分。
 void write(int c)
          写入单个字符。
 void write(String s, int off, int len)
          写入字符串的某一部分。


照样是复制文件

import java.io.*;
public class BufferedRead_BufferedWriter {
 public static void main (String[] args) {
  try{
 
      //构造低层输入流
      FileReader fr=new FileReader("D://a.txt");
      //构造高层输入流
      BufferedReader br=new BufferedReader(fr);
      
      //构造输出流
      FileWriter fw=new FileWriter("D://a2.txt");
      BufferedWriter bw=new BufferedWriter(fw);
      
      //读写操作
      String line="";
      while((line=br.readLine())!=null){
       System.out.println (line);
       //写到文件去
       bw.write(line);
       //换行
       bw.newLine();
      }
      //关闭流
      br.close();
      fr.close();
      bw.close();
      fw.close();  
  }catch(FileNotFoundException ex){
   ex.printStackTrace();
  }catch(IOException ex){
   ex.printStackTrace();
  }
    }
}


那么还有PrintWriter的类,这里就不多说了。使用的话也是比较少的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值