JAVA数据流的概述

         考虑到数据源的多样性,为了有效的进行数据的输入、输出操作,java中把不同数据源与程序间的数据传输都抽像的表述为“流”(Stream),以实现相对统一和简单的输入/输出(Inout/Output,I/O)操作方式。

      下面就看看java数据流的概述:

  

流概述

流的分类:

•       按数据流动方向

–   输入流:只能从中读取字节数据,而不能向其写出数据

–   输出流:只能向其写入字节数据,而不能从中读取数据

•       按照流所处理的数据类型

–   字节流:用于处理字节数据。

–   字符流:用于处理Unicode字符数据

•       按照流所处理的源

–   节点流:从/向一个特定的IO设备读/写数据的流

–   处理流:对已存在的流进行连接和封装的流

过滤流

抽象的InputStream和OutputStream类允许我们对字串及数字进行读写。为达到这个目的,还需要功能更多的子类。例如:DateInputStream和DataOutputStream允许我们对所有基本的java类型进行读写。

    文件流类与抽象的InputStream和OutputStream类相似,这些类也只支持字节级的读写操作。换言之,只能从fin对象中读取字符和字节数组。byteb=fin.read(),他们没有提供专门的数值类型,所以DataInputStream没有办法从一个文件中获取数字。

解决方案:java给流职责分工,某些流(FileInputStream)负责从文件或另一些更特殊的地方读入字节数据。而另一些流

(DataInputStream、PrintWriter)负责将字节“组装”成更有用的数据类型。必须综合运用这两种流,将其合并成所谓的"过滤流(FilteredStreams)",方法是将一个现成的流传递给另一个流的构建器。

数据流

l        DataInputStream

l        DataOutputStream

类的构造及成员详见文档

//在文件中写入并读出人名及其工资
import java.io.*;
public class T1 {

    public static void main(String[] args) {
       String[] name = {"Tom","Jack","Mary"};
       double[] salary = {300, 400, 1200}; 
       
       try{          
           FileOutputStream fos =  new FileOutputStream("res/salary.txt");
           DataOutputStream dos =  new DataOutputStream(fos);
           
           for(int i=0; i<name.length; i++){
              dos.writeUTF(name[i]);
              dos.writeDouble(salary[i]);
           }
           
           dos.close();
           fos.close();
           
           ///
           
           FileInputStream fin =  new FileInputStream("res/salary.txt");
           DataInputStream dis =  new DataInputStream(fin);
           
           for(int i=0; i<name.length; i++){
              String n = dis.readUTF();
              double s = dis.readDouble();
              
              System.out.println(n + " :" + s);
           }
           
           dis.close();
           fin.close();
       }catch(Exception e){
           e.printStackTrace();
       }
    }
}

字节缓冲流

l        BufferedInputStream

l        BufferedOutputStrem

类的构造及成员详见文档

默认情况下,流不会进行缓冲。即每读一次,都会要求操作系统提供一个字节。通过BufferedInputStream和

BufferedOutputStream对流构建器进行过滤分层,实现缓冲。

1、构造函数:

BufferedInputStream(InputStream in)     
BufferedInputStream(InputStream in, intsize) //size:缓冲区的大小

2、代码演示: 

BufferedInputStream bis=newBufferedInputStream(System.in);    
BufferedInputStream bis=newBufferedInputStream(System.in ,100);   
//用缓冲字节流实现文件读写
import java.io.*;
public class BufferedIOTest {
    public static void main(String[] args) {
       try{
           FileOutputStream fos =  new FileOutputStream("res/new.txt");
           BufferedOutputStream bos = new BufferedOutputStream(fos);
           DataOutputStream dos =  new DataOutputStream(bos);
           
           dos.writeUTF("goodmorning!");
           dos.writeInt(250);
           
           dos.close();
           bos.close();
           fos.close();
           
           FileInputStream fis =  new FileInputStream("res/new.txt");
           BufferedInputStream bis = new BufferedInputStream(fis);
           DataInputStream dis =  new DataInputStream(bis);
           
           System.out.println(dis.readUTF() + "\n"+ dis.readInt());
           
           dis.close();
           bis.close();
           fis.close();
           
       }catch(Exception e){
           e.printStackTrace();
       }
    }
}