六IO流技术

IO流技术

IO流的基本概念

   ·流的原理

  1. 在java程序中,对于数据的输入\输出操作以“流”(stream)方式进行;
  2. J2SDK提供了各种各样的“流”类,用以获取不同种类的数据;程序中通过标准的方法输入或输出数据;
  3. java的流类型一般位于java.io包中

   ·流的概念

  数据源:1.data source. 提供原始数据的原始媒介。常见的:数据库、文件、其他程序、内存、网络连接、IO设备。

      2.数据源就像水箱,流就像水管中流着的水流,程序就是我们最终的用户。流是一个抽象、动态的概念,是一连串连续动态的数据集合。

流的细分和体系_四大抽象类

   ·流的分类

  流的方向:1.输入流:数据源到程序(InputStream、Reader读进来)

       2.输出流:程序到目的地(OutPutStream、Writer写出去)

  处理数据单元:1.字节流:按照字节读取数据(InputStream、OutputStream)

         2.字符流:按照字符读取数据(Reader、Writer)

  注意:输入输出是相对于程序而言,而不是相对于源和目标而言。

  功能不同:1.节点流:可以直接从数据源或目的地读写数据。

       2.处理流(包装流):不直接连接到数据源或目的地,是其他流进行封装。目的主要是简化操作和提高性能。

  节点流和数据流的处理关系:1.节点流处于io操作的第一线,所有操作必须通过他们进行;

               2.处理流可以对其他流进行处理(提高效率或操作灵活性)

   ·IO流的体系

  InputStream和OutputStream:java语言中最基本的两个字节输入输出类。

               其他所有字节输入输出流类都继承自这两个基类。

               这两个类都是抽象类,不能创建它们的实例,只能使用它们的子类。

  Reader和Writer:java语言中最基本的两个字符输入输出类。

文件字节流

   ·FileInputStream/FileOutputStream

  使用FileInputStream读取文件内容

  1.abstract int read();

 1 package com.zqf.ioproject;
 2 
 3 import java.io.File;
 4 import java.io.FileInputStream;
 5 import java.io.FileNotFoundException;
 6 import java.io.IOException;
 7 
 8 public class TestInputStream {
 9     public static void main(String[] args) throws IOException {
10         //(1)数据源与应用程序之间搭建管理(通过创建对象)
11         FileInputStream fis = new FileInputStream(new File("C:\\test.txt"));
12         //(2)从数据源开始向程序中读数据
13         int count = fis.available();        //统计文件中字符的个数
14         System.out.println(count);
15         //中转站比较小,一次读一个字节
16         //System.out.println(fis.read( ));    //读取一个字节
17         //System.out.println(fis.available());
18         int buf = 0;    //存储读到的字节
19         while((buf=fis.read())!=-1){
20             System.out.println((char)buf);
21         }
22         //(3)关闭
23         fis.close();
24     }
25 }

 

  2.int read(byte b[]);

 1 package com.zqf.ioproject;
 2 
 3 import java.io.FileInputStream;
 4 import java.io.FileNotFoundException;
 5 import java.io.IOException;
 6 
 7 public class TestInputStream2 {
 8     public static void main(String[] args) throws IOException {
 9         //(1)搭桥
10         FileInputStream fis = new FileInputStream("C:\\test.txt");
11         //(2)创建大一些的中转站
12         byte [] buf = new byte[1024];
13         int len = 0;    //用于存储每次读到的实际字符
14         while((len=fis.read(buf))!=-1){
15             //借助String类构造方法
16             System.out.println(new String(buf,0,len));
17         }
18         //(3)关闭
19         fis.close();
20     }
21 }

 

  3.int read(byte b[],int off,int len);

  4.int available();

  5.close();

  使用FileOutputStream写内容到文件 

  1.abstract void write(int b);

  2.void write(byte b[]);

  3.void write(byte b[],int off,int len);

  4.void flush();

  5.void close()

 1 package com.zqf.ioproject;
 2 
 3 import java.io.FileNotFoundException;
 4 import java.io.FileOutputStream;
 5 import java.io.IOException;
 6 
 7 public class TestOutputStream {
 8     public static void main(String[] args) {
 9         //(1)搭桥
10         FileOutputStream fos=null;
11         try {
12             fos = new FileOutputStream("C:\\test.txt");
13             //(2)写数据,一次写一个字节
14             //fos.write(97);
15             //(3)一次写多个字节
16             byte[] buf ="helloworld".getBytes();
17             fos.write(buf);
18         } catch (FileNotFoundException e) {
19             // TODO Auto-generated catch block
20             e.printStackTrace();
21         } catch (IOException e) {
22             // TODO Auto-generated catch block
23             e.printStackTrace();
24         }finally{
25             //(3)关闭
26         try {
27             if(fos!=null){
28                 fos.close();
29             }
30         } catch (IOException e) {
31             // TODO Auto-generated catch block
32             e.printStackTrace();
33         }
34         }
35     }
36 }

使用字节流实现文件复制

   ·文件复制的原理

   ·文件复制的代码实现

 1 package com.zqf.ioproject;
 2 
 3 import java.io.FileInputStream;
 4 import java.io.FileNotFoundException;
 5 import java.io.FileOutputStream;
 6 import java.io.IOException;
 7 
 8 public class TestFileCopy {
 9     public static void main(String[] args) {
10         //数据源是文件
11         FileInputStream fis=null;
12         //目的地
13         FileOutputStream fos;
14         try {
15             fis = new FileInputStream("D:\\test.txt");
16             fos = new FileOutputStream("C:\\target.txt");
17             
18             byte [] buf=new byte[1024];        //中转站
19             int len=0;    //用于存储每次读到的字节个数
20             while((len=fis.read(buf))!=-1){
21                 fos.write( buf,0,len);
22             }
23             
24             /*int b=0;//用于存储读到的字节,(中转站)
25             while ((b=fis.read())!=-1){
26                 //写入文件
27                 fos.write(b);
28             }*/
29         } catch (FileNotFoundException e) {
30             // TODO Auto-generated catch block
31             e.printStackTrace();
32         } catch (IOException e) {
33             // TODO Auto-generated catch block
34             e.printStackTrace();
35         }finally{
36         //关闭
37         try {
38             if(fis!=null){
39                 fis.close();
40             }
41         } catch (IOException e) {
42             // TODO Auto-generated catch block
43             e.printStackTrace();
44         }
45         }
46     }
47 }

文件字符流

   ·Reader/Writer

  使用Reader读取文件内容

  1. int read();
  2. int read(char [] cbuf);
  3. int read (char [] cbuf,int off,int len);
  4. int available();
  5. close();
     1 package com.zqf.reader;
     2 
     3 import java.io.FileNotFoundException;
     4 import java.io.FileReader;
     5 import java.io.IOException;
     6 
     7 public class TestFileReader {
     8     public static void main(String[] args) throws IOException {
     9         //(1)搭桥
    10         FileReader reader = new FileReader("C:\\test.txt");
    11         //(2)读取
    12         //int b = reader.read();         //读到的字符的int类型数据
    13         //System.out.println((char)b);
    14         /*int b=0;    //用于存储每次读到的字符数据的整数值
    15         while ((b=reader.read())!=-1){
    16             System.out.println((char)b);
    17         }*/
    18         
    19         char [] cbuf = new char[1024];
    20         int len = 0;    //用于存储读到的字符的个数
    21         while((len=reader.read(cbuf))!=-1){
    22             System.out.println(new String (cbuf,0,len));
    23         }
    24         //(3)关闭
    25         reader.close();
    26     }
    27 }

     

   ·使用Writer写内容到文件

  1. void write(int c);
  2. void write(char[] cbuf);
  3. abstract void write(char [] cbuf,int off,int len);
  4. void write(String str);
  5. abstract void flush()

 

 1 package com.zqf.writer;
 2 
 3 import java.io.FileWriter;
 4 import java.io.IOException;
 5 
 6 public class TestWriter {
 7     public static void main(String[] args)  {
 8         //创建对象
 9         FileWriter writer=null;
10         try {
11             writer = new FileWriter("C:\\a.txt");
12             //写数据
13             writer.write("你好吗?");    //写到缓冲区中
14         } catch (IOException e) {
15             // TODO Auto-generated catch block
16             e.printStackTrace();
17         }finally{
18         //关闭
19             if(writer!=null){
20                 try {
21                     writer.close();
22                 } catch (IOException e) {
23                     // TODO Auto-generated catch block
24                     e.printStackTrace();
25                 }
26             }
27         }
28     }
29 }

 

posted @ 2019-04-03 20:09  齐方  阅读(389)  评论(0编辑  收藏  举报