1. 程式人生 > >java中Buffered讀取圖片的問題

java中Buffered讀取圖片的問題

問題:

使用BufferedReader和BufferedWriter從一個地方讀取到另一個地方後,無法開啟,並且圖片大小比原來的圖片要大。

BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(new File("C:\\Users\\acer\\Desktop\\loginbg.jpg"))));
        String string = "";
        String len = "";
        while ((len = bufferedReader.readLine()) != null
) { string += len; } BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File("C:\\Users\\acer\\Desktop\\a\\mzd.jpg")), "utf-8")); bufferedWriter.write(string); bufferedReader.close(); bufferedWriter.flush(); bufferedWriter.close();

發現:

隨後使用了FileInputStream和FileOutputStream讀取圖片,發現圖片可以打開了。

FileInputStream inputStream = new FileInputStream(new            File("C:\\Users\\acer\\Desktop\\loginbg.jpg"));
OutputStream outputStream = new FileOutputStream(newFile("C:\\Users\\acer\\Desktop\\a\\mzd.jpg"));
            int len = 0;
            //byte[] bytes = new byte[inputStream .available()];
byte[] bytes = new byte[1024]; while ((len = inputStream.read(bytes)) != -1) { outputStream.write(bytes); outputStream.flush(); } outputStream.close(); inputStream.close();

分析:

我猜想可能的原因:(可能不對,僅供參考!!!)

1、FileInputStream 到BufferedReader 之間可以設定編碼,有可能是編碼的改變,是圖片無法開啟。

2、bufferedReader.readLine()方法讀取了多餘的空白字元,使得寫出的圖片中的字元變多,從而導致圖片無

法開啟,因為讀完後圖片確實變大了。

3、string += len中字串拼接出錯。

總結:

一、字元流是官方對位元組流的一種封裝,一種簡化,其目的為了令開發者更加好的讀取文字。

二、FileOutputStream和FileInputStream :

1、屬於位元組流。

2、能設定是否覆蓋原來的內容,true表示不覆蓋,接著寫;false表示覆蓋,重寫

三、OutputStreamWriter和InputStreamReader:

1、屬於字元流。

2、能設定檔案讀寫編碼。

四、BufferedWriter 和BufferedReader:

1、屬於字元流

2、提供快取區,效率高,讀滿緩衝區返回

五、bufferedReader.readLine():

1、如果不指定buffer大小,則readLine()使用的buffer有8192個字元。

2、在達到buffer大小之前,只要是在換行符前的,全部都讀取,包括空的字元。(這裡可以看一下readLine的原始碼)

這裡寫圖片描述

3、readLine方法在遇到終止符、資料流發生異常或者另一端被close()掉時,才會返回null值。

4、如果讀不到換行符,尤其是socket程式設計中,readLine阻塞將變成家常便飯。

六、byte[] bytes = new byte[1024]

byte[] bytes = new byte[1024]表示1M大小的位元組陣列,但是如果圖片的大小超過1M的話,也許就是執行兩個或者多

個while,也許讀取的圖片也無法開啟(個人猜想)。我建議使用byte[] bytes = new byte[inputStream .available()],

其中的inputStream .available()表示圖片有多大就定義多大的位元組陣列,這樣既能節約記憶體,又能保證圖片正確讀出,

但是存在的隱患就是圖片太大,造成記憶體溢位的現象。

七、用字元流讀取圖片是一種自己給自己挖坑然後跳進去再想辦法跳出來的行為。