實現讀取文件有多種方式,針對不同的文件類型,有不同的讀取方法。讀取文件的關鍵技術點如下:
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方法讀取指針後面的內容。