Java中I/O流總結

Java中只有兩種類型的流:字節流和字符流
1.字符流,主要是指處理的時候是以字符爲單位,一般是用來處理TXT文本文檔的讀寫。特點:處理更方便。
2.字節流,除了字符流,其他的都是以字節流的形式出現。處理所有的二進制文件。特點:使用更廣泛。

另外,爲了把流的概念徹底搞清楚,首先要了解以下幾個概念。
1.輸入流輸出流:一切以“內存”爲中心,所有往內存輸入的流,我們管它叫“輸入流”;所有從內存往“外部”(節點)輸出的流,我們管它叫“輸出流”。
2.節點流:外部的種類非常多,包括文件、緩衝區、管道、字節數組、打印機等,外部設備統稱爲節點。因此相對應的輸入輸出流就有FileInputStream/FileOutputStream、BufferedInputStram/BufferedOutputStram…依次對應。即每種外設理論上對應一種節點流。如果類型爲是“字節流”,那麼一般會以InputStream/OutputStream結尾;如果是“字符流”,那麼一般會以Reader/Writer結尾。
3.處理流:爲了隱藏各個不同的節點流的差異,對外提供更加方便的輸入輸出方法。即通過包裝節點流,形成新的流,使這種新的流會更加通用,處理起來更加方便,所以叫做處理流。這裏用了典型的“適配器模式”。
4.轉換流:爲了能夠在字節流和字符流之間進行轉換,於是有了轉換流的概念。實際上,只有字節流轉換爲字符流。因爲一旦是字符流了,已經是處理更方便的流了,爲什麼要轉換爲處理不那麼方便的流呢,因此Java中只提供了字節流往字符流進行轉換的API(InputStreamReader、OutputStreamReader)

讀舉例:
Read

FileInputStream fs=new FileInputStream(file);
byte []bs=new byte[1024];//定義一個類似水桶的,用來盛放讀到內存中的流。
Int hasReadLength=0;
While((hasReadLength=fs.read(bs))>0)
{
//處理bs
}

fs.close()//記得要關閉流,有始有終。

邊讀邊寫舉例:

DataOutputStream dos = new DataOutputStream( conn.getOutputStream());//對根據url建立的連接流進行封裝
                StringBuffer sb = new StringBuffer();           
                sb.append(PREFIX);
                dos.write(sb.toString().getBytes());
                InputStream is = new FileInputStream(file);//建立文件輸入流
                byte[] bytes = new byte[1024];//建立緩衝區(相當於“打水桶”)
                int len = 0;
                while((len=is.read(bytes))!=-1)//從輸入流is讀入到字節數組bytes中,然後從字節數組中寫到輸出流dos中
                {
                    dos.write(bytes, 0, len);//每次讀多少,寫多少
                }
                is.close();
                dos.write(LINE_END.getBytes());

文件分批次讀寫舉例:
fileInputStream 可以分多次讀,每次從Index=0開始讀,但會用一點,少一點。
具體例子見下一篇博客《局域網內替換用戶下載的apk》

總結

1.根據實際情況(字符流or字節流,讀or寫),建立相應的流(Reader/Writer or InputStream/outputStream)
2.建立緩衝區,一般建立一個1K大小的字節數組作爲讀寫的內存緩衝區
3.用“多次打水”的方式,形式爲
inputStream.read(bytes) ;
outputStream.write(bytes);

//*作者:守靜居士
//*轉載請註明出處:
http://blog.csdn.net/csp277/article/details/45841549
//*時間:20150520

發佈了34 篇原創文章 · 獲贊 5 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章