實現讀取文件有多種方式,針對不同的文件類型,有不同的讀取方法。讀取文件的關鍵技術點如下:
1.用FileInputStream打開文件輸入流,通過read方法以字節為單位讀取文件,是最通用的讀取文件的方法,能讀取任何文件,特別適合讀取二進制文件,如圖片、聲音、視頻文件。
2.用InputStreamReader打開文件輸入流,通過read方法以字符為單位讀取文件,常用於讀取文本文件。
3.用BufferedReader打開文件輸入流,通過readLine方法以行為單位讀取文件,常用於讀取格式化文本。
4.用RandomAccessFile打開文件輸入流,通過seek方法將讀指針移到文件內容中間,再通過read方法讀取指針後的文件內容,常用於隨機讀取文件。
通過以上各種文件輸入流讀取文件後,都需要調用close方法關閉文件輸入流。
實例如下:
package book.io;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.RandomAccessFile;
import java.io.Reader;
/**
*多種方式讀取文件
*按字節讀取文件內容、按字符讀取文件內容、按行讀取文件內容、隨機讀取文件內容
*/
public class ReadFromFile {
//以字節為單位讀取文件,常用於讀取二進制文件,如圖片、聲音、視頻等文件
public static void readFileByBytes(String fileName){
File file = new File(fileName);
InputStream in = null;
try {
System.out.println("以字節為單位讀取文件內容,一次讀取一個字節:");
//一次讀取一個字節
in = new FileInputStream(file);
int tempbyte;
//不斷讀取,知道文件結束
while((tempbyte=in.read()) != -1){
System.out.write(tempbyte);
}
in.close();
}catch (Exception e) {
e.printStackTrace();
return;
}
try {
System.out.println("以字節為單位讀取文件內容,一次讀多個字節:");
//一次讀多個字節
byte[] tempbytes = new byte[100];
int byteread = 0;
in = new FileInputStream(fileName);
ReadFromFile.showAvailableBytes(in);
//將多個字節讀入到字節數組中,byteread為一次讀入的字節數
while((byteread = in.read(tempbytes)) != -1){
System.out.write(tempbytes,0,byteread);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
if(in != null){
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//以字符為單位讀取文件,常用於讀取文本、數字等類型的文件
public static void readFileByChars(String fileName){
File file = new File(fileName);
Reader reader = null;
try {
System.out.println("以字符為單位讀取文件內容,一次讀一個字符:");
//一次讀一個字符
reader = new InputStreamReader(new FileInputStream(file));
int tempchar;
while((tempchar = reader.read()) != -1){
if(((char)tempchar)!='\r'){
System.out.println((char)tempchar);
}
}
} catch (Exception e) {
e.printStackTrace();
}
try {
System.out.println("以字符為單位讀取文件內容,一次讀多個字符:");
char[] tempchars = new char[30];
int charread = 0;
reader = new InputStreamReader(new FileInputStream(fileName));
//將多個字符讀取到字符數組中,charread為一次讀取的字符數
while((charread = reader.read(tempchars)) != -1){
if((charread == tempchars.length)&&(tempchars[tempchars.length-1] !='\r')){
System.out.println(tempchars);
}else{
for(int i=0;i<charread;i++){
if(tempchars[i] == '\r'){
continue;
}else{
System.out.println(tempchars[i]);
}
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
//以行為單位讀取文件,常用於讀取面向行的格式化文件
public static void readFileByLines(String fileName){
File file = new File(fileName);
BufferedReader reader = null;
try {
System.out.println("以行為單位讀取文件內容,一次讀一整行:");
reader = new BufferedReader(new FileReader(file));
String tempString = null;
int line = 1;
//一次讀一行,直到讀到null,讀取文件結束
while((tempString = reader.readLine()) != null){
System.out.println("line "+ line + ":" + tempString);
line++;
}
reader.close();
} catch (Exception e) {
e.printStackTrace();
}finally{
if(reader != null){
try {
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//隨機讀取文件
public static void readFileByRandomAccess(String fileName){
RandomAccessFile randomFile = null;
try {
System.out.println("隨機讀取一段文件內容:");
//打開一個隨機訪問文件流,按只讀方式
randomFile = new RandomAccessFile(fileName,"r");
long fileLength = randomFile.length();
int beginIndex = (fileLength > 4) ? 4 : 0;
//將讀文件的開始位置移到beginIndex位置
randomFile.seek(beginIndex);
byte[] bytes = new byte[10];
int byteread = 0;
//一次讀10個字節,如果文件內容不足10個字節,則讀剩下的字節
while((byteread = randomFile.read(bytes)) != -1){
System.out.write(bytes, 0, byteread);
}
} catch (Exception e) {
e.printStackTrace();
}finally{
if(randomFile != null){
try {
randomFile.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
//顯示輸入流中還剩的字節數
private static void showAvailableBytes(InputStream in){
try {
System.out.println("當前字節輸入流中的字節數為:"+in.available());
} catch (IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
String fileName = "C:/Users/Admin/Desktop/CAI/20160718/newTemp.txt";
ReadFromFile.readFileByBytes(fileName);
ReadFromFile.readFileByChars(fileName);
ReadFromFile.readFileByLines(fileName);
ReadFromFile.readFileByRandomAccess(fileName);
}
}
分析:readFileByBytes以字節為單位讀取文件內容。使用了文件輸入流類FileInputStream,調用read方法可以一次從文件輸入流中讀取一個字節,也可以將多個字節讀取到字節數組中,當讀取到字節數為-1時,到達文件尾,讀取文件結束。
readFileByChars以字符為單位讀取文件內容。使用了InputStreamReader類,將FileInputStream字節輸入流包裝成字符流,然後調用InputStreamReader的read方法可以一次從文件輸入流中讀取一個字符,也可以將多個字符讀取到字符數組中,但讀取的字符數為-1時,到達文件尾,讀取文件結束。
readFileByLines以行為單位讀取文件內容。通過File對象構造FileReader對象,再通過FileReader對象構造BufferedReader對象,它的readLine方法可以一次從文件中讀取一行內容並保存到字符串中,如果返回的字符串為null,則到達文件尾,讀取文件結束。
上面3種方法都是從頭到尾讀取文件內容。readFileByRandomAccess方法則可以隨機讀取文件內容,使用RandomAccessFile類構造RandomAccessFile對象時,可以指定訪問模式,有“只讀”、“只寫”和“讀寫”模式。通過seek方法移動讀指針的起始位置,再通過read方法讀取指針後面的內容。