JAVA中IO流-字符流 一、IO流概述

1. IO流用户处理设备之间的数据传输;

2. 流按照操作数据分为两种:字节流和字符流;按照流向分为:输入流、输出流;

3. IO流常用四大基类:


  • 字节流的抽象基类:InputStream,OutputStream。
  • 字符流的抽象基类:Reader,Writer。
  • 这4个派生出来的子类名称都是以其父类作为子类名的后缀。


二、字符流

1. 字符流主要用于操作文件的读写。

2. 用FileWriter类实现文件的写

  步骤

  •  创建FileWriter对象,该对象一被初始化就必须要明确被操作的文件。而且该文件会被创建到指定目录下,如果该目录下已有同名文件,将被覆盖。FileWriter fw = new FileWriter("c:\\demo.txt");
  • 调用write方法,将字符串写入到流中。
  • 注意:该步完成之后,文件中没有内容,要刷新之后才会把字符流写到目的地。
  • 刷新流对象中的缓存中的数据,将数据刷新到目的地文件中。fw.flush()。
  • 或者是关闭流,fw.close()方法会先执行fw.flush()。关闭和刷新的区别是,流可以继续使用,close刷新后,会将流关闭。

注意:文件读写中需要抛IOException。

3. 实例

<span style="font-size:14px;">public static voidmain(String[] args) throws IOException {
 //1.创建一个FileWrite对象
 FileWriterfw = new FileWriter("demo.txt",true); //第二个参数为true表示可以续写
 //2.调用write方法,将字符串写入到流中。
 fw.write("123");//此时demo.txt中依然为空。
 //3.刷新或是关闭
 //刷新
 fw.flush();//此时demo.txt中文件内容为123
 fw.write("\r\n456");//此时demo.txt中文件内容为123
                                                                           456;
 //关闭方法
 fw.close();//使用该方法时,可不用fw.flush(),关闭之后,则不能往fw中写入数据
}</span>

4. IO异常处理方式

<span style="font-size:14px;">public classFileWriteDemo {
 
 public static voidmain(String[] args) {
 
  FileWriter fw =null;
 
//最外层的try..catch..finally是3个代码块,所以FileWriter fw = null;只能声明在try外边,不让其他代码块中无法访问另外块中的变量。
 
  try {
 
   //FileWriter fw = new FileWriter("demo.txt");
 
   fw = newFileWriter("demo.txt");
 
  fw.write("123");
 
  } catch(IOException e) {
 
  System.out.println(e.toString());
 
  } finally {
 
   try {
 
    if(fw != null) //为增强代码健壮性,该行代码很关键,若不加该行代码,当new FileWriter抛异常时,finally 中fw为null,此时fw.close()又会抛异常。
 
    fw.close();
 
   } catch(IOException e) {
 
   e.printStackTrace();
 
   }
 
  }
 
 }
 
}</span>

5. 用FileReader实现文件的读

 步骤

  • 创建文件读取流对象和指定名称的文件相关联;注:要保证该文件已经存在,如果不存在,则发生异常FileNoeFoundExcption。
  • 调用读取流对象的read方法;
  • 方式一,单个字符读取static int read();一次读一个字符,而且会自动往下读。返回ascii值。
  • 方式二,把字符读到数组中。

  实例

  方式一实例:

<span style="font-size:14px;">publicclass FileReaderDemo {
public static voidmain(String[] args) throws IOException {
 
 FileReader fr =new FileReader("c:\\1.txt");//文本中存放的是abcdef,
 
 int ch1 =fr.read();//读取单一字符
 
 System.out.println("ch1="+ch1);//输出97
 
 char ch2 =(char)fr.read();
 
 System.out.println("ch2="+ch2);//输出b
 
 //fr.read会继读下一个字符
 
 while(true){
 
  int ch =fr.read();
 
  if(ch!=-1){
 
  System.out.println((char)ch);//输出c d e f
 
  }
 
 }
 
 fr.close();
 
  }
 
}</span>

  方式二实例:

<span style="font-size:14px;">public classFileReaderDemo2 { 
public static voidmain(String[] args) throws IOException {
 
 FileReader fr =new FileReader("c:\\1.txt");//文本中存放的是abcdef,
 
    //定义一个字符数组,用于存储读到的字符。read(char[])返回读到的字符个数。
 
 char[] buf = newchar[1024];//长度为1024的数组,一般定义为1024的倍数长度的数组
 
 int num = 0;
 
 //fr.read(buf)读取多个字符
 
 while((num =fr.read(buf))!=-1){
 
 System.out.println(new String(buf,0,num)); //数组变成字符串
 
 }
 
 fr.close();
 
   }
 
}
  文件读写结合实例:实现文件的拷贝
  public staticvoid copy() throws IOException{
 FileReader fr =new FileReader("c:\\1.txt"); //关联读取文件
 
 FileWriter fw =new FileWriter("c:\\1_copy.txt"); //文件拷贝目的地
 
 int num = 0;
 
 char[] buf = newchar[1024];
 
 while((num=fr.read(buf))!=-1){
 
  fw.write(newString(buf,0,num));
 
 }
 
 fw.close();
 
 fr.close();
 
  }
 
}</span>

6.字符流的缓冲区

  • 提高了对数据的读写效率,缓冲区的出现是为了提高流的操作效率而出现的,所以在创建缓冲区之前,必须要先有流对象。
  • 子类BufferedWriter:将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
  • 步骤
  • 先创建一个字符写入流对象;
  • 创建BufferedWriter对象,将流对象作为BufferedWriter构造方法的参数;
  • 刷新缓冲区(用缓冲技术,别忘记刷新)
  • 关闭缓冲区(关闭缓冲实际就是关闭流对象)
  •  实例
<span style="font-size:14px;">public class BufferedWriterDemo{ 
 publicstatic void main(String[] args) throws IOException { 
  //创建一个字符写入流对象 
  FileWriterfw = new FileWriter("c:\\1.txt"); 
  //为了提高字符写入流效率,加入缓冲技术 
  //只要将需要提高效率的流对象作为参数传递给缓冲区的构造参数即可。 
 BufferedWriter bw = new BufferedWriter(fw); 
  for(intx=1;x<5;x++){ 
  bw.write("abcd"+x); 
  bw.newLine(); //换行,等价\r\n
  bw.flush();//只要用到缓冲区,就要记得刷新。 
  } 
 bw.close();//其实关闭缓冲区,就是在关闭缓冲区中的流对象。 
 } 
}
子类BufferedReader:将文件中文本读入到缓冲区
步骤
创建读取流对象和文件相关联;
将字符读取流对象作为参数传递给缓冲对象的构造参数对象中;
实例
                public class BufferedReaderDemo{ 
 publicstatic void main(String[] args) throws IOException { 
 //创建一个读取流对象和文件关联 
 FileReaderfr = new FileReader("c:\\1.txt"); 
 //为了提高效率,加入缓冲技术。把字符读取流对象作为参数传递给缓冲对象中的构造参数 
 BufferedReaderbf = new BufferedReader(fr);  
 String line= null; 
 while((line= bf.readLine())!=null){ 
 System.out.println(line); //把文本中的文字一行行打印到屏幕上
  } 
 } 
}</span>
  •  缓冲技术读写综合示例:    
<span style="font-size:14px;">public class CopyTextByBuf {
 publicstatic void main(String[] args) {
 BufferedReader br = null;
 BufferedWriter bw = null;
  try{
   br =new BufferedReader(new FileReader("c:\\1.txt"));
   bw =new BufferedWriter(new FileWriter("c:\\1_copy.txt"));
  String line = null;
   //readLine()返回回车字符之前的字符,不包含回车符字符
  while((line=br.readLine())!=null){
   bw.write(line);
   bw.newLine();//每读取一行之后 换行
   bw.flush();//刷新
   }
  }
 catch(IOException e){
   thrownew RuntimeException("读写失败。");
  }
  finally{
   try{
   if(br!=null){
    br.close();
    }
   }
  catch(IOException e){
   throw new RuntimeException("读取文件关闭失败。");
   }
   try{
   if(bw!=null){
    bw.close();
    }
   }
  catch(IOException e){
   throw new RuntimeException("写入文件关闭失败。");
   }
  }
 }
}</span>