關於IO的一些總結與體會
阿新 • • 發佈:2018-11-11
IO流是用來處理裝置與程式之間的資料傳輸。
按流向分為:
①輸入流:OutputStream和Writer為基類。
②輸出流:InputStream和Reader為基類。
按處理的單位分為:
①位元組流:InputStream基類。
②字元流:OutputStream基類。
按流的角色分為:
①節點流:可以從一個特定的 IO 裝置讀/寫資料的流(訪問檔案相關,也叫檔案流,程式直接作用在檔案上)。
②處理流:對一個已存在的流進行連線和封裝,通過封裝後的流來實現資料讀/寫操作。
一、在訪問檔案使用FileInputStream和OutputStream時的步驟為:
1.建立一個File類的物件;
2.建立一個FileInputStream類或FileOutputStream類的物件;
3.呼叫FileInputStream或FileOutputStream中的方法,實現file檔案的讀取或寫入;
4.關閉相應的流(遵循先開後關的準則)。
package com.hpe.test;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
/**
* 類描述:測試輸入流
* 作者: author
* 建立日期:2018年8月15日
* 修改人:
* 修改日期:
* 修改內容:
* 版本號: 1.0.0
*/
public class TestFileInputStream {
public static void main(String[] args) {
FileInputStream fis=null ;
try {
File file=new File("hello.txt");
fis=new FileInputStream(file);
// 將讀取到的資料寫入陣列
byte[] b=new byte[5];
// 每次讀入到byte中位元組的長度
int len;
while ((len=fis.read(b))!=-1) {
for (int i = 0; i <len; i++) {
// 由於byte中儲存的是該字元在ASCII程式碼中對應的十進位制值
// 因此需要轉換成char才能將字元顯示出來
System.out.print((char)b[i]);
}
}
} catch (Exception e) {
e.printStackTrace();
}finally {
if (fis!=null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
package com.hpe.test;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* 類描述:測試輸出流
* 作者: author
* 建立日期:2018年8月15日
* 修改人:
* 修改日期:
* 修改內容:
* 版本號: 1.0.0
*/
public class TestFileOutputStream {
public static void main(String[] args) {
// 1.建立一個File物件,指定要寫入的檔案位置
FileOutputStream fos = null;
try {
File file = new File("hello2.txt");
// 2.建立一個FileOutputStream物件,將file的物件作為形參傳遞給構造器中
fos = new FileOutputStream(file);
// 3.寫入操作將字串轉為位元組陣列
String str = new String("hello");
fos.write(str.getBytes());
} catch (Exception e) {
e.printStackTrace();
} finally {
// 4.關閉輸出流
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
二、使用BuffererInputStream和BufferedOutputStream時的步驟:
1.提供讀入、寫出的檔案;
2.建立響應節點流FileInputStream FileOutputStream;
3.將建立的節點流的物件作為形參傳遞給緩衝流的構造器中;
4.呼叫BuffererInputStream的 read()方法和BufferedOutputStream的write()方法;
5.關閉相應的流(遵循先開後關的準則)。
package com.hpe.test;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* 類描述:測試緩衝流
* 作者: author
* 建立日期:2018年8月15日
* 修改人:
* 修改日期:
* 修改內容:
* 版本號: 1.0.0
*/
public class TestBufferedInputOutputStream {
public static void main(String[] args) {
// 使用BuffererInputStream和BufferedOutputStream
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
try {
// 1.提供讀入、寫出的檔案
File file1 = new File("1.jpg");
File file2 = new File("3.jpg");
// 2.建立響應節點流FileInputStream FileOutputStream
FileInputStream fis = new FileInputStream(file1);
FileOutputStream fos = new FileOutputStream(file2);
// 3.將建立的節點流的物件作為形參傳遞給緩衝流的構造器中
bis = new BufferedInputStream(fis);
bos = new BufferedOutputStream(fos);
// 4.實現檔案複製
byte[] b = new byte[1024];
int len;
// 讀取檔案
while ((len = bis.read(b)) != -1) {
// 寫入檔案
bos.write(b, 0, len);
// 重新整理資料
bos.flush();
}
} catch (Exception e) {
// TODO: handle exception
e.printStackTrace();
} finally {
// 5.關閉流
if (bos != null) {
try {
bos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (bis != null) {
try {
bis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
1).對於非文字檔案只能使用位元組流進行處理。
2).要讀取的檔案必須得存在,寫入的檔案可以不存在(不存在的話會自動建立)。
3).緩衝流可以提高檔案操作的效率。