码迷,mamicode.com
首页 > 其他好文 > 详细

十一、I/O流(阶段三)

时间:2021-01-28 11:40:30      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:方法   系统   fileinput   dom   tween   data   err   效率   示例   

一、什么是流

什么是流(Stream),流就是一系列的数据(像01010001010010这种)

当不同的介质之间有数据交互的时候,JAVA就使用流来实现。
数据源可以是文件,还可以是数据库,网络甚至是其他的程序

比如读取文件的数据到程序中,站在程序的角度来看,就叫做输入流
输入流: InputStream
输出流:OutputStream

技术图片

 

 

二、流的分类

1、按数据流的方向不同:输入流,输出流。

(1)通常程序需要从外部获取/输出信息
          这个“外部”范围很广,包括诸如键盘、显示器、文件、磁盘、网络、另外一个程序等。
          “信息”也可以是任何类型的,例如一个对象、一串字符、图像、声音等。
(2)通过使用java.io包中的输入/输出流类就可以达到输入输出信息的目的

输入是指数据流入程序。
输出是指数据从程序流出。

2、按处理数据单位不同:字节流,字符流。

(1) 字节流:数据流中最小的数据单元是字节。
(2)字符流:数据流中最小的数据单元是字符, Java中的字符是Unicode编码,一个字符占用两个字节。

技术图片

 

3、按功能不同:节点流,处理流。

(1)程序用于直接操作目标设备所对应的类叫节点流。
(2)程序通过一个间接流类去调用节点流类,以达到更加灵活方便地读写各种类型的数据,这个间接流类就是处理流。

 技术图片

 

4、节点流与处理流的区别

(1)节点流是低级流,直接跟数据源相接。

    处理流(也叫包装流)把节点流包装了一层,属于修饰器设计模式,不会直接与数据源相连,通过处理流来包装节点流既可以消除不同节点流的实现差异,也可以提供更方便的方法来完成输入输出。

(2)处理流的功能主要体现在以下两个方面:

       1.性能的提高:主要以增加缓冲的方式来提高输入输出的效率。

       2.操作的便捷:处理流可能提供了一系列便捷的方法来一次输入输出大批量的内容,而不是输入/输出一个或多个水滴处理流可以嫁接在任何已存在的流的基础上。

三、节点流

1、节点流类型

技术图片

(1)File 文件流。对文件进行读、写操作 :FileReader、FileWriter、FileInputStream、FileOutputStream。、
(2)Memory
       1)从/向内存数组读写数据: CharArrayReader与 CharArrayWriter、ByteArrayInputStream与ByteArrayOutputStream。
       2)从/向内存字符串读写数据 StringReader、StringWriter、StringBufferInputStream。
(3)Pipe管道流。 实现管道的输入和输出(进程间通信): PipedReader与PipedWriter、PipedInputStream与PipedOutputStream。

 

 2、节点流执行的图示

技术图片

 

四、处理流

1、处理流的类型

技术图片

 

- (1)Buffering缓冲流:在读入或写出时,对数据进行缓存,以减少I/O的次数:BufferedReader与BufferedWriter、BufferedInputStream与BufferedOutputStream。
- (2)Filtering 滤流:在数据进行读或写时进行过滤:FilterReader与FilterWriter、FilterInputStream与FilterOutputStream。
- (3)Converting between Bytes and Characters 转换流:按照一定的编码/解码标准将字节流转换为字符流,或进行反向转换(Stream到Reader):InputStreamReader、OutputStreamWriter。
- (4)Object Serialization 对象流 :ObjectInputStream、ObjectOutputStream。
- (5)DataConversion数据流: 按基本数据类型读、写(处理的数据是Java的基本类型(如布尔型,字节,整数和浮点数)):DataInputStream、DataOutputStream 。
- (6)Counting计数流: 在读入数据时对行记数 :LineNumberReader、LineNumberInputStream。
- (7)Peeking Ahead预读流: 通过缓存机制,进行预读 :PushbackReader、PushbackInputStream。
- (8)Printing打印流: 包含方便的打印方法 :PrintWriter、PrintStream。

 

2、处理流执行的图示

技术图片

 

 

3、处理流之--缓冲流

 

【1】对I/O进行缓冲是一种常见的性能优化,缓冲流为I/O流增加了内存缓冲区,增加缓冲区的两个目的:
(1)允许Java的I/O一次不只操作一个字符,这样提高?整个系统的性能;
(2)由于有缓冲区,使得在流上执行skip、mark和reset方法都成为可能。

【2】缓冲流:它是要“套接”在相应的节点流之上,对读写的数据提供了缓冲的功能,
提高了读写的效率,同时增加了一些新的方法。例如:BufferedReader中的readLine方法,
BufferedWriter中的newLine方法。

【3】J2SDK提供了4种缓存流,常用的构造方法为:

//字符输入流
BufferedReader(Reader in)//创建一个32字节的缓冲区
BufferedReader(Reader in, int size)//size为自定义缓存区的大小

//字符输出流
BufferedWriter(Writer out)
BufferedWriter(Writer out, int size)

//字节输入流
BufferedInputStream(InputStream in)
BufferedInputStream(InputStream in, int size)

//字节输出流
BufferedOutputStream(OutputStream in)
BufferedOutputStream(OutputStream in, int size)

【4】其他
(1)缓冲输入流BufferedInputSTream除了支持read和skip方法意外,还支持其父类的mark和reset方法;
(2)BufferedReader提供了一种新的ReadLine方法用于读取一行字符串(以\r或\n分隔);
(3)BufferedWriter提供了一种新的newLine方法用于写入一个行分隔符;
(4)对于输出的缓冲流,BufferedWriter和BufferedOutputStream,写出的数据会先在内存中缓存,
使用flush方法将会使内存的数据立刻写出。

示例1:

import java.io.*;
public class TestBufferStream1 {
  public static void main(String[] args) {
    try {
      FileInputStream fis = new FileInputStream(
          "d:\\JavaProject\\demo13\\ProcessingStream\\TestBufferStream1.java");
      BufferedInputStream bis = new BufferedInputStream(fis);
      int c = 0;
      System.out.println((char)bis.read());
      System.out.println((char)bis.read());
      bis.mark(100);/*在当前输入流的当前位置上做一个标志,允许最多再读入100个字节*/
      for(int i=0;i<=10 && (c=bis.read())!=-1;i++){
        System.out.print((char)c+" ");
      }
      System.out.println(); 
      bis.reset();/*把输入指针返回到以前所做的标志处*/
      for(int i=0;i<=10 && (c=bis.read())!=-1;i++){
        System.out.print((char)c+" ");
      }
      bis.close();
    } catch (IOException e) {e.printStackTrace();}
  }
}

示例2:

import java.io.*;
public class TestBufferStream2
{
    public static void main(String[] args)
    {
    try{
    BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\JavaProject\\demo13\\BufferStream\\dat2.txt"));
    BufferedReader br = new BufferedReader(new FileReader("D:\\JavaProject\\demo13\\BufferStream\\dat2.txt"));
    String s = null;
    for(int i=0;i<10;i++)
    {
        s = String.valueOf(Math.random());//产生一个小于1的正的随机数,并转换成字符串形式
        bw.write(s);//把字符串s写入到dat2.txt文件中
        bw.newLine();//写入一个行分隔符
    }
    bw.flush();//使用flush方法将会使内存的数据立刻写出

    while((s=br.readLine()) != null)
    {
        System.out.println(s);
    }
    bw.close();
    br.close();
    }
    catch(IOException e)
    {
        e.printStackTrace();
    }

    }
}

 

十一、I/O流(阶段三)

标签:方法   系统   fileinput   dom   tween   data   err   效率   示例   

原文地址:https://www.cnblogs.com/rozen-lin/p/14333635.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!