熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Java編程 >> Java核心技術 >> 正文

徹底明白Java的IO系統

2013-11-23 18:47:57  來源: Java核心技術 

  徹底明白Java的IO系統  caiyi(收藏)
   
  關鍵字   JavaIO系統
   
  一. Input和Output
  
   stream代表的是任何有能力產出數據的數據源或是任何有能力接收數據的接收源在Java的IO中所有的stream(包括Input和Out stream)都包括兩種類型
   以字節為導向的stream
  
  以字節為導向的stream表示以字節為單位從stream中讀取或往stream中寫入信息以字節為導向的stream包括下面幾種類型
  ) input stream
  ) ByteArrayInputStream把內存中的一個緩沖區作為InputStream使用
  ) StringBufferInputStream把一個String對象作為InputStream
  ) FileInputStream把一個文件作為InputStream實現對文件的讀取操作
  ) PipedInputStream實現了pipe的概念主要在線程中使用
  ) SequenceInputStream把多個InputStream合並為一個InputStream
  ) Out stream
  ) ByteArrayOutputStream把信息存入內存中的一個緩沖區中
  ) FileOutputStream把信息存入文件中
  ) PipedOutputStream實現了pipe的概念主要在線程中使用
  ) SequenceOutputStream把多個OutStream合並為一個OutStream
  
   以Unicode字符為導向的stream
  
  以Unicode字符為導向的stream表示以Unicode字符為單位從stream中讀取或往stream中寫入信息以Unicode字符為導向的stream包括下面幾種類型
  ) Input Stream
  ) CharArrayReader與ByteArrayInputStream對應
  ) StringReader與StringBufferInputStream對應
  ) FileReader與FileInputStream對應
  ) PipedReader與PipedInputStream對應
  ) Out Stream
  ) CharArrayWrite與ByteArrayOutputStream對應
  ) StringWrite無與之對應的以字節為導向的stream
  ) FileWrite與FileOutputStream對應
  ) PipedWrite與PipedOutputStream對應
  以字符為導向的stream基本上對有與之相對應的以字節為導向的stream兩個對應類實現的功能相同字是在操作時的導向不同如CharArrayReader和ByteArrayInputStream的作用都是把內存中的一個緩沖區作為InputStream使用所不同的是前者每次從內存中讀取一個字節的信息而後者每次從內存中讀取一個字符
  
   兩種不現導向的stream之間的轉換
  
  InputStreamReader和OutputStreamReader把一個以字節為導向的stream轉換成一個以字符為導向的stream
  
   stream添加屬性
  
   為stream添加屬性的作用
  
  運用上面介紹的Java中操作IO的API我們就可完成我們想完成的任何操作了但通過FilterInputStream和FilterOutStream的子類我們可以為stream添加屬性下面以一個例子來說明這種功能的作用
  如果我們要往一個文件中寫入數據我們可以這樣操作
  FileOutStream fs = new FileOutStream(testtxt);
  然後就可以通過產生的fs對象調用write()函數來往testtxt文件中寫入數據了但是如果我們想實現先把要寫入文件的數據先緩存到內存中再把緩存中的數據寫入文件中的功能時上面的API就沒有一個能滿足我們的需求了但是通過FilterInputStream和FilterOutStream的子類為FileOutStream添加我們所需要的功能
  
   FilterInputStream的各種類型
  
   用於封裝以字節為導向的InputStream
  
  ) DataInputStream從stream中讀取基本類型(intchar等)數據
  ) BufferedInputStream使用緩沖區
  ) LineNumberInputStream會記錄input stream內的行數然後可以調用getLineNumber()和setLineNumber(int)
  ) PushbackInputStream很少用到一般用於編譯器開發
  
   用於封裝以字符為導向的InputStream
  
  ) 沒有與DataInputStream對應的類除非在要使用readLine()時改用BufferedReader否則使用DataInputStream
  ) BufferedReader與BufferedInputStream對應
  ) LineNumberReader與LineNumberInputStream對應
  ) PushBackReader與PushbackInputStream對應
  
   FilterOutStream的各種類型
  
   用於封裝以字節為導向的OutputStream
  
  ) DataIOutStream往stream中輸出基本類型(intchar等)數據
  ) BufferedOutStream使用緩沖區
  ) PrintStream產生格式化輸出
   用於封裝以字符為導向的OutputStream
  ) BufferedWrite與對應
  ) PrintWrite與對應
  
   RandomAccessFile
  
  ) 可通過RandomAccessFile對象完成對文件的讀寫操作
  ) 在產生一個對象時可指明要打開的文件的性質r只讀w只寫rw可讀寫
  ) 可以直接跳到文件中指定的位置
  
   I/O應用的一個例子
  
  import javaio*;
  public class TestIO{
  public static void main(String[] args)
  throws IOException{
  //以行為單位從一個文件讀取數據
  BufferedReader in =
  new BufferedReader(
  new FileReader(F:\\nepalon\\TestIOjava));
  String s s = new String();
  while((s = inreadLine()) != null)
  s += s + \n;
  inclose();
  
  //b 接收鍵盤的輸入
  BufferedReader stdin =
  new BufferedReader(
  new InputStreamReader(Systemin));
  Systemoutprintln(Enter a line:);
  Systemoutprintln(stdinreadLine());
  
  // 從一個String對象中讀取數據
  StringReader in = new StringReader(s);
  int c;
  while((c = inread()) != )
  Systemoutprintln((char)c);
  inclose();
  
  // 從內存取出格式化輸入
  try{
  DataInputStream in =
  new DataInputStream(
  new ByteArrayInputStream(sgetBytes()));
  while(true)
  Systemoutprintln((char)inreadByte());
  }
  catch(EOFException e){
  Systemoutprintln(End of stream);
  }
  
  // 輸出到文件
  try{
  BufferedReader in =
  new BufferedReader(
  new StringReader(s));
  PrintWriter out =
  new PrintWriter(
  new BufferedWriter(
  new FileWriter(F:\\nepalon\\ TestIOout)));
  int lineCount = ;
  while((s = inreadLine()) != null)
  outprintln(lineCount++ + + s);
  outclose();
  inclose();
  }
  catch(EOFException ex){
  Systemoutprintln(End of stream);
  }
  
  // 數據的存儲和恢復
  try{
  DataOutputStream out =
  new DataOutputStream(
  new BufferedOutputStream(
  new FileOutputStream(F:\\nepalon\\ Datatxt)));
  outwriteDouble();
  outwriteChars(\nThas was pi:writeChars\n);
  outwriteBytes(Thas was pi:writeByte\n);
  outclose();
  DataInputStream in =
  new DataInputStream(
  new BufferedInputStream(
  new FileInputStream(F:\\nepalon\\ Datatxt)));
  BufferedReader inbr =
  new BufferedReader(
  new InputStreamReader(in));
  Systemoutprintln(inreadDouble());
  Systemoutprintln(inbrreadLine());
  Systemoutprintln(inbrreadLine());
  }
  catch(EOFException e){
  Systemoutprintln(End of stream);
  }
  
  // 通過RandomAccessFile操作文件
  RandomAccessFile rf =
  new RandomAccessFile(F:\\nepalon\\ rtestdat rw);
  for(int i=; i <; i++)
  rfwriteDouble(i*);
  rfclose();
  
  rf = new RandomAccessFile(F:\\nepalon\\ rtestdat r);
  for(int i=; i <; i++)
  Systemoutprintln(Value + i + + rfreadDouble());
  rfclose();
  
  rf = new RandomAccessFile(F:\\nepalon\\ rtestdat rw);
  rfseek(*);
  rfwriteDouble();
  rfclose();
  
  rf = new RandomAccessFile(F:\\nepalon\\ rtestdat r);
  for(int i=; i <; i++)
  Systemoutprintln(Value + i + + rfreadDouble());
  rfclose();
  }
  }
  
  關於代碼的解釋(以區為單位)
  區中當讀取文件時先把文件內容讀到緩存中當調用inreadLine()時再從緩存中以字符的方式讀取數據(以下簡稱緩存字節讀取方式
  b區中由於想以緩存字節讀取方式從標准IO(鍵盤)中讀取數據所以要先把標准IO(Systemin)轉換成字符導向的stream再進行BufferedReader封裝
  區中要以字符的形式從一個String對象中讀取數據所以要產生一個StringReader類型的stream
  
From:http://tw.wingwit.com/Article/program/Java/hx/201311/25748.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.