File類:用于描述一個檔案或者檔案夾的。
通過File對象我們可以讀取檔案或者檔案夾的屬性資料,如果我們需要讀取檔案的内容資料,那麼我們需要使用IO流數技術。
IO流(Input Output)
IO技術主要的作用是用于解決裝置與裝置之間的資料傳輸問題。比如:硬碟-->記憶體 記憶體的資料-->硬碟上 把鍵盤的資料-->記憶體中
IO流分類:
如果我們按照資料的流向劃分:
輸入流:
輸出流:
如果按照處理的機關劃分:
位元組流:位元組流讀取的都是檔案中的二進制資料,讀取到的二進制資料不會經過任何的處理。
字元流:字元流讀取的資料是以字元為機關的。字元流也是讀取檔案中的二進制資料,不過會把這些二進制資料轉換成我們能識别的字元。
字元流 = 位元組流 + 解碼
判斷使用輸入流還是輸出流的依據:
以目前程式作為參照物,觀察資料是流入還是流出,如果流出則使用輸出流,如果流入則使用輸入流。
輸入位元組流:
-------------| InputStream 此抽象類是表示位元組輸入流的所有類的超類。
------------------| FileInputStream 從檔案系統中的某個檔案中獲得輸入位元組。
使用FileInputStream讀取檔案資料的步驟:
1.找到目标檔案
2.建立資料的輸入通道
3.讀取檔案中的資料
4.關閉資源,實際上就是釋放資源
推薦使用方式4讀取:
使用緩沖數組 + 循環 配合讀取。
注意事項:
1.資源檔案一旦使用完畢,應該立即釋放資源檔案
2.讀取檔案時,循環讀取時,緩沖數組每次都是覆寫,并不是先清空再讀取。是以應該采用new String(buff, 0, length)方法而不是new String(buff)
package com.cn.input;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
/**
* Author:Liu Zhiyong(QQ:1012421396)
* Version:Version_1
* Date:2016年7月24日16:49:24
* Desc:
File類:用于描述一個檔案或者檔案夾的。
通過File對象我們可以讀取檔案或者檔案夾的屬性資料,如果我們需要讀取檔案的内容資料,那麼我們需要使用IO流數技術。
IO流(Input Output)
IO技術主要的作用是用于解決裝置與裝置之間的資料傳輸問題。比如:硬碟-->記憶體 記憶體的資料-->硬碟上 把鍵盤的資料-->記憶體中
IO流分類:
如果我們按照資料的流向劃分:
輸入流:
輸出流:
如果按照處理的機關劃分:
位元組流:位元組流讀取的都是檔案中的二進制資料,讀取到的二進制資料不會經過任何的處理。
字元流:字元流讀取的資料是以字元為機關的。字元流也是讀取檔案中的二進制資料,不過會把這些二進制資料轉換成我們能識别的字元。
字元流 = 位元組流 + 解碼
判斷使用輸入流還是輸出流的依據:
以目前程式作為參照物,觀察資料是流入還是流出,如果流出則使用輸出流,如果流入則使用輸入流。
輸入位元組流:
-------------| InputStream 此抽象類是表示位元組輸入流的所有類的超類。
------------------| FileInputStream 從檔案系統中的某個檔案中獲得輸入位元組。
使用FileInputStream讀取檔案資料的步驟:
1.找到目标檔案
2.建立資料的輸入通道
3.讀取檔案中的資料
4.關閉資源,實際上就是釋放資源
推薦使用方式4讀取:使用緩沖數組 + 循環 配合讀取。
*/
public class Demo1 {
public static void main(String[] args) throws IOException {
// readTest1();
// readTest2();
// readTest3();
readTest4();
}
//方式1:一次讀一個位元組
public static void readTest1() throws IOException{
//1.找到目标檔案
File file = new File("f:/a.txt");
//2.建立資料的輸入通道
FileInputStream fileInputStream = new FileInputStream(file);
//3.讀取檔案中的資料
int i = fileInputStream.read();
System.out.println((char)i);
//4.關閉資源,實際上就是釋放資源
fileInputStream.close();
}
//不使用緩沖數組,一次一個位元組循環讀取
public static void readTest2() throws IOException{
long startTime = System.currentTimeMillis();
//1.找到目标檔案
// File file = new File("f:/a.txt");
File file = new File("f:/cool.png");
//2.建立資料的輸入通道
FileInputStream fileInputStream = new FileInputStream(file);
//3.讀取檔案的資料
int content = 0;
while((content = fileInputStream.read()) != -1){
System.out.print((char)content);
}
//4.關閉資源,實際上就是釋放資源
fileInputStream.close();
long stopTime = System.currentTimeMillis();
System.out.println("方式2讀取總共耗時:" + (stopTime-startTime) + "ms"); //480毫秒
}
//方式3:使用緩沖數組讀取。 缺點:無法讀取完整一個檔案的資料。 緩沖不能太大,因為假如讀取12G電影,得配置設定很多記憶體,不可行。
public static void readTest3() throws IOException{
//1.找到目标檔案
File file = new File("f:/a.txt");
//2.建立資料的輸入通道
FileInputStream fileInputStream = new FileInputStream(file);
//3.讀取檔案的資料
// Long l = file.length();
// byte[] buff = new byte[l.intValue()];//緩沖不能太大,因為假如讀取12G電影,得配置設定很多記憶體,不可行。
byte[] buff = new byte[40];//相當于超市裡面的購物車,從此輸入流中将最多 buff.length 個位元組的資料讀入一個 byte 數組中
int length = fileInputStream.read(buff);//如果使用read讀取資料傳入位元組數組,那麼資料是存儲到位元組數組中的,而這時候read()方法的傳回值是本次讀取了幾個位元組資料到位元組數組byte[]中
System.out.println(new String(buff) + "前面有空白");
System.out.println(new String(buff, 0, length) + "前面沒有空白");
//4.關閉資源,實際上就是釋放資源
fileInputStream.close();
}
//方式4:使用緩沖數組 + 循環 配合讀取。
public static void readTest4() throws IOException{
// //1.找到目标檔案
// File file = new File("f:/a.txt");
long startTime = System.currentTimeMillis();
//1.找到目标檔案
// File file = new File("f:/a.txt");
File file = new File("f:/cool.png");
//2.建立資料的輸入通道
FileInputStream fileInputStream = new FileInputStream(file);
//3.建立緩沖數組配合循環讀取檔案的資料
byte[] buff = new byte[1024];//用來存儲每次讀取到的資料,緩沖數組的長度一般是1024的倍數,因為與計算機的處理機關有關。理論上緩沖數組越大效率越高。
int length = 0;//儲存每次都去到的位元組個數。
int count = 1;//讀取的次數
while((length = fileInputStream.read(buff)) != -1){//讀入緩沖區的位元組總數,如果因為已經到達檔案末尾而沒有更多的資料,則傳回 -1。
System.out.print("讀的第" + count++ + "次:" + new String(buff, 0, length));
}
//4.關閉資源,實際上就是釋放資源
fileInputStream.close();
long stopTime = System.currentTimeMillis();
System.out.println("方式4讀取總共耗時:" + (stopTime-startTime) + "ms"); //32ms
}
}
FileInputStream讀取時要注意的細節: