Java IO的一般使用原则

 
  
一、按数据来源(去向)分类:  
  
1、是文件: FileInputStream, FileOutputStream, FileReader, FileWriter  
  
2、是byte[]:ByteArrayInputStream, ByteArrayOutputStream  
  
3、是Char[]: CharArrayReader, CharArrayWriter  
  
4、是String: StringBufferInputStream, StringReader, StringWriter  
  
5、网络数据流:InputStream, OutputStream, Reader, Writer  
  
二、按是否格式化输出分:  
  
1、要格式化输出:PrintStream, PrintWriter  
  
三、按是否要缓冲分:  
  
1、要缓冲:BufferedInputStream, BufferedOutputStream, BufferedReader, BufferedWriter  
  
四、按数据格式分:  
  
1、二进制格式(只要不能确定是纯文本的): InputStream, OutputStream及其所有带Stream结束的子类  
  
2、纯文本格式(含纯英文与汉字或其他编码方式);Reader, Writer及其所有带Reader, Writer的子类  
  
五、按输入输出分:  
  
1、输入:Reader, InputStream类型的子类  
  
2、输出:Writer, OutputStream类型的子类  
  
六、特殊需要:  
  
1、从Stream到Reader,Writer的转换类:InputStreamReader, OutputStreamWriter  
  
2、对象输入输出:ObjectInputStream, ObjectOutputStream  
  
3、进程间通信:PipeInputStream, PipeOutputStream, PipeReader, PipeWriter  
  
4、合并输入:SequenceInputStream  
  
5、更特殊的需要:PushbackInputStream, PushbackReader, LineNumberInputStream, LineNumberReader  
  
   
  
决定使用哪个类以及它的构造进程的一般准则如下(不考虑特殊需要):  
  
第一,考虑最原始的数据格式是什么:是否为文本?  
  
第二,是输入还是输出?  
  
第三,是否需要转换流:InputStreamReader, OutputStreamWriter?  
  
第四,数据来源(去向)是什么:文件?内存?网络?  
  
第五,是否要缓冲:bufferedReader (特别注明:一定要注意的是readLine()是否有定义,有什么比read, write更特殊的输入或输出方法)  
  

第六,是否要格式化输出:print?  



java.io.RandomAccessFile
==========================================
  * 读写文件中的字节数据
  * 用下标,读写文件中的指定位置的字节值
  
  创建对象
  ----------------------------------
    1. RandomAccessFile raf = 
          new RandomAccessFile(文件, "rw");


    2. RandomAccessFile raf = 
          new RandomAccessFile(文件, "r");


  方法
  ----------------------------------
    write(int b)
    
      输出 int 四个字节中的末尾字节,
      [1][2][3][4] --> [4]
    
    write(byte[] buf)
    
      输出数组中全部字节值
    
    write(byte[] buf, int from, int n)
      
      输出数组中从 from 开始的 n 个字节值


    read()
    
      读取一个字节值,
      然后补三个零字节,变成 int 类型
      
      [4] --> [1][2][3][4]
      
      读取结束之后,再读取,返回 -1
    
    read(byte[] buf)
      
      根据指定数组长度,读取一批字节值,
      并放入指定的数组中,
      返回放入数组的字节数量
      
      读取结束之后,再读取,返回 -1


    seek(int position)
      
      定位下标到指定位置


    getFilePointer()
      
      获得下标当前所在的位置
    
    ------
    
    writeInt(int i)         输出 int 类型的 4 个字节值
    writeDouble(double d)   输出 double 类型的 8 个字节值
    ...
    writeUTF(String s)      
      
      先输出 2 个字节值,表示字符串的字节长度;
      再输出字符串的这些字节值
    
    readInt()     读取 4 个字节值转成 int
    readDouble()  读取 8 个字节值转成 double 
    ...
    readUTF()
      
      先读取 2 个字节值,来确定字符串的字节长度;
      再读取这些字节值,转成 String
    
    *) 读取结束后,再读取,
       会出现 EOFException
          
          EOF - End Of File


流 Stream
======================================
  * 字节的读写,
    抽象成字节在管道中流动
  
  * 输入流
  
      流入内存
  
  * 输出流
      
      从内存流出


java.io.InputStream / OutputStream
==========================================
  * 字节流的抽象父类
  
  方法
  -----------------------------------
    OutputStream
    ------------------------------
      write(int b)
      write(byte[] buf)
      write(byte[] buf, int from, int n)
      
      flush() 刷出缓存
    
    InputStream
    ------------------------------
      read()
      read(byte[] buf)
      
      available() 获得剩余的可读取字节量


java.io.FileInputStream / FileOutputStream
============================================
  * 直接与文件相接,读写文件中的数据
  
  创建对象
  --------------------------------
    1. 
      FileOutputStream out = 
       new FileOutputStream(文件);
       
       不论文件是否存在,
       都会新建一个空文件
      
    2. 
      FileOutputStream out = 
       new FileOutputStream(文件, true);
       
       如果文件不存在,会新建空文件;
       如果文件已经存在,在文件末尾追加数据


高级流、操作流
=======================================
  * 与其他流相接,提供特定的数据处理功能
  * 操作其他流的流


java.io.BufferedInputStream / BufferedOutputStream
====================================================
  * 提供内存缓冲区,
    提高单字节读写效率


  创建对象
  --------------------------------------
    1. BufferedOutputStream out = 
          new BufferedOutputStream(相接的流);
          
          内部数组默认长度: 8192
          
    2. BufferedOutputStream out = 
          new BufferedOutputStream(相接的流, 16*1024);
       
          内部数组长度:16k


java.io.DataInputStream / DataOutputStream
===============================================
  * 读写固定字节格式的数据
  
  创建对象
  ---------------------------------
    DataOutputStream out = 
      new DataOutputStream(相接的流);
  
  方法
  ---------------------------------
    DataOutputStream
    ----------------------------
      writeInt(int i)
      writeDouble(double d)
      ...
      writeUTF(String s)
    
    DataInputStream
    ----------------------------
      readInt()
      readDouble()
      ...
      readUTF()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值