IO流-操作与规律

概念:

         流是一个很抽象的概念,可以用手机流量这个概念来帮助理解,就是在两个设备之间来回传输的数据,就可以统称为流。

 

流的分类:

         手机流量的流只是手机和基站之间来回传输,比较简单。但是Java里的流相对就复杂。        根据流向,分为输入流(基站)和输出流(手机),比如:可以是硬盘文件流向硬盘文件,硬盘文件流向内存,还可以是用户输入流向硬盘文件,还可以是网络上的某个地方等等。

         根据流的类型,可以分为,字符流和字节流,比如文字和图片。

 

操作流主要的类:

         Read类:字符流的主要输入流类

         Writer类:字符流的主要输出流类

         InputStream类:字节流的主要输入流类

         OutPutStream类:字节流的主要输出流类

 

借助其他朋友的一张图,可以很好地理解:


该使用哪一个类更合适:

         1.明确源和目的。

         要明确流的来源是来自硬盘,还是内存,或者是用户输入;流的目的地是硬盘,内存还是其他地方?

         2.明确操作的数据是否是寸文本的。

         是:字节流操作

         否:字符流操作

 

当明确以上2个需求以后,就可以确定使用哪一个类的对象来操作了。

 

比如:

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

源:硬盘文件 

目的:硬盘文件

是否是纯文本:是,可以使用Reader和Writer

这样就明确地知道需要上图中的哪一个类了

 

因为是硬盘上的一个文件,所以需要用到文件操作的FileReader和FileWriter类

import java.io.*;

public classCopyTest2 {

  

   public static void main(String args[]) throws IOException{

     

      FileReaderfr = new FileReader("a.txt");

      FileWriterfw = new FileWriter("a_copy1.txt");

     

      char[] a = new char[1024];

      int ch = 0;

     

      while( (ch = fr.read()) != -1){

         fw.write(ch);

      }

      fr.close();

      fw.close();    

   }

}

         上边的代码只是简单地读取,每次读到一个字符串就进行写操作。所以如果需要提高效率,就需要用到跟高级一点的缓冲区的类:BufferReader 和BufferWriter,这两个类提供了一整行的读取方式,可以很方便地提高效率。

 

 

package com.nightten;

import java.io.*;

public classCopyText {

  

   public static void main(String args[]) throws IOException{

     

      FileReaderfr = new FileReader("a.txt");

      BufferedReaderbr = new BufferedReader(fr);

     

      FileWriterfw = new FileWriter("a_copy.txt"); 

      BufferedWriterbw = new BufferedWriter(fw);

     

      Stringline= null;

 

      //读取每一行

      while((line = br.readLine()) != null){

         bw.write(line); //整行写

         bw.newLine(); // 自带的换行方法

      }    

      br.close();

      bw.close();

     

   }

}

 

 

         上边我们使用字符流来复制文件,下边我们使用字符流来复制一下图片,原理都一样。

 

         将一个图片文件中数据存储到另一个文件中。要按照以上格式自己完成二个明确。

1,源:硬盘;目的:硬盘。

2,是否是字符: 否

import java.io.*;

 

public classCopyPng1 {

   public static void main(String ags[]) throws IOException{

     

      FileInputStreamfis= newFileInputStream("a.png");

      FileOutputStreamfos= newFileOutputStream(newFile("a_copy.png"));

               

      int len = 0;

     

      while((len = fis.read()) != -1){

        

         fos.write(len);      

      } 

      fis.close();

      fos.close();

   }

}

 

         还可以把用户键盘录入的数据保存到一个文件中。

分析: 1,源:键盘;目的:硬盘

         2,是否是字符:是

         虽然这里键盘输入的只能是字符,单查看了一下上图和api文档,决定使用InputStreamReader类把字符流转换成字节流再进行存储比较方便。

下边是api文档的一句话:为了达到最高效率,可要考虑在 BufferedReader 内包装InputStreamReader。例如:

 BufferedReader in

   = newBufferedReader(new InputStreamReader(System.in));

下边是实现代码:

import java.io.*;

 

public classInputbykeyboard1 {

   public static void main(String args[]) throws IOException{

     

      BufferedReaderin

         = new BufferedReader(new InputStreamReader(System.in));

     

       FileOutputStream out = new FileOutputStream("bykeyboard.txt");

 

      while(true){

         int line = in.read();

         out.write(line);

 

      }

   }

}

   字符流和字节流可以转换:

字节流转成字符流:InputStreamReader

字符流转成字节流:OutputStreaWriter

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值