使用字節流讀寫數據


-------------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");

 

 

//使用 FileInputStreamread()方法讀取數據,需要傳入一個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 KB50個字節只能讀取一小部分,遠遠不夠

//需要循環將文件里的數據讀取並寫入到新的文件中

//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】


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM