說明:參考代碼部分的時候,請忽略異常處理語句。I/O中異常的有效處理辦法請看【I/O異常處理】章節
/*
* File類:
* 描述一個文件或是文件夾,通過File的實例對象可讀取文件或是文件夾的的屬性數據
* 如果需要操作文件的內容,那么就需要使用IO流技術
*
* IO(Input / Output流技術:
* 作用:在不同的設備之間傳輸數據
* -- 硬盤數據讀取到內存
* -- 鍵盤數據讀取到內存中
* -- 將內存數據寫到硬盤中
*
* 應用場景:
* -- 報表導入
* -- 上傳圖片
* -- 數據下載
*
* IO流分類:
* - 按照數據的流向劃分(以內存為參照物):
* --- 輸入流(從其他設備讀數據進入內存):
*
* --- 輸出流(將內存數據寫入或是現實在其他設備上):
*
* - 按照處理的數據單位劃分:
* --- 字節流:讀取的數據都是文件中的二進制,不會做任何處理
*
* --- 字符流:讀取的是二進制數據,但是會把二進制數據轉換成能字面量的形式
*
* --| 輸入字節流InputStream 所有輸入字節流的基類,是一個抽象類
* -------|FileInputStrem 讀取【文件數據】的輸入字節流
*
* 讀取文件數據的步驟:
* 1.定位目標文件;
* 2.構建數據的輸入通道;
* 3.讀取文件數據;
* read()從輸入流【讀取一個字節】并返回,如果沒有數據可讀,將阻塞;
* 為了提高讀取效率,可以結合緩沖數組byte[] 來提升讀取效率,緩沖數組的大小一般設置
* 為1024;
* 4。關閉輸入通道;
* close();
*
* 說明:
* 1.文件資源一旦使用完畢,必須馬上釋放,否則該資源無法被別的程序鎖操作。
* 2.
*/
package com.michael.iodetail;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class Demo01 {
public static void main(String[] args){
readFileData(); //方式一
readFileDate2(); //方式二:
readFileData3(); //方式三
}
public static void readFileData3(){
//1.定位目標文件
File file = new File("c:\\a.txt");
//2.建立數據輸入通道
FileInputStream fileInputStream = null;
try {
fileInputStream = new FileInputStream(file);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//3.使用緩沖數組循環讀取文件內容
int length = 0;
byte[] buf = new byte[1024];
try {
while((length=fileInputStream.read(buf))!=-1){
String content = new String(buf,0,buf.length);
System.out.println(content);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//4.關閉文件輸入通道
try {
fileInputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//讀取方式二:使用緩沖數組讀物文件你讓,缺點:無法一次讀取文件全部內容
public static void readFileDate2(){
//1.定位目標文件
File file = new File("c:\\a.txt");
//2.建立數據的輸入通道
FileInputStream fileInputStream = null;
try {
fileInputStream = new FileInputStream(file);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//3.讀物文件內容
byte[] buf = new byte[1024]; //定義緩沖數組大小
try {
int length = fileInputStream.read(buf);
System.out.println(length);
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
} //讀取的數組已經存入字節數組buf中,每次只能讀3個字節,返回值是本次讀取的字節數
//使用字節數組構建字符串
String content = new String(buf,0,buf.length);
System.out.println(content);
//4.關閉文件讀物通道
try {
fileInputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
//讀取方式一:使用read循環讀取文件內容,缺點:每次只能讀一個字節,效率較低
public static void readFileData(){
//1.定位目標文件
File file = new File("c:\\a.txt");
//2.構造數據輸入通道
FileInputStream fileInputStream = null;
try {
fileInputStream = new FileInputStream(file);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//3.讀取文件數據
//read()讀取一個字節的數據并返回
int content = 0;
try {
while((content=fileInputStream.read())!=-1){ //循環讀物文件數據
System.out.print((char)content);
}
} catch (IOException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
try {
fileInputStream.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}