java IO流

參考連接:http://blog.csdn.net/MAGIC_JSS/article/details/51475923

java IO流

(一)含義html

IO:Java對數據的操做是經過流的方式,IO流用來處理設備之間的數據傳輸,上傳文件和下載文件,Java用於操做流的對象都在IO包中。java

(二)分類數組

(三)用法緩存

  3.1 字節文件操做流編輯器

  FileInputStream:字節文件輸入流,從文件系統中的某個文件中得到輸入字節,用於讀取諸如圖像數據之類的原始字節流。測試

  讀取文件的兩種方式spa

  方式一:一次讀取一個字節.net

// 讀取f盤下該文件f://hell/test.txt
//構造方法1
InputStream inputStream = new FileInputStream(new File("f://hello//test.txt"));
int i = 0;
//一次讀取一個字節
while ((i = inputStream.read()) != -1) {

    // System.out.print(i + " ");// 65 66 67 68
    //爲何會輸出65 66 67 68?由於字符在底層存儲的時候就是存儲的數值。即字符對應的ASCII碼。
    System.out.print((char) i + " ");// A B C D
}
//關閉IO流
inputStream.close();

  方式二:一次讀取一個字節數組code

// 讀取f盤下該文件f://hell/test.txt
//構造方法2
InputStream inputStream2 = new FileInputStream("f://hello/test.txt");
// 字節數組
byte[] b = new byte[2];
int i2 = 0;
//  一次讀取一個字節數組
while ((i2 = inputStream2.read(b)) != -1) {

    System.out.print(new String(b, 0, i2) + " ");// AB CD
}
//關閉IO流
inputStream2.close();

  注: 一次讀取一個字節數組,提升了操做效率,IO流使用完畢必定要關閉。視頻

  FileOutputStream:字節文件輸出流是用於將數據寫入到File,從程序中寫入到其餘位置。

  將數據寫入到文件 

OutputStream outputStream = new FileOutputStream(new File("test.txt"));
// 寫入數據
outputStream.write("ABCD".getBytes());
// 關閉IO流
outputStream.close();

// 內容追加寫入
OutputStream outputStream2 = new FileOutputStream("test.txt", true);
// 輸出換行符
outputStream2.write("\r\n".getBytes());
// 輸出追加內容
outputStream2.write("hello".getBytes());
// 關閉IO流
outputStream2.close(); 

  注:輸出的目的地文件不存在,則會自動建立,不指定盤符的話,默認建立在項目目錄下;輸出換行符時必定要寫\r\n不能只寫\n,由於不一樣文本編輯器對換行符的識別存在差別性。

  3.2 字節緩衝流(高效流)

  BufferedInputStream:字節緩衝輸入流,提升了讀取效率。 

InputStream in = new FileInputStream("test.txt");
// 字節緩存流
BufferedInputStream bis = new BufferedInputStream(in);
byte[] bs = new byte[20];
int len = 0;
while ((len = bis.read(bs)) != -1) {

    System.out.print(new String(bs, 0, len));
    // ABCD
    // hello
}
// 關閉流
bis.close();

  BufferedOutputStream:字節緩衝輸出流,提升了寫出效率。

BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("test.txt", true));
// 輸出換行符
bos.write("\r\n".getBytes());
// 輸出內容
bos.write("Hello Android".getBytes());
// 刷新此緩衝的輸出流
bos.flush();
// 關閉流
bos.close(); 

  3.3 高效流效率比對

  測試:讀取f盤下的一個視頻文件到項目中:文件大小29.5 MB

  方式一:

FileInputStream inputStream = new FileInputStream("f://滑板//HEEL_FLIP.mp4");
FileOutputStream outputStream = new FileOutputStream("HEEL_FLIP.mp4");
int len;
// 開始時間
long begin = System.currentTimeMillis();
// 一次讀取一個字節
while ((len = inputStream.read()) != -1) {
    outputStream.write(len);
}
// 用時毫秒
System.out.println(System.currentTimeMillis() - begin);// 213195
//關閉流釋放資源
inputStream.close();
outputStream.close();

  方式二:

FileInputStream inputStream = new FileInputStream("f://滑板//HEEL_FLIP.mp4");
FileOutputStream outputStream = new FileOutputStream("HEEL_FLIP.mp4");
int len;
byte[] bs = new byte[1024];
// 開始時間
long begin = System.currentTimeMillis();
// 一次讀取一個字節數組
while ((len = inputStream.read(bs)) != -1) {
    outputStream.write(bs, 0, len);
}
// 用時毫秒
System.out.println(System.currentTimeMillis() - begin);// 281

inputStream.close();
outputStream.close();

  方式三: 

InputStream inputStream = new FileInputStream("f://滑板//HEEL_FLIP.mp4");
BufferedInputStream bis = new BufferedInputStream(inputStream);
OutputStream outputStream = new FileOutputStream("HEEL_FLIP.mp4");
BufferedOutputStream bos = new BufferedOutputStream(outputStream);
int len;
byte[] bs = new byte[1024];
// 開始時間
long begin = System.currentTimeMillis();
while ((len = bis.read(bs)) != -1) {
    bos.write(bs, 0, len);
}
// 用時毫秒
System.out.println(System.currentTimeMillis() - begin);// 78

bis.close();
bos.close(); 

  注:由此能夠看出高效緩衝流讀寫速度是很是快的,建議使用。 

  實戰,請移步文章:servlet實現文件上傳,預覽,下載和刪除

  UpdateTime--2017年9月7日14:14:06

  通用說明: 

  a.流的表現形式爲int類型的數值,即字符對應的ASCII碼,能夠強轉爲單字符;

  b.字節輸入流InputStream是將文件轉換成流,想要獲取輸入流中的數據須要調用read()方法;

  FileInputStream fis = new FileInputStream(filePath);

  若是文件不存在,會拋出異常

  c.字節輸出流OutputStream是將文件轉換成流,想要往文件中輸入內容,需將內容轉換成byte數組,再調用write()方法;

  FileOutputStream fis = new FileOutStream(filePath);

  filePath能夠爲相對路徑,也能夠爲絕對路徑,推薦使用絕對路徑;

  輸出的目的地文件不存在,則會自動建立,將文件轉換成流,只能寫入內容,須要調用write()方法,不能讀取內容;

  當建立文件輸出流只傳入一個文件路徑參數時,形如:FileOutputStream fis = new FileOutStream(filePath);,調用fis.write(str.getBytes())時,原文件中的內容將會被覆蓋掉;

  不想被覆蓋,只是追加內容,能夠傳入2個參數,形如:FileOutputStream fis = new FileOutStream(filePath, true);

  輸出換行符時必定要寫\r\n不能只寫\n,由於不一樣文本編輯器對換行符的識別存在差別性。

  2018/11/28

  當調用write()方法時,必須聲明三個入參;

// 6.讀取目標文件,經過response將目標文件寫到客戶端
// 讀取文件
InputStream is = new FileInputStream(filePath);
// 輸入緩衝流
BufferedInputStream bis = new BufferedInputStream(is);
// 輸出文件
OutputStream os = response.getOutputStream();
// 輸出緩衝流
BufferedOutputStream bos = new BufferedOutputStream(os);

// 寫文件
// 緩衝字節數
byte data[] = new byte[1024];
// 實際讀取字節數
int n;
while ((n = bis.read(data)) != -1) {
    bos.write(data,0,n);
    // 錯誤方式
    // bos.write(n);
}

// 關閉流
bis.close();
// 清空輸出緩衝流
bos.flush();
bos.close();

  若是隻聲明一個入參,寫入文件裏的內容會錯誤!

// 寫文件
// 緩衝字節數
byte data[] = new byte[1024];
// 實際讀取字節數
int n;
while ((n = bis.read(data)) != -1) {
    // 錯誤方式
    bos.write(n);
}

 

 相關推薦:

相關文章
相關標籤/搜索