Java中I/O流實現字元流、位元組流和緩衝流對檔案的輸入輸出
阿新 • • 發佈:2021-01-30
Java程式中,對於資料的輸入/輸出操作以 “流(stream)” 的方式進行。 java.io包下提供了各種“流”類和介面,用以獲取不同種類的資料,並通過標準的方法輸入或輸出資料。
一、原理
1.輸入input:讀取外部資料(磁碟、光碟等儲存裝置的資料)到程式(記憶體)中
2.輸出output:將程式(記憶體)資料輸出到磁碟、光碟等儲存裝置中。
二、流的體系結構
三、字元流實現文字檔案傳輸
說明:如果使用單元測試,檔案相對路徑為當前module。
如果使用main()測試,檔案相對路徑為當前工程
@Test public void test3(){ FileReader fr = null; FileWriter fw = null; try { //1.File類的例項化 //sorFile原始檔 outFile目標檔案 File sorFile = new File("Hello.txt"); File outFile = new File("Hi.txt"); //2.提供具體的流 fr = new FileReader(sorFile); fw = new FileWriter(outFile); //3.讀/寫操作 char[] cbuf = new char[1024]; int len; while ((len= fr.read(cbuf))!=-1){ // String str = new String(cbuf,0,len); fw.write(cbuf,0,len); } System.out.println("檔案複製成功"); } catch (IOException e) { e.printStackTrace(); } finally { //4.關閉流 try { fr.close(); } catch (IOException e) { e.printStackTrace(); } try { fw.close(); } catch (IOException e) { e.printStackTrace(); } } }
四、位元組流實現非文字檔案傳輸(如.jpg)
@Test public void test4(){ FileInputStream fis = null; FileOutputStream fos = null; try { //1.File類的例項化 File sorFile = new File("1374225513544.jpg"); File outFile = new File("an1374225513544.jpg"); //2.提供具體的流 fis = new FileInputStream(sorFile); fos = new FileOutputStream(outFile); //3.輸入/輸出操作 byte[] bytes = new byte[1024]; int len; while ((len=fis.read(bytes))!=-1){ fos.write(bytes,0,len); } System.out.println("圖片複製成功"); } catch (IOException e) { e.printStackTrace(); } finally { //4.關閉流 try { if (fis!=null) fis.close(); } catch (IOException e) { e.printStackTrace(); } try { if (fos!=null) fos.close(); } catch (IOException e) { e.printStackTrace(); } } }
執行結果:
五、位元組型緩衝流實現非文字檔案傳輸
public void copyFileWithBuffered(String sorFile,String outFile){ BufferedInputStream bis = null; BufferedOutputStream bos = null; try { //1.File檔案例項化 File ansorFile = new File(sorFile); File anoutFile = new File(outFile); //2.1提供具體的流---造節點流 FileInputStream fis = new FileInputStream(ansorFile); FileOutputStream fos = new FileOutputStream(anoutFile); //2.2造緩衝流 bis = new BufferedInputStream(fis); bos = new BufferedOutputStream(fos); //3.讀入/寫出操作 byte[] bytes = new byte[5]; int len; while ((len=bis.read(bytes))!=-1){ bos.write(bytes,0,len); } System.out.println("複製成功!"); } catch (IOException e) { e.printStackTrace(); } finally { //4.關閉流 //說明:關閉外層流的同時,內層流會自動關閉。 try { if (bis!=null) bis.close(); } catch (IOException e) { e.printStackTrace(); } try { if (bos!=null) bos.close(); } catch (IOException e) { e.printStackTrace(); } } } @Test public void test(){ String sorFile="1374225513544.jpg"; String outFile ="new1374225513544.jpg"; long start = System.currentTimeMillis(); copyFileWithBuffered(sorFile,outFile); long end = System.currentTimeMillis(); System.out.println("複製花費時間:"+(end-start)); }
這裡可以看到此次執行所花費時間:
說明:緩衝流提高了讀、寫操作的速度。處理流,就是“套接”在已有流的基礎上。
六、字元型緩衝流實現文字檔案傳輸
@Test
public void test5(){
BufferedReader br = null;
BufferedWriter bw = null;
try {
br = new BufferedReader(new FileReader("Hello.txt"));
bw = new BufferedWriter(new FileWriter("sayHi.txt"));
char[] cbuf = new char[5];
int len;
while ((len=br.read(cbuf))!=-1){
bw.write(cbuf,0,len);
}
System.out.println("文字複製成功!");
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (br!=null)
br.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
if (bw!=null)
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
執行結果: