I/O流

在Java中,這個概念很清楚,就是一個字符佔16位,一個字節佔8位,java中用的是unicode,一個字符佔兩個字節,16位java

一.java 流式輸入/輸出原理:在java程序中,對於數據的輸入/輸出操做以"流"(stream)方式進行;J2SDK提供了各類各樣的"流"類,用以獲取不一樣 種類的數據;程序中經過標準的方法輸入或輸出數據數組

二.java流類的分類:java.io包中定義了多個流類型(類或抽象類)來實現輸入 /輸出功能;能夠從不一樣的角度對其進行分類:
<1>.按數據流的方向不一樣能夠分爲輸入流和輸出流(站在程序的角度看)。
<2>. 按處理數據單位不一樣能夠分爲字節流和字符流緩存

<3>.按照功能不一樣能夠分爲節點流和處理流
節點流:爲能夠從一個特定的 數據源(節點)讀寫數據(如:文件,內存)
處理流:是"鏈接"在已存在的流(節點流或處理流)之上,經過對數據的處理爲程序提供更爲強大的讀寫功 能app

 

三.輸入/輸出流類編碼


1。J2SDK所提供的全部流類型位於包java.io內都分別繼承自 一下四種抽象流類型
           字節流         字符流
輸入流  inputstream        Reader
輸出流  OutputStream       Writer
2.繼承自InputStream的流都是用於向程序中輸入 數據,且數據的單位爲字節(8 bit);
(1).
InputStream{FilterInputStream{LineNumberInputStream,DateInputStream,BufferedInputStream,PushbackInputStream},FileInputStream,PipedInputStream,ByteArrayInputStream,SequenceInputStream,StringBufferInputStream,ObjectInputStream}
(2).InputStream 的基本方法:
  <1>.int read() throws IOException
   //讀取一個字節並以整數的形式返回(0~255),若是返回-1已到輸入流的末尾
  <2>.int read (byte[] buffer)throws IOException
   //讀取一系列字節並存儲到一個數組buffer,返回實際讀取的字節數,若是讀取前已到輸入流的 末尾返回-1
  <3>.int read(byte[] buffer,int offset,int length) throws IOException
    //讀取Length個字節,並存儲到一個字節數組buffer,從Length位置開始,返回實際讀取的字     節數,若是讀取前以到輸入流的末尾返回-1
  <4>.void close() thorws IOException
     //關閉流釋放內存資源
  <5>long skip(long n) throws IOException
    //跳過n個字節不讀,返回實際跳過的字節數
3.繼承自OutputStream的流是用於程序中輸入數據,且數據的單位爲字節(8 bit);
(1)OutputStream{FilterOutputStream{DataOutPutStream,BufferedOutputStream,PrintStream},FileOutputStream,PipedOutputStream,ByteArrayOutputStream,ObjectOutputStream}
(2)OutputStream 的基本方法
  <1>.void write(int b) throws IOException //向輸出流中寫入一個字節數據,該字節數據爲參數b的低8位
  <2>.void write(byte[]b )throws IOException //將一個字節類型的數組中的數據寫入輸出流
  <3>.void write(byte[]b,int off,int len)throws IOException //將一個字節類型的數組中的從指定位置(off)開始的,len個字節寫入到輸出流
  <4>.void close()throws IOException//關閉流釋放內存資源
  <5>.void flush()throws IOException//將輸出流中緩衝的數據所有寫出到目的地
4.繼承自Reader的流都是用於向程序中輸 入數據,且數據的單位爲字符(16 bit):
(1).
Reader{InputStreamReader{FileReader},FilterReader{PushbackReader},BufferedReader{LineNumberReader},CharArrayReader,PipedReader,StringReader}
(2)Reader 的基本方法:
<1>.int read() throws IOException//讀取一個字節並以整數的形式返回(0~255),若是返回-1已到輸入流的末尾
<2>.int read(char[] cbuf)throws IOException //讀取一系列字符並存儲到一個數組buffer,返回實際讀取的字符數,若是讀取前已到輸入流的末尾返回-1
<3>.int read(char[] cbuf,int offset,int length)throws IOException//讀取length個字符,並存儲到一個數組buffer,從offset位置開始,返回實際讀取的字符數,若是讀取前已到輸入 的末尾返回-1
<4>.void close()throws IOException//關閉流釋放內存資源
<5>.long skip(long n) throws IOException//跳過n個字符不讀,返回實際跳過的字節數
5.Writer 繼承自Writer的流都是用於程序中輸出數據,且數據的單位爲字符(16 bit)
(1).Writer{OutputStreamReader{FileWriter},BufferedWriter,CharArrayWriter,FilterWirter,PipedWriter,StringWriter,FilterWriter}
(2).Write 的基本方法
<1>.void write(int c) throws IOException //向輸出流中寫入一個字符數據,該字節數據爲參數b的低16位
<2>.void write(char[] cbuf)throws IOException//將一個字符類型的數組中的數據寫入輸入流
<3>.void write(char[] cbuf,int offset,int length)throws IOException//將一個字符類型的數組中的從指定位置(offset)開始的,length個字符寫入到輸出流
<4>.void write(String string) throws IOException //將一個字符串中的字符寫入到輸出流
<5>.void write(String string ,int offset,int length)throws IOException//將一個字符串從offset開始的length個字符寫入到輸出流
<6>.void close() throws IOException//關閉流釋放內存資源
<7>.void flush() throws IOException //將輸出流中緩衝的數據所有寫出到目的地spa

四.常見的節點流和處理流code

1.節點流類型:對象

類型                 字符流                    字節流
     FileReader                FileInputStream
File(文件)         FileWriter                FileOutputStream繼承

Memory Array      CharArrayReader           ByteArrayInputStream
                  CharArrayWriter           ByteArrayOutputStream接口

Memory String    StringReader   -----
   StringWriter 

Pipe(管道)  PipedReader                PipedInputStream
                 PipedWriter                PipedOutputStream


2.訪問文件
<1>.FileInputStream 和FileOutputStream 分別繼承自InputStream 和 OutputStream 用於向文件中輸入和輸出字節
 FileInputStream 和 FileOutputStream 的經常使用構造方法
  (1).FileInputStream(String name) throws FileNotFoundException
  (2).FileInputStream(File file) throws FileNotFoundException
  (3).FileOutputStream(String name) throws FileNotFountException
  (4).FileOutputStream(File file)throws FileNotFoundException
  (5).FileOutputStream(File file,boolean append) throws FileNotFoundException
<2>.FileInputStream 和 FileOutputStream 類支持其父類InputStream 和OutputStream 所提供的    數據讀寫方法
(1).在 實例化FileInputStream 和FileOutputStream 流時要用try--catch語句以處理其可能拋出的FileNotFoundException
 (2).在讀寫數據時也要用try-- catch語句以處理可能拋出的IOException
 (3).FileNotFoundException 是IOException 的子類
 
例題:1
public class TestFileInputStream {
 public static void main(String[] args) {
  int b = 0;
  FileInputStream in = null;
  //FileReader in = null;
   try{
    in = new FileInputStream("E:\\Eclipseworkspace\\FileAndIOTest1\\src\\testFileInputStream\\TestFileInputStream.java");
    //in =new FileReader("E:\\Eclipseworkspace\\FileAndIOTest1\\src\\testFileInputStream\\TestFileInputStream.java");
   }catch(FileNotFoundException e){
    System.out.println("找不到指定的文件");
    System.out.println(-1);
   }
   try{
    long num = 0;
    while((b = in.read())!= -1){
     System.out.print((char)b);
     num++;
    }
    in.close();
    System.out.println();
    System.out.println("共讀取了" + num + "個字節");
   }catch(IOException e1){
    System.out.println("文件讀取錯誤");
    System.exit(-1);
   }
 }
}

例題2:
public class TestFileOutputStream {
 public static void main(String[] args) {
  int b = 0;
  //FileInputStream in = null;
  //FileOutputStream out = null;
  FileReader in = null;
  FileWriter out = null;
  try{
   //in = new FileInputStream("E:\\javaLearn\\fileTest\\aa.txt");
   //out = new FileOutputStream("E:\\javaLearn\\fileTest\\bb.txt");
   in = new FileReader("E:\\javaLearn\\fileTest\\aa.txt");//能自動建文件,不能建目錄
   out = new FileWriter("E:\\javaLearn\\fileTest\\bb.txt");
   while((b = in.read())!= -1){
    out.write(b);
   }
   in.close();
   out.close();
  }catch(FileNotFoundException e2){
   System.out.println("找不到指定的文件");
   System.exit(-1);
  }catch(IOException e1){
   System.out.println("文件複製錯誤");
   System.exit(-1);
  }
  System.out.println(" 文件已經複製");
 }
}

處理流:包裹在別的流上的流
處理類型                       字符流                       字節流
Buffering     BufferedReader                BufferedInputStream
                           BufferedWriter                BufferedOutputStream

Filtering     FilterReader                  FilterInputStream
                           FilterWriter    FilterOutputStream

Converting between         InputStreamReader
bytes and character        OutputStreamWriter

Object Serialization                                    ObjectInputStream
       ObjectOutputStream

Date conversion                                         DateInputStream
       DateOutputStream

counting                  LineNumberReader              LineNumberInputStream

peeking ahead             pusbackReader                PushbackInputStream
pringting                 PrintWriter                   PrintStream

五.文件流

六.緩衝流
<1>. 緩衝流要"套接"在相應的節點流之上,對讀寫的數據提供了緩衝的功能,提升了讀寫的效率,同時增長了一些新的方法
<2>.J2SDK 提供了四種緩存流,其經常使用的構造方法爲:
  BufferedReader(Reader in)
  BufferedReader(Reader in ,int sz)//sz 爲自定義緩存區的大小
  BufferedWriter(Writer out)
  BufferedWriter(Writer out,int sz)
  BufferedInputStream(InputStream in)
  BufferedInputStream(InputStream in,int size)
  BufferedOutputStream(OutputStream out)
  BufferedOutputStream(OutoutStream out,int size)

 

七.數據流
<1>.DataInputStream 和DateOutputStream分別繼承自InputStream 和OutputStream,它屬於處理流,須要分別"套接"在InputStream 和OutputStream類型的節點流上
<2>.DateInputStream 和DateOutputStream提供了能夠存取與機器無關的java原始類型數據(如:int ,double等)的方法
<3>.DataInputStream 和DataOutputStream 的構造方法爲:
DateInputStream(InputStream in)
DateOutputStream(OutputStream out)


八.轉換流
1.InputStreamReader 和 OutputStreamWriter用於字節數據到字符數據之間的轉換
2.InputStreamReader 須要和 InputStream"套接"。
3.OutputStreamWriter 須要和OutputStream"套接"。
4.轉換流在構 造時能夠指定其編碼集合,例如:
InputStream isr = new InputStreamReader(System.in,"ISO8859_1");

九.Print流:打印流
<1>.PrintWriter 和 printStream 都屬於輸出流,分別針對與字符和字節
<2>.PrintWriter 和PrintStream 提供了重載的print
<3>.Println方法用於多種數據類型的輸出
<4>.PrintWriter和 PrintStream的輸出操做不會拋出異常,用戶經過檢測錯誤狀態取錯誤信息
<5>.PrintWriter和 PrintStream有自動flush功能
<6>.PrintWriter(Writer out)
    PrintWriter(Writer out,boolean autoFlush)
    PrintWriter(OutputStream  out)
    PrintWriter(OutputStream out,boolean autoFlush)
    PrintWriter(OutputStream out)
    PrintWriter(OutputStream out,boolean autoFlush)


十Object流
直 接將Object寫入或讀出
<1>.transient關鍵字:此關鍵字修飾時不能序列化
<2>serializable 接口:類經過實現 java.io.Serializable 接口以啓用其序列化功能。未實現此接口的類將沒法使其任何狀態序列化或反序列化。可序列化類的全部子類型自己都是可序列化的。序列化接口沒有方法或字段, 僅用於標識可序列化的語義;標記性接口,說明能夠序列化

<3>.externalizable接口:實例類的唯一特性是能夠 被寫入序列化流中,該類負責保存和恢復實例內容;本身控制本身序列化過程

調用外部類的方法來生成內部類的對象,實現封裝

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息