-------------siwuxie095
工程名:TestRWByteStream
包名:com.siwuxie095.bytestream
類名:ReadByteStream.java、WriteByteStream.java、CopyByByteStream.java
手動在工程上創建文件:
在工程名:TestRWByteStream 上,右鍵->New->Untitled Text File,
輸入文本,保存路徑選擇 TestRWByteStream,命名為 text.txt
text.txt 的內容如下:
打開資源管理器,在工程 TestRWByteStream 文件夾下,放入一張
GIF圖片:cherry.gif
工程結構目錄如下:
ReadByteStream.java:
package com.siwuxie095.bytestream;
import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException;
public class ReadByteStream {
public static void main(String[] args) {
//使用字節流讀取文件 //這里讀取的是文本數據,所以后面的操作中使用的是文本方式 //對當前讀到的字節進行解碼 //如果操作的是別的類型的文件,如:MP3,影片等, //后續需要對讀取到的字節使用另外的方式進行解碼
try {
//創建一個文件輸入流 FileInputStream 傳入String型參數:text.txt //(一般由 Stream 結尾是字節流) //有異常拋出,用 try catch 捕獲:Surround with try/catch FileInputStream fis=new FileInputStream("text.txt");
//使用 FileInputStream的read()方法讀取數據,需要傳入一個byte型數組參數 //根據字節數組的大小從文件中讀取相應數量的數據放入到數組中 //要讀取到字節數組中首先要創建一個字節數組,指定的字節數組的長度不能超過文件的大小 //執行讀取操作 fis.read() 時會有異常拋出, //添加到try catch語句中:Add catch clause to surrounding try byte input[]=new byte[20]; fis.read(input);
//將數組讀取到input數組中后,由於知道讀取的目標是一個文本文檔 //可以把當前讀取到的數據轉換成字符串 // //創建一個String對象,傳入數組input,此時數組長度為20, //(1)打印發現出現問號,這是因為在讀取時,假如每一個漢字占兩個字節, //如果當前讀取到漢字的第一個字節就結束的話,數據就被損壞了 //(2)此時將數組的長度改為22,就正常顯示了 // //這里並沒有出現亂碼的問題,因為在系統的默認情況下,Java會以當前系統的默認字符集作為解碼方式 //由於默認字符集就是 UTF-8,和寫入文件 text.txt 時使用的字符集相同,所以沒有亂碼 // //如果只傳入數組input的同時,手動指定字符集,如果指定錯誤就會亂碼 //(3)當前文本 text.txt 是UTF-8,如果強制當前String使用GBK方式來解碼,輸出就會亂碼 //String inputString=new String(input,"GBK"); String inputString=new String(input,"UTF-8"); System.out.println(inputString);
//當輸入輸出流操作完畢后,要將流關閉 fis.close();
//流的打開(new)、流的讀取/寫入、流的關閉 //才是一個完整的流的操作過程
} catch (FileNotFoundException e) { //FileInputStream 的 catch e.printStackTrace(); } catch (IOException e) { //fis.read() fis.close() 的catch e.printStackTrace(); } }
} |
運行一覽:
(1)當數組長度為 20 時:
(2)當數組長度為 22 時:
(3)當指定編碼為 GBK 時:
WriteByteStream.java:
package com.siwuxie095.bytestream;
import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException;
public class WriteByteStream {
public static void main(String[] args) {
//使用字節流寫入文件
try {
//創建一個文件輸出流 FileOutputStream 實例 //傳入字符串,為當前的文件輸出流指定文件 //有異常拋出,使用 try catch語句捕獲:Surround with try/catch FileOutputStream fos=new FileOutputStream("textx.txt");
//使用 FileOutputStream 的 write() 方法寫出數據 //這里選擇寫出字節數組的方法,需要有一個字節數組作參數 //因為要寫出的數據是文本數據,先創建一個String String outString="write:123456寫出數據";
//可以直接從當前的String對象中獲取它的字節數組 //同時可以使用字符串指定字符編碼 byte output[]=outString.getBytes();
//在這里由於寫出的是文本文件,所以在寫出數組之前,是將String獲取為字節數組 //如果需要寫出別的類型的數據,如:音樂、電影、圖片等,需要使用對應的方法將 //那些數據同樣轉換為字節型的數組,然后再進行寫出
//傳入output,同時有異常拋出,使用 try catch包圍 //Add catch clause to surrounding try fos.write(output);
//當輸入輸出流操作完畢后,要將流關閉 fos.close();
//流的打開(new)、流的讀取/寫入、流的關閉 //才是一個完整的流的操作過程
} catch (FileNotFoundException e) { //FileOutputStream 的 catch e.printStackTrace(); } catch (IOException e) { //fos.write() fos.close() 的 catch e.printStackTrace(); } }
} |
運行后,工程結構目錄一覽:
textx.txt 的內容:
CopyByByteStream.java:
package com.siwuxie095.bytestream;
import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException;
public class CopyByByteStream {
/** * 文件的拷貝: * * 字節流能將文件的數據讀取到本地的字節數組當中, * 而且字節流也能將本地的字節數組寫入到文件當中, * * 如果將這個字節數組作為中間的鏈接,同時使用輸入流和輸出流, * 就可以實現文件的拷貝 * * @param args */ public static void main(String[] args) {
//通過字節的輸入流和輸出流,實現文件讀取、文件寫入、文件拷貝
try {
//會有異常拋出,選中下面一段代碼,右鍵->Surround With->Try/catch Block //創建一個文件輸入流,讀取文件數據 //(這里是一張櫻花飄落的GIF圖:28 KB--29256 byte) FileInputStream fis=new FileInputStream("cherry.gif"); //再創建一個文件輸出流,作為文件的拷貝對象 FileOutputStream fos=new FileOutputStream("cherry_new.gif");
//文件輸入流直接將數據讀取到一個字節型數組:input數組中,直接將該數組寫出到新的文件
//FileInputStream 的 read() 方法可以將文件數據讀取到一個字節型的數組當中 //先創建一個字節型的數組,並指定大小為50 byte input[]=new byte[50];
//但當前的文件是 28 KB,50個字節只能讀取一小部分,遠遠不夠 //需要循環將文件里的數據讀取並寫入到新的文件中 //FileInputStream 的 read() 方法,返回一個int型值, //這個int值代表從文件讀取到數組中的數據長度,如果返回-1, //則說明文件中已經沒有數據了,即讀取到文件末尾了 //有異常拋出:Add catch clause to surrounding try while (fis.read(input)!=-1) { //讀取到數組中后,再寫入到新的文件中 fos.write(input); }
//寫出之后,關閉流 fis.close(); fos.close(); System.out.println("done");
} catch (FileNotFoundException e) { //FileInputStream FileOutputStream 的 catch e.printStackTrace(); } catch (IOException e) { //fis.read() fos.write() fis.close() fos.close() 的 catch e.printStackTrace(); }
}
} |
運行一覽:
運行后,工程結構目錄一覽:
【made by siwuxie095】
