黑马程序员_IO流使用规律

     ----------- android培训java培训、java学习型技术博客、期待与您交流! ------------

Java的IO流体系中有很多的流对象,在实际编程时到底该如何确定使用那一个呢?

可以根据以下规律进行选择(三个明确):

1、明确源和目的:

       源:输入流。用InputStream、或Reader体系;

       目的:输出流。用OutputStream、或Writer体系;

2、明确数据是否是纯文本:

       是:用字符流;

       否:用字节流;

 3、明确设备:

       源设备:文件、内存、键盘等。据此选择具体的输入流对象;

       目的设备:文件、内存、控制台等;据此选择具体的输出流对象。

通过前两个"明确"已经可以确定使用哪个体系,之后再根据第三个"明确"很容易确定使用哪个具体的流对象。(之后还可以根据是否需要提高效率,选择是否用对应的Buffered***类进行装饰。)


示例1:

需求:将一个文本文件的数据存储到另一个文件中,即复制文件。

分析:此需求中源和目的都存在,分别进行分析如下:

            对于源-->有InputStream、Reader体系可选;

            数据是纯文本-->选择Reader体系;

            源设备是文件-->选择FileReader类;

            ----------------------------------------------

            对于目的-->有OutputStream、Writer体系可选;

            数据是纯文本-->选择Writer体系;

            目的设备是文件-->选择FileWriter。

代码:(下面的代码会将当前文件夹下的TestJava.java文件复制到C盘下的copy.txt文件中)

import java.io.*;
public class IODemo{
    public static void main(String[] args){
          BufferedReader br=null;
          BufferedWriter bw=null;
          try{
             //源:FileReader。用BufferedReader进行装饰,以提高效率。
             br=new BufferedReader(new FileReader("TestJava.java"));
          
             //目的:FileWriter。用BufferedWriter进行装饰,以提高效率。
             bw=new BufferedWriter(new FileWriter("E:\\copy.txt"));

             //进行读写操作
             String line=null;
             while((line=br.readLine())!=null){
               bw.write(line);
               bw.newLine();//换行
               bw.flush();//将数据从缓冲区中刷到目的文件中
             }
          }catch(IOException e){
             System.out.println("复制失败");
          }finally{
             try{
                if(br!=null) 
                  br.close();
                if(bw!=null)
                  bw.close();
             }catch(IOException e){
                System.out.println("关闭流失败");
             }
          }
          
    }
}

示例2:

需求:将键盘录入的内容保存到文件中。

分析:此需求中源和目的都存在,分别进行分析如下:

            对于源-->有InputStream、Reader体系可选;

            数据是纯文本-->选择Reader体系;

            源设备是键盘-->选择System.in类;但此类是字节流,不属于Reader体系,

                                         为此想到要使用转换流,使用InputStreamReader类;

            ----------------------------------------------

            对于目的-->有OutputStream、Writer体系可选;

            数据是纯文本-->选择Writer体系;

            目的设备是文件-->选择FileWriter。

代码:

import java.io.*;
public class IODemo{
    public static void main(String[] args){
          BufferedReader br=null;
          BufferedWriter bw=null;
          try{
             //源:System.in、InputStreamReader。用BufferedReader进行装饰,以提高效率。
             br=new BufferedReader(new InputStreamReader(System.in));
          
             //目的:FileWriter。用BufferedWriter进行装饰,以提高效率。
             bw=new BufferedWriter(new FileWriter("E:\\save.txt"));

             //进行读写操作
             String line=null;
             while((line=br.readLine())!=null){
               if(line.equals("over"))//定义结束标签
                  break;
               bw.write(line);
               bw.newLine();//换行
               bw.flush();//将数据从缓冲区中刷到目的文件中
             }
          }catch(IOException e){
             System.out.println("保存数据失败");
          }finally{
             try{
                if(br!=null) 
                  br.close();
                if(bw!=null)
                  bw.close();
             }catch(IOException e){
                System.out.println("关闭流失败");
             }
          }
          
    }
}

示例3:

需求:对示例2进行扩展,将键盘录入按照指定编码(UTF-8)保存到文件中。     

分析:"源"部分跟示例2相同,仍使用InputStreamReader;

            对于目的,因为要指定编码表,因此不能再使用FileWriter(该类使用的是系统默认编码),

            而要使用OutputStreamWriter(内部封装FileOutputStream),因为此类在进行构造时可以

            指定编码方式。  

代码:

import java.io.*;
public class IODemo{
    public static void main(String[] args){
          BufferedReader br=null;
          BufferedWriter bw=null;
          try{
             //源:System.in、InputStreamReader。用BufferedReader进行装饰,以提高效率。
             br=new BufferedReader(new InputStreamReader(System.in));
          
             //目的:OutputStreamWriter、FileOutputStream。
             //用BufferedWriter进行装饰,以提高效率。
             bw=new BufferedWriter(new OutputStreamWriter
                    (new FileOutputStream("E:\\save.txt"),"UTF-8"));

             //进行读写操作
             String line=null;
             while((line=br.readLine())!=null){
               if(line.equals("over"))//定义结束标签
                  break;
               bw.write(line);
               bw.newLine();//换行
               bw.flush();//将数据从缓冲区中刷到目的文件中
             }
          }catch(IOException e){
             System.out.println("保存数据失败");
          }finally{
             try{
                if(br!=null) 
                  br.close();
                if(bw!=null)
                  bw.close();
             }catch(IOException e){
                System.out.println("关闭流失败");
             }
          }
          
    }
}


     



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值