IO架构

来源:互联网 发布:电玩城斗牛软件 编辑:程序博客网 时间:2024/06/05 06:38

 

IO架构

一、IO框架概要

 

1、  Input/OutputStream及其子类

 

2Reader/Writer及其子类

1、基本概念

FileInputStramFileOutputStram用于读/写本地文件系统中的文件。

  PipedInputStreamPipedOutputStream用来实现管逍的输入出。

  ByteArrayInputkStreamByteArrayOutputStream 用于读/写内存数据。

  StringBufferInputStream 使程序可以从一个StringBuffer类的可变字符串中读取数据。

  SequenceInputStream用来把多输入流连接到一个输出流。

  FilterInputStream FilterOutputStream 分别重写了类InputStreamOutputStream中的所有方法,为过滤流提供了统一的接口,使得在读写数据的同时可以对数据进行处理。

  DateInputStream DataOutPutstream可以用与机器无关的格式读/ Java的基本数据类型。

  BufferedInputStream BufferedOutputStream 在读/写的同时对数据进行缓存,从而减少对数据源的访问,提高运行效率。

  ObjectInputStreamObjectOutputStream 用来直接进行对象的读写。

  LineNumberInputStream可以在读取数据的同时记录读取的行数。

  PushbackInputStream 包括一个单字节的缓冲区,使得在读取数据时可以预取下一个字符。

  PrintStream中提供了方便的输出方法。

 

字节流:
InputStreamOutputStream派生出来的一系列类.这类流以字节byte为基本处理单位
          FileInputStream      FileOutputStream
          PipedInputStream      PipedOutputStream
          ByteArrayInputStream ByteArrayOutputStream
          FilterInputStream      FilterOutputStream
          DataInputStream      DataOutputStream
          BufferedInputStream BufferedOutputStream
字符流:

ReaderWriter派生出来的一系列类,16位的Unicode码表示的字符为基本处理单位
InputStreadmReader      OutputStreadmWriter
FileReader      FileWriter
CharArrayReader CharArrayWriter
PipedReader PipedWriter
FilterReader      FilterWriter
BufferedReader BufferedWriter
StringReader      StringWriter

2、分类

按功能分类:   
   
输入流:面向程序,向程序中写入数据的流

   
输出流:面向程序,从程序中读出数据写到文件中的流
按数据的底层操作分类:
   
字节流:可以处理所有类型的数据,如二进制流和字符流等
.
   
字符流:只能处理和文本相关的数据
.
按照处理的对象分类
:
   
节点流:处理所有硬件设备,数据的源头,它属于低级方式
.
   
处理流:处理节点流,它属于高级方式,有更强的功能
.
   
inputStream:
所有字节输入流的父类
.
outputStream:
所有字节输出流的父类
.
Reader:
所有字符输入流的父类
.
Writer:
所有字符输出流的父类.

3、五对基本流

1.文件流(字节流/节点流):底层的流,用于实现程序和文件之间的互相访问.
        FileInputStream
在读入不存在的文件时会抛出异常
.
        FileOutputStrea
在执行构造时就会把目的文件的内容清空,除非使用追加方式
.
2.数据流:能够处理基本类型的数据也支持字符的处理流,用于访问各种基本类型的数据

        DataInputStream
        DataOutputStream
3.对象流:
        ObjectInputStream
        ObjectOutputStream
4.逐行流:(实现对数据的逐行读写的处理流
)
        BufferedReader
        BufferedWriter
5.转换流/桥梁流:实现字节到字符的转换,中间流,存在于底层流和处理流之间

        InputStreamReader
        OutputStreamWriter
逐行读入文本的方法:程序<--ReadLine<--BufferedReader<--InputStreamReader<--FileInputStream<--文件.
管道流:和线程进行交互的一组数据流

    PipedInputStream
    PipedOutputStream

4、常用函数:
read() 从流中读入数据
skip()
跳过流中若干字节数
available()
返回流中可用字节数
mark()
在流中标记一个位置
reset()
返回标记过得位置
markSupport()
是否支持标记和复位操作
close()
write()     
输出到流
flush()
刷空输出流

 

二、标准数据流
指在字符方式下,程序与系统进行交互的方式.标准输入studin,对象是键盘.标准输出stdout,对象是屏幕.标准错误输出stderr,对象是屏幕.

示例:

InputStream is = System.in;

                   InputStreamReader isr = new InputStreamReader(is);

                   BufferedReader br = new BufferedReader(isr);

                   String data = br.readLine();    // 键盘读入行

                   while(!data.equals("abcd"))

                   {

                            System.out.println("读取:"+data);   // dos输出

                            data = br.readLine();

                   }

三、Input/OutputStream(顺序访问流)

流一般分为输入流Input Stream和输出流Output Stream

抽象类InputStreamOutputStream是所有流的基类 ,它们分别提供了输入和输出处理的基本接口,并且都分地实现了其中的某些方法。由于InputStreamOutputStream都是抽象类 ,所以不能直接生成它们的对象。

1InputStream所提供的方法主要有:

1)从流中读取数据
  int read()
  从输入流中读取了一个字节 ,返回范围在0255 之间的一个整数,该方法的属性为 abstract,必须为子类所实现。

  int read(byte b[])
  从输入流中读取长度为b.length的数据 ,写入字节数组b,并返回读取的字节数。

  int read (byte b[], int off, int len)
  从输入流中读取长度为len的数据 ,写入字节数组b中从索引off开始的位置,并返回读取的字节数。

  对于以上方法 ,如果达到流的末尾位置 ,刚返回-1表明流的结束。

  int available()
  返回从输入流中可以读取的字节数。

  long skip(long n)
  输入流的当前读取位置向前移动n字节 ,并返回实际跳过的字节数。

2)关闭流并且释放与该流相关的系统资源

close()
  关闭流可以通过调用方法close()显式进行 ,也可以由运行时系统在则流对象进行垃圾收集时隐式进行。

3)使用输入流中的标记
  void markint readlimit);
  在输入流的当前读取位置作标记 。从该位置开始读取readlimit所指定的数据后,标记失效。

  void reset()
  重置输入流的读取位置为方法mark()所标记的位置。

  Boolean markSuppont()
  确定输入流是否支持方法mark()reset()

2OutputStream所提供的方法主要有:

  (1)输出数据

  void write(int b)
  将指定的字节b写入输出流。该方法的属性为abstract ,必须为子类所实现。

  注意:参数中的bint类型,如果b的值大于255,则只输出它的低位字节所表示的值。

  void write(byte b[])
  把字节数组b中的b.length个字节写入输出流。

  void write(byte b[], int off, int len)
  把字节数组b中从索引off开始的len个字节写入输出流。

  (2flush()

  刷空输出流,并输出所有被缓存的字节。


  (3)关闭流

  与类InputStream类似,可以用方法close()显式地关闭输出流,也可以由运行时系统在对流对象进行垃圾收集时隐式关闭输出流。

  通常OutputStream中的方法需在于类中被重写,以提高效率或是适合于特定流的需要。

 

3BufferedInputStream

BufferedInputStream BufferedOutputStream 在读/写的同时对数据进行缓存,从而减少对数据源的访问,提高运行效率。

 

4、读写文件示例:

写文件

FileInputStream fis = new FileInputStream("README.txt");

FileOutputStream fos = new FileOutputStream("abc.txt");

byte[] data = new byte[1024];

                   int size = fis.read(data);

                   while(size!=-1)

                   {

                            fos.write(data,0,size);

                            size = fis.read(data);

                   }

 

读文件

FileInputStream fis = new FileInputStream("README.txt");

                   byte[] data = new byte[1024];

                   int size = fis.read(data);

             while(size!=-1)

                   {

                            System.out.println(new String(data,0,size));

                            size = fis.read(data);

                   }

buffer的读文件

//节点流

FileInputStream fis = new FileInputStream("README.txt");

                   //处理流

                   BufferedInputStream bis = new BufferedInputStream(fis);

                   byte[] data = new byte[1024];

                   int size = bis.read(data);

                   while(size!=-1)

                   {

                            System.out.println(new String(data,0,size));

                            size = bis.read(data);

                   }

 

四、Reader/Writer

1Reader(读)

  读文件(FileReader)实例:

FileReader fr = new FileReader("README.txt");

                   //int data = fr.read();

                   char[] data = new char[1024];

                   int size = fr.read(data);

                   while(size!=-1)

                   {

                            System.out.print(new String(data,0,size));

                            size = fr.read(data);

                   }

 

2Writer(写)

 

 

五、RandomAccessFile(随机访问文件)

允许对文件内容同时进行读写: Datainput DataOutput

1、处理方法

int skipBytes(int n) 指针向下移动若干字节
readInt. writeDouble ...
length()
返回文件长度
long getFilePointer()
指针当前位置
void seek(long pos)
指针调到所需位置
void setLenght(long newLenght)
设置文件长度
RandomAccessFile(File file,String mode)
RandomAccessFile(String name,String mode)
2、读写方法

r      只读      rw 读写      rws 同步读写       rwd 数据同步读写

3、示例:随机文件操作

           raf=new RandomAccessFile("primes.bin","rw");
           raf.seek(0);
           raf.writeInt(2);      //
写入整形