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); } } |