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