輸入輸出(入門經典)

今天我們開始進入學習 Java 中比較讓人頭疼的事, 那就是 I/O 流、多線程、網絡編程。這裏對 I/O 流的一個詳細講解。希望對大家有點用吧。(不看後悔哦)

一、什麼是IO

Java中I/O操作主要是指使用Java進行輸入,輸出操作。 Java所有的I/O機制都是基於數據流進行輸入輸出,這些數據流表示了字符或者字節數據的流動序列。

Java的I/O流提供了讀寫數據的標準方法。任何Java中表示數據源的對象都會提供以數據流的方式讀寫它的數據的方法。

  Java.io是大多數面向數據流的輸入/輸出類的主要軟件包。

  此外,Java也對塊傳輸提供支持,在覈心庫 java.nio中採用的便是塊IO。 
  JDK1.4版本開始引入了新I/O類庫,它位於java.nio包中,新I/O類庫利用通道和緩衝區等來提高I/O操作的效率。


  流IO簡單易用但效率較低。

  塊IO效率很高但編程比較複雜。 

二、Java IO模型 :

java I/O 的設計使用到了 Decorator(裝飾器)模式,按功能劃分Stream,您可以動態裝配這些 Stream,以便獲得您需要的功能。

例如,您需要一個具有緩衝的文件輸入流,則應當組合使用FileInputStream和BufferedInputStream。

三、數據流的基本概念

數據流是一串連續不斷的數據的集合,就象水管裏的水流,在水管的一端一點一點地供水,而在水管的另一端看到的是一股連續不斷的水流。

數據寫入程序可以是一段、一段地向數據流管道中寫入數據,這些數據段會按先後順序形成一個長的數據流。

對數據讀取程序來說,看不到數據流在寫入時的分段情況,每次可以讀取其中的任意長度的數據,但只能先讀取前面的數據後,再讀取後面的數據。

不管寫入時是將數據分多次寫入,還是作爲一個整體一次寫入,讀取時的效果都是完全一樣的。

  “流是磁盤或其它外圍設備中存儲的數據的源點或終點。”

在電腦上的數據有三種存儲方式,一種是外存,一種是內存,一種是緩存。

比如電腦上的硬盤,磁盤,U盤等都是外存,在電腦上有內存條,緩存是在CPU裏面的。

外存、內存、緩存的比較

存儲量(依次遞減):    外存-->內存-->緩存

讀取速度(依次遞減):  緩存-->內存-->外存

對於內存和外存的理解,我們可以簡單的理解爲容器,即外存是一個容器,內存又是另外一個容器。

在Java類庫中,IO部分的內容是很龐大的,因爲它涉及的領域很廣泛:

     標準輸入輸出,文件的操作,網絡上的數據流,字符串流,對象流,zip文件流等等,java中將輸入輸出抽象稱爲流,就好像水管,將兩個容器連接起來。將數據衝外存中讀取到內存中的稱爲輸入流,將數據從內存寫入外存中的稱爲輸出流。

流是一個很形象的概念,當程序需要讀取數據的時候,就會開啓一個通向數據源的流,這個數據源可以是文件,內存,或是網絡連接。類似的,當程序需要寫入數據的時候,就會開啓一個通向目的地的流。

基本流:

一組有序,有起點和終點的字節的數據序列。包括輸入流和輸出流。

輸入流:

 程序從輸入流讀取數據源。數據源包括外界(鍵盤、文件、網絡…),即是將數據源讀入到程序的通信通道。

輸出流:

 程序向輸出流寫入數據。將程序中的數據輸出到外界(顯示器、打印機、文件、網絡…)的通信通道。

爲什麼設計成數據流呢?

Input Stream不關心數據源來自何種設備(鍵盤,文件,網絡) 
Output Stream不關心數據的目的是何種設備(鍵盤,文件,網絡)

採用數據流的目的就是使得輸出輸入獨立於設備。

四、I/O體系結構

這裏寫圖片描述

簡單介紹下上圖:

你有沒有發現,都是成對出現的, 初學者就很容易混淆,分不清是字節流還是字符流,大家只需要看最後這個單詞,如果是 Stream 的話就是字節流,如果是 Reader/Writer 的話就是字符流。

在整個Java.io包中最重要的就是5個類和一個接口。5個類指的是File、OutputStream、InputStream、Writer、Reader;一個接口指的是Serializable.掌握了這些IO的核心操作那麼對於Java中的IO體系也就有了一個初步的認識了

Java I/O主要包括如下幾個層次,包含三個部分:

1.流式部分――IO的主體部分;

2.非流式部分――主要包含一些輔助流式部分的類,如:File類、RandomAccessFile類和FileDescriptor等類;

3.其他類–文件讀取部分的與安全相關的類,如:SerializablePermission類,以及與本地操作系統相關的文件系統的類,如:FileSystem類和Win32FileSystem類和WinNTFileSystem類。

流式部分主要類:

Java中字符是採用Unicode標準,一個字符是16位,即一個字符使用兩個字節來表示。爲此,JAVA中引入了處理字符的流。

對文件進行操作:

FileInputStream(字節輸入流),FileOutputStream(字節輸出流),FileReader(字符輸入流),FileWriter(字符輸出流)

對管道進行操作:

PipedInputStream(字節輸入流),PipedOutStream(字節輸出流),PipedReader(字符輸入流),PipedWriter(字符輸出流)

PipedInputStream的一個實例要和PipedOutputStream的一個實例共同使用,共同完成管道的讀取寫入操作。主要用於線程操作。

字節/字符數組:

ByteArrayInputStream,ByteArrayOutputStream,CharArrayReader,CharArrayWriter是在內存中開闢了一個字節或字符數組。

Buffered緩衝流:

BufferedInputStream,BufferedOutputStream,BufferedReader,BufferedWriter,是帶緩衝區的處理流,緩衝區的作用的主要目的是:避免每次和硬盤打交道,提高數據訪問的效率。

轉化流:

InputStreamReader/OutputStreamWriter,把字節轉化成字符。

數據流:

DataInputStream,DataOutputStream。

因爲平時若是我們輸出一個8個字節的long類型或4個字節的float類型,那怎麼辦呢?

可以一個字節一個字節輸出,也可以把轉換成字符串輸出,但是這樣轉換費時間,若是直接輸出該多好啊,因此這個數據流就解決了我們輸出數據類型的困難。

數據流可以直接輸出float類型或long類型,提高了數據讀寫的效率。

打印流:

printStream,printWriter,一般是打印到控制檯,可以進行控制打印的地方。

對象流:

ObjectInputStream,ObjectOutputStream,把封裝的對象直接輸出,而不是一個個在轉換成字符串再輸出。

序列化流:

SequenceInputStream。

對象序列化:把對象直接轉換成二進制,寫入介質中。

注:

使用對象流需要實現Serializable接口,否則會報錯。

而若用transient關鍵字修飾成員變量,不寫入該成員變量,若是引用類型的成員變量爲null,值類型的成員變量爲0.

非流式部分主要類:

File(文件特徵與管理):用於文件或者目錄的描述信息,例如生成新目錄,修改文件名,刪除文件,判斷文件所在路徑等。

RandomAccessFile(隨機文件操作):它的功能豐富,可以從文件的任意位置進行存取(輸入輸出)操作。

File類:

在Java語言的java.io包中,由File類提供了描述文件和目錄的操作與管理方法。 
但File類不是InputStream、OutputStream或Reader、Writer的子類,因爲它不負責數據的輸入輸出,而專門用來管理磁盤文件與目錄。

作用:File類主要用於命名文件、查詢文件屬性和處理文件目錄。

File類共提供了四個不同的構造函數,以不同的參數形式靈活地接收文件和目錄名信息。構造函數:

1)File (String pathname)

 例:File  f1=new File("FileTest1.txt"); //創建文件對象f1,f1所指的文件是在當前目錄下創建的FileTest1.txt

2)File(URI uri)

3)File (String parent , String child)

 例:File f2=new  File(“D:\\dir1","FileTest2.txt") ;//  注意:D:\\dir1目錄事先必須存在,否則異常

4)File (File parent , String child)

 例:  File  f4=new File("E:\\dir3");
      File  f5=new File(f4,"FileTest5.txt");  //在如果 E:\\dir3目錄不存在則需要先使用f4.mkdir()先創建

一個對應於某磁盤文件或目錄的File對象一經創建, 就可以通過調用它的方法來獲得文件或目錄的屬性。

   1)public boolean exists( ) 判斷文件或目錄是否存在

   2)public boolean isFile( ) 判斷是文件還是目錄 

   3)public boolean isDirectory( ) 判斷是文件還是目錄

   4)public String getName( ) 返回文件名或目錄名

   5)public String getPath( ) 返回文件或目錄的路徑。

   6)public long length( ) 獲取文件的長度 

   7)public String[ ] list ( ) 將目錄中所有文件名和目錄名保存在字符串數組中返回。 

   8)public File[] listFiles() 返回某個目錄下所有文件和目錄的絕對路徑,返回的是File數組

   9)public String getAbsolutePath() 返回文件或目錄的絕對路徑

   ....
   File類中還定義了一些對文件或目錄進行管理、操作的方法,常用的方法有:
   1) public boolean renameTo( File newFile );    重命名文件

   2) public void delete( );   刪除文件

   3) public boolean mkdir( ); 創建目錄

   4)public boolean createNewFile(); 創建文件

例子:輸出一個目錄中的所有文件名(目錄可能是多級目錄,如a目錄中有b、c目錄。。。)

FileUtils.java

<code class="hljs cs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> FileUtils {

    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">listDir</span>(String dir) throws IOException {
        File file = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> File(dir);
        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//傳進來的可能不是一個目錄</span>
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (!file.isDirectory()) {
            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">throw</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> IOException(dir+<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"不是目錄"</span>);
        }
        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//傳進來的可能是一個錯誤的路徑</span>
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (file == <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">null</span>) {
            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">throw</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> IOException(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"沒有此路徑"</span>);
        }
        File[] files = file.listFiles();
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">for</span> (File f : files) {
            <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//有可能是一個多級目錄,遞歸調用</span>
            <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">if</span> (f.isDirectory()) {
                listDir(f.getAbsolutePath());
                <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//是文件就直接輸出該文件的絕對路徑</span>
            }<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">else</span> {
                System.<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">out</span>.println(f.getAbsolutePath());
            }
        }
    }
}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li></ul>

Main.java

<code class="hljs cs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> Main {

    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">main</span>(String[] args) throws IOException {
        FileUtils.listDir(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"E:\\ssh"</span>);
    }
}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li></ul>

結果:

這裏寫圖片描述

這裏就不多解釋了,應該比較簡單,代碼中也有詳細註釋。

五、幾種流的介紹

1、InputStream抽象類

InputStream 爲字節輸入流,它本身爲一個抽象類,必須依靠其子類實現各種功能,此抽象類是表示字節輸入流的所有類的超類。 
繼承自InputStream 的流都是向程序中輸入數據的,且數據單位爲字節(8bit)

InputStream是輸入字節數據用的類,所以InputStream類提供了3種重載的read方法.Inputstream類中的常用方法: 
   
  (1) public abstract int read( ):讀取一個byte的數據,返回值是高位補0的int類型值。若返回值=-1說明沒有讀取到任何字節讀取工作結束。 
   
  (2) public int read(byte b[ ]):讀取b.length個字節的數據放到b數組中。返回值是讀取的字節數。該方法實際上是調用下一個方法實現的 
   
  (3) public int read(byte b[ ], int off, int len):從輸入流中最多讀取len個字節的數據,存放到偏移量爲off的b數組中。 
   
  (4) public int available( ):返回輸入流中可以讀取的字節數。注意:若輸入阻塞,當前線程將被掛起,如果InputStream對象調用這個方法的話,它只會返回0,這個方法必須由繼承InputStream類的子類對象調用纔有用, 
   
  (5) public long skip(long n):忽略輸入流中的n個字節,返回值是實際忽略的字節數, 跳過一些字節來讀取 
   
  (6) public int close( ) :我們在使用完後,必須對我們打開的流進行關閉.

主要的子類:

 1) FileInputStream:把一個文件作爲InputStream,實現對文件的讀取操作     

 2) ByteArrayInputStream:把內存中的一個緩衝區作爲InputStream使用 

 3) StringBufferInputStream:把一個String對象作爲InputStream 

 4) PipedInputStream:實現了pipe的概念,主要在線程中使用 

 5) SequenceInputStream:把多個InputStream合併爲一個InputStream 

2、OutputStream抽象類

OutputStream提供了3個write方法來做數據的輸出,這個是和InputStream是相對應的。 
   
  (1) public void write(byte b[ ]):將參數b中的字節寫到輸出流。 
   
  (2)public void write(byte b[ ], int off, int len) :將參數b的從偏移量off開始的len個字節寫到輸出流。 
   
  (3) public abstract void write(int b) :先將int轉換爲byte類型,把低字節寫入到輸出流中。 
   
  (4)public void flush( ) : 將數據緩衝區中數據全部輸出,並清空緩衝區。 
   
  (5) public void close( ) : 關閉輸出流並釋放與流相關的系統資源。

主要的子類:

 1) ByteArrayOutputStream:把信息存入內存中的一個緩衝區中 

 2) FileOutputStream:把信息存入文件中 

 3) PipedOutputStream:實現了pipe的概念,主要在線程中使用 

 4) SequenceOutputStream:把多個OutStream合併爲一個OutStream 

注:

流結束的判斷:方法read()的返回值爲-1時;readLine()的返回值爲null時。

3、FileInputStream文件輸入流

FileInputStream可以使用read()方法一次讀入一個字節,並以int類型返回,或者是使用read()方法時讀入至一個byte數組,byte數組的元素有多少個,就讀入多少個字節。

在將整個文件讀取完成或寫入完畢的過程中,這麼一個byte數組通常被當作緩衝區,因爲這麼一個byte數組通常扮演承接數據的中間角色。

作用:以文件作爲數據輸入源的數據流。或者說是打開文件,從文件讀數據到內存的類。

使用方法:

FileInputStream fis = new FileInputStream(“E:\a.txt”);

或 FileInputStream fis = new FileInputStream(“E:/a.txt”);

當然也可以傳一個 File ,它還有好多個構造器。大家可以看看源碼應該就懂了。

例子: 
將a.txt的內容顯示在顯示器上

這裏寫圖片描述

<code class="hljs cs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> FileInputStreamDemo {

    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">main</span>(String[] args) throws IOException {

        FileInputStream fis = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> FileInputStream(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"a.txt"</span>);
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> a;
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> ((a = fis.read()) != -<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) {
            System.<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">out</span>.print((<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">char</span>)a);
        }
    }
}
</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li></ul>

結果:

這裏寫圖片描述

如果將 System.out.print((char)a) 改成 System.out.print(a) 又會是怎樣呢?

這裏寫圖片描述

怎麼回事呢?不是字節流嗎?讀出來不就是一個字節,怎麼輸出一個整數了呢?

答:read()方法確實是讀取一個字節,但返回值是 int 類型的,會將取出來的一個字節高位會補 0 成一個 int 型。所以輸出來的應該這個數據的 ASCII 碼。

使用鍵盤輸入一段中文並輸出到控制檯,看看會是怎樣?

<code class="hljs cs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> FileInputStreamDemo {

    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">main</span>(String[] args) throws IOException {
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> a;
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> ((a = System.<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">in</span>.read()) != -<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) {
            System.<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">out</span>.print(a);
        }
    }
}
</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li></ul>

可以猜到應該會輸出一些整數即 ASCII 碼,因爲讀的時候是一個字節一個字節的讀,而中文又不止一個字節,到底要幾個字節來表示,這要取決於編碼集(我這裏的是拆成了三個字節,兩個字節是用來標記一行的)。反正會拆成幾個字節來讀。

結果:

這裏寫圖片描述

那麼如果強轉成 char 類型又會怎樣呢?

<code class="hljs cs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> FileInputStreamDemo {

    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">main</span>(String[] args) throws IOException {
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> a;
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> ((a = System.<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">in</span>.read()) != -<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) {
            System.<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">out</span>.print((<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">char</span>)a);
        }
    }
}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li></ul>

結果:

這裏寫圖片描述

我們看到輸入哈,輸出å,但這並不是我們想要的。爲什麼會這樣呢?我們來看一下 å 的 ASCII 碼,剛好是 229,這我們就知道它只取了第一字節ASCII碼對應的字符。

ASCII 碼錶可在文章最後查看。

4、FileOutputStream文件輸出流

FileOutputStream類用來處理以文件作爲數據輸出目的數據流;一個表示文件名的字符串,也可以是File或FileDescriptor對象。

作用:用來處理以文件作爲數據輸出目的數據流;或者說是從內存區讀數據到文件

創建文件流的方式:

1)FileOutputStream(File file) 
創建一個向指定 File 對象表示的文件中寫入數據的文件輸出流。 
例: File f=new File (“d:/myjava/write.txt “); 
FileOutputStream out= new FileOutputStream (f);

2)FileOutputStream(File file, boolean append) 
創建一個向指定 File 對象表示的文件中寫入數據的文件輸出流。 append表示內容是否追加

3)FileOutputStream(FileDescriptor fdObj) 
創建一個向指定文件描述符處寫入數據的輸出文件流,該文件描述符表示一 
個到文件系統中的某個實際文件的現有連接。

4)FileOutputStream(String name) 
創建一個向具有指定名稱的文件中寫入數據的輸出文件流。 
例:FileOutputStream out=new FileOutputStream(“d:/myjava/write.txt “);

5)FileOutputStream(String name, boolean append) 
創建一個向具有指定 name 的文件中寫入數據的輸出文件流。 append表示內容是否追加

注:

(1)文件中寫數據時,若文件已經存在,則覆蓋存在的文件;

(2)的讀/寫操作結束時,應調用close方法關閉流。

例子:

使用鍵盤輸入一段內容,將內容保存在文件write.txt中

<code class="hljs cs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> FileOutputStreamDemo {

    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">main</span>(String[] args) throws IOException {

        FileOutputStream fos = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> FileOutputStream(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"write.txt"</span>);
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> a;
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> ((a = System.<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">in</span>.read()) != -<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) {
            fos.write(a);
        }
    }
}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li></ul>

結果:

這裏寫圖片描述

這裏寫圖片描述

有同學會問了,剛纔上面漢字的讀取不是一個字節一個字節讀,存到文件中的應該也是一個字節一個字節的,那麼查看的時候不應該是亂碼嗎?

答:從鍵盤讀取的時候確實是一個字節一個字節讀取,存的時候也是一個字節一個字節存,只不過它會加點標誌(不同的編碼集標記的方式可能不一樣)。(我這裏的編碼是每個漢字用三個字節編碼,用兩個字節來標記一行),到時候輸出的時候它就會根據標記和漢字所佔字節數來拼接成漢字。

我們來輸出看一下:

<code class="hljs cs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> FileInputStreamDemo {

    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">main</span>(String[] args) throws IOException {
        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//哈:   229 147 136 13 10   </span>
        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//哈哈:  229 147 136 229 147 136 13 10  </span>
        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//哈哈哈: 229 147 136 229 147 136 229 147 136 13 10  </span>
        <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">//哈哈(兩行)哈哈:229 147 136 229 147 136 13 10 229 147 136 229 147 136 13 10 </span>
        FileInputStream fis = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span>  FileInputStream(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"a.txt"</span>);
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> a;
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> ((a = fis.read()) != -<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) {
            System.<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">out</span>.print(a+<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">" "</span>);
        }
    }
}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li></ul>

結果:

這裏寫圖片描述

這裏的結果是哈哈(兩行)哈哈的輸出結果,當然也分別測了四種情況,爲了更好的對比:

當 a.txt 的內容爲哈、哈哈、哈哈、哈哈(兩行)哈哈的時候,存的時候各是什麼情況,代碼中都寫了,大家可以看看。可以發現標記一行的是13 10 這兩個字節。不要問我這明明就是個整數不是佔4個字節,爲什麼說是一個字節?read() 的返回值爲 int,取出的 byte 高位補0成int。那麼怎麼拼接的呢?比如:內容爲哈的時候,首先找到標記的位置,用(所佔字節數-2)/3=漢字的個數,而每個漢字佔三個字節,這不就可以三個三個字節拼接出來了嗎。

5、緩衝輸入輸出流 BufferedInputStream/ BufferedOutputStream(也稱包裝流)

這裏寫圖片描述

計算機訪問外部設備非常耗時。訪問外存的頻率越高,造成CPU閒置的概率就越大。

爲了減少訪問外存的次數,應該在一次對外設的訪問中,讀寫更多的數據。

爲此,除了程序和流節點間交換數據必需的讀寫機制外,還應該增加緩衝機制。

緩衝流就是每一個數據流分配一個緩衝區,一個緩衝區就是一個臨時存儲數據的內存。

這樣可以減少訪問硬盤的次數,提高傳輸效率。

BufferedInputStream:當向緩衝流寫入數據時候,數據先寫到緩衝區,待緩衝區寫滿後,系統一次性將數據發送給輸出設備。

BufferedOutputStream :當從向緩衝流讀取數據時候,系統先從緩衝區讀出數據,待緩衝區爲空時,系統再從輸入設備讀取數據到緩衝區。

a、將文件讀入內存:

將BufferedInputStream與FileInputStream相接

FileInputStream in=new FileInputStream( “file1.txt “);

BufferedInputStream bin=new BufferedInputStream(in);

b、將內存寫入文件:

將BufferedOutputStream與 FileOutputStream相接

FileOutputStreamout=new FileOutputStream(“file2.txt”);

BufferedOutputStream bin=new BufferedInputStream(out);

c、鍵盤輸入流讀到內存 
將BufferedReader與標準的數據流相接

InputStreamReader sin=new InputStreamReader (System.in) ;

BufferedReader bin=new BufferedReader(sin);

例子:從鍵盤輸入一串內容存到file1.txt文件中

<code class="hljs cs has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> FileInputStreamDemo {

    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">main</span>(String[] args) throws IOException {
        BufferedReader br = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> BufferedReader(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> InputStreamReader(System.<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">in</span>));
        BufferedWriter bw = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> BufferedWriter(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> FileWriter(<span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> File(<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"file1.txt"</span>)));
        String s;
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> ((s = br.readLine()).length() > <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>) {
            bw.write(s, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>, s.length());
        }
    }
}
</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li></ul>

結果:

這裏寫圖片描述

這裏寫圖片描述

大家可以看到,我們剛纔在鍵盤上輸入的內容並沒有存入到這個文件中,這不是操蛋嗎?這樣只是爲了引出包裝流的一個特性即因爲它是包裝流擁有緩存區,每次的讀取的數據都存在緩存區中,當緩存區滿了的時候纔會寫入到硬盤上。但是默認的緩存區大小爲8192個字節,當然你也可以指定緩存區的大小。顯然剛纔輸入的字符串並沒有裝滿。

這裏寫圖片描述

指定緩存區的大小:包裝流的構造器

如 BufferedWriter(Writer out, int size) 
創建一個使用給定大小輸出緩衝區的新緩衝字符輸出流。size爲緩存區的大小

所以就需要我們手動的去刷新緩衝區。調用包裝流的 flush() 方法。這個方法的作用就是將緩存區的內容寫入到硬盤上並清空緩存區。

當然能不能不寫 flush()方法也讓它刷新呢?

答:可以,調用 close() 方法關閉流即可。當你調用 close()方法時它會先刷新緩存區。這就是剛纔上面所說要記得用完之後要關閉流。不過最好有使用到包裝流的時候兩個方法都記得寫上。

程序說明:

從鍵盤讀入字符,並寫入到文件中BufferedReader類的方法:String readLine()

作用:讀一行字符串,以回車符爲結束。

BufferedWriter類的方法:bout.write(String s,offset,len)

作用:從緩衝區將字符串s從offset開始,len長度的字符串寫到某處。

當然包裝流中還有許多方法(主要方法):

void write(char ch);//寫入單個字符。

void write(char []cbuf,int off,int len)//寫入字符數據的某一部分。
void write(String s,int off,int len)//寫入字符串的某一部分。

void newLine()//寫入一個行分隔符。

void flush();//刷新該流中的緩衝。將緩衝數據寫到目的文件中去。

void close();//關閉此流,再關閉前會先刷新他。

6、Writer/Reader字符流

a、Reader抽象類

用於讀取字符流的抽象類。子類必須實現的方法只有 read(char[], int, int) 和 close()。但是,多數子類將重寫此處定義的一些方法,以提供更高的效率和/或其他功能。

子類簡單介紹:

(1) 用指定字符數組作爲參數:CharArrayReader(char[]) 

    將字符數組作爲輸入流:CharArrayReader(char[], int, int) 
讀取字符串,構造函數如下: public StringReader(String s); 

2) CharArrayReader:與ByteArrayInputStream對應 

3) StringReader : 與StringBufferInputStream對應 

4) InputStreamReader 
從輸入流讀取字節,在將它們轉換成字符:Public inputstreamReader(inputstream is); 

5) FilterReader: 允許過濾字符流 
protected filterReader(Reader r); 

6) BufferReader :接受Reader對象作爲參數,並對其添加字符緩衝器,使用readline()方法可以讀取一行。 
Public BufferReader(Reader r); 

主要方法:

  (1)  public int read() throws IOException; //讀取一個字符,返回值爲讀取的字符 


 (2)  public int read(char cbuf[]) throws IOException; /*讀取一系列字符到數組cbuf[]中,返回值爲實際讀取的字符的數量*/ 

  (3)  public abstract int read(char cbuf[],int off,int len) throws IOException; /*讀取len個字符,從數組cbuf[]的下標off處開始存放,返回值爲實際讀取的字符數量,該方法必須由子類實現*/ 

b、 Writer抽象類

寫入字符流的抽象類。子類必須實現的方法僅有 write(char[], int, int)、flush() 和 close()。但是,多數子類將重寫此處定義的一些方法,以提供更高的效率和/或其他功能。

子類簡單介紹:

1) FileWrite: 與FileOutputStream對應  

  將字符類型數據寫入文件,使用缺省字符編碼和緩衝器大小。 
  Public FileWrite(file f);

2)  chararrayWrite:與ByteArrayOutputStream對應 ,將字符緩衝器用作輸出。 

   Public CharArrayWrite(); 
   
3) PrintWrite:生成格式化輸出 
   public PrintWriter(outputstream os); 
   
4) filterWriter:用於寫入過濾字符流 
   protected FilterWriter(Writer w); 
   
5) PipedWriter:與PipedOutputStream對應

6) StringWriter:無與之對應的以字節爲導向的stream  

主要方法:

  (1)  public void write(int c) throws IOException; //將整型值c的低16位寫入輸出流 
  
  (2)  public void write(char cbuf[]) throws IOException; //將字符數組cbuf[]寫入輸出流 
  
  (3)  public abstract void write(char cbuf[],int off,int len) throws IOException; //將字符數組cbuf[]中的從索引爲off的位置處開始的len個字符寫入輸出流 
  
  (4)  public void write(String str) throws IOException; //將字符串str中的字符寫入輸出流 
  
  (5)  public void write(String str,int off,int len) throws IOException; //將字符串str 中從索引off開始處的len個字符寫入輸出流 
  
  (6)  flush( ) //刷空輸出流,並輸出所有被緩存的字節。 
  
  (7)close()    關閉流 public abstract void close() throws IOException

當然這些子類我這裏就不一一去詳細介紹了,我相信大家看懂了字符流的用法,再去學習字符流的話應該不在話下的。

7、輸入流和輸出流的應用

這裏就介紹的文件輸入流和文件輸出流一起使用的情況。

例子:利用程序將文件a.CHM 拷貝到a.chm中。

這裏分別用了四種方式,也算對這些的流的速率的一個對比,這四種情況分別是:

1)基本字節流每次讀一個字節

2)基本字節流每次讀一組字節

3)高效字節流每次讀一個字節(即包裝流)

4)高效字節流每次讀一組字節(即包裝流)

<code class="hljs java has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">class</span> <span class="hljs-title" style="box-sizing: border-box; color: rgb(102, 0, 102);">CopyDemo</span> {</span>

    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">main</span>(String[] args) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">throws</span> IOException {
        String source = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"a.CHM"</span>;
        String dict = <span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"copy.chm"</span>;
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">long</span> startTime = System.currentTimeMillis();
        method4(source, dict);
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">long</span> endTime = System.currentTimeMillis();
        System.out.println((endTime - startTime)+<span class="hljs-string" style="color: rgb(0, 136, 0); box-sizing: border-box;">"毫秒"</span>);
    }

    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 基本字節流每次讀一個字節</span>
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">method1</span>(String source, String dict) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">throws</span> IOException {
        FileInputStream fis = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> FileInputStream(source);
        FileOutputStream fos = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> FileOutputStream(dict);
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> a;
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> ((a = fis.read()) != -<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) {
            fos.write(a);
        }
        fos.close();
        fis.close();
    }

    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 基本字節流每次讀一組字節</span>
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">method2</span>(String source, String dict) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">throws</span> IOException {
        FileInputStream fis = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> FileInputStream(source);
        FileOutputStream fos = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> FileOutputStream(dict);
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">byte</span>[] b = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">byte</span>[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1024</span>];
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> len;
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> ((len = fis.read(b)) != -<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) {
            fos.write(b, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>, len);
        }
        fos.close();
        fis.close();
    }

    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 高效字節流每次讀一個字節</span>
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">method3</span>(String source, String dict) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">throws</span> IOException {
        FileInputStream fis = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> FileInputStream(source);
        BufferedInputStream bis = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> BufferedInputStream(fis);
        FileOutputStream fos = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> FileOutputStream(dict);
        BufferedOutputStream bos = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> BufferedOutputStream(fos);
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> a;
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> ((a = fis.read()) != -<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) {
            fos.write(a);
        }
        bos.close();
        bis.close();
    }

    <span class="hljs-comment" style="color: rgb(136, 0, 0); box-sizing: border-box;">// 基本字節流每次讀一組字節</span>
    <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">static</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">method4</span>(String source, String dict) <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">throws</span> IOException {
        FileInputStream fis = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> FileInputStream(source);
        BufferedInputStream bis = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> BufferedInputStream(fis);
        FileOutputStream fos = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> FileOutputStream(dict);
        BufferedOutputStream bos = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> BufferedOutputStream(fos);
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">byte</span>[] b = <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">new</span> <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">byte</span>[<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1024</span>];
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">int</span> len;
        <span class="hljs-keyword" style="color: rgb(0, 0, 136); box-sizing: border-box;">while</span> ((len = fis.read(b)) != -<span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">1</span>) {
            fos.write(b, <span class="hljs-number" style="color: rgb(0, 102, 102); box-sizing: border-box;">0</span>, len);
        }
        bos.close();
        bis.close();
    }
}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li><li style="box-sizing: border-box; padding: 0px 5px;">45</li><li style="box-sizing: border-box; padding: 0px 5px;">46</li><li style="box-sizing: border-box; padding: 0px 5px;">47</li><li style="box-sizing: border-box; padding: 0px 5px;">48</li><li style="box-sizing: border-box; padding: 0px 5px;">49</li><li style="box-sizing: border-box; padding: 0px 5px;">50</li><li style="box-sizing: border-box; padding: 0px 5px;">51</li><li style="box-sizing: border-box; padding: 0px 5px;">52</li><li style="box-sizing: border-box; padding: 0px 5px;">53</li><li style="box-sizing: border-box; padding: 0px 5px;">54</li><li style="box-sizing: border-box; padding: 0px 5px;">55</li><li style="box-sizing: border-box; padding: 0px 5px;">56</li><li style="box-sizing: border-box; padding: 0px 5px;">57</li><li style="box-sizing: border-box; padding: 0px 5px;">58</li><li style="box-sizing: border-box; padding: 0px 5px;">59</li><li style="box-sizing: border-box; padding: 0px 5px;">60</li><li style="box-sizing: border-box; padding: 0px 5px;">61</li><li style="box-sizing: border-box; padding: 0px 5px;">62</li><li style="box-sizing: border-box; padding: 0px 5px;">63</li><li style="box-sizing: border-box; padding: 0px 5px;">64</li><li style="box-sizing: border-box; padding: 0px 5px;">65</li></ul><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li><li style="box-sizing: border-box; padding: 0px 5px;">36</li><li style="box-sizing: border-box; padding: 0px 5px;">37</li><li style="box-sizing: border-box; padding: 0px 5px;">38</li><li style="box-sizing: border-box; padding: 0px 5px;">39</li><li style="box-sizing: border-box; padding: 0px 5px;">40</li><li style="box-sizing: border-box; padding: 0px 5px;">41</li><li style="box-sizing: border-box; padding: 0px 5px;">42</li><li style="box-sizing: border-box; padding: 0px 5px;">43</li><li style="box-sizing: border-box; padding: 0px 5px;">44</li><li style="box-sizing: border-box; padding: 0px 5px;">45</li><li style="box-sizing: border-box; padding: 0px 5px;">46</li><li style="box-sizing: border-box; padding: 0px 5px;">47</li><li style="box-sizing: border-box; padding: 0px 5px;">48</li><li style="box-sizing: border-box; padding: 0px 5px;">49</li><li style="box-sizing: border-box; padding: 0px 5px;">50</li><li style="box-sizing: border-box; padding: 0px 5px;">51</li><li style="box-sizing: border-box; padding: 0px 5px;">52</li><li style="box-sizing: border-box; padding: 0px 5px;">53</li><li style="box-sizing: border-box; padding: 0px 5px;">54</li><li style="box-sizing: border-box; padding: 0px 5px;">55</li><li style="box-sizing: border-box; padding: 0px 5px;">56</li><li style="box-sizing: border-box; padding: 0px 5px;">57</li><li style="box-sizing: border-box; padding: 0px 5px;">58</li><li style="box-sizing: border-box; padding: 0px 5px;">59</li><li style="box-sizing: border-box; padding: 0px 5px;">60</li><li style="box-sizing: border-box; padding: 0px 5px;">61</li><li style="box-sizing: border-box; padding: 0px 5px;">62</li><li style="box-sizing: border-box; padding: 0px 5px;">63</li><li style="box-sizing: border-box; padding: 0px 5px;">64</li><li style="box-sizing: border-box; padding: 0px 5px;">65</li></ul>

當然測試的文件儘量大點,不然差別不是很明顯,我這裏的a.CHM文件的大小爲35.2 MB。當然用時也跟計算機性能有點關係。當然文件大點差別就更加明顯點。

在我電腦上的四種情況的用時爲:

1.221196毫秒

2.346毫秒

3.220454毫秒

4.335毫秒

這裏1和3,2和4比較,可以發現包裝流更加高效,爲什麼呢?

比較下2和4,把這個搞懂,其他的也就懂了。

這裏寫圖片描述

這兩個從硬盤上讀取內容的時間應該差不多,但時間就差在寫的時間上了,緩存區一般在內存,內存的速度是很快的,將數據寫入到硬盤的速度是很慢的,所以我們只需要減少寫入硬盤的次數即可。包裝流的默認緩存區大小爲8192字節,包裝流讀取8次才寫一次,所以包裝流的效率是大大增加了。

六、Java IO 的一般使用原則

一)按數據來源(去向)分類:

1 、是文件: FileInputStream, FileOutputStream, ( 字節流 )FileReader, FileWriter( 字符 )

2 、是 byte[] : ByteArrayInputStream, ByteArrayOutputStream( 字節流 )

3 、是 Char[]: CharArrayReader, CharArrayWriter( 字符流 )

4 、是 String: StringBufferInputStream, StringBufferOuputStream ( 字節流 )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

由於篇幅有限,還有一些細節的這裏就不多說了,想要了解的話可以加我QQ460821714一起討論。

ASCII 碼對照表

下表列出了字符集中的 0 - 127 (0x00 - 0x7F)。

這裏寫圖片描述 
這裏寫圖片描述

下表列出了字符集中的 128 - 255 (0x80 - 0xFF)。

這裏寫圖片描述 
這裏寫圖片描述

注:

數值 8、9、10 和 13 可以分別轉換爲退格符、製表符、換行符和回車符。這些字符都沒有圖形表示,但是對於不同的應用程序,這些字符可能會影響文本的顯示效果。

“空” 表示在當前平臺上不支持的字符。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章