一、
java讀寫txt檔案總結1
1、按位元組讀取檔案內容
2、按字元讀取檔案內容
3、按行讀取檔案內容
4、隨機讀取檔案內容
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 (IOException 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 e1) { e1.printStackTrace(); } finally { if (in != null) { try { in.close(); } catch (IOException e1) { } } } } /** * 以字元為單位讀取檔案,常用於讀文本,數字等類型的檔案 */ 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) { // 對於windows下,\r\n這兩個字元在一起時,表示一個換行。 // 但如果這兩個字元分開顯示時,會換兩次行。 // 因此,屏蔽掉\r,或者屏蔽\n。否則,將會多出很多空行。 if (((char) tempchar) != '\r') { System.out.print((char) tempchar); } } reader.close(); } 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) { // 同樣屏蔽掉\r不顯示 if ((charread == tempchars.length) && (tempchars[tempchars.length - 1] != '\r')) { System.out.print(tempchars); } else { for (int i = 0; i < charread; i++) { if (tempchars[i] == '\r') { continue; } else { System.out.print(tempchars[i]); } } } } } catch (Exception e1) { e1.printStackTrace(); } finally { if (reader != null) { try { reader.close(); } catch (IOException e1) { } } } } /** * 以行為單位讀取檔案,常用於讀面向行的格式檔案 */ 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 (IOException e) { e.printStackTrace(); } finally { if (reader != null) { try { reader.close(); } catch (IOException e1) { } } } } /** * 隨機讀取檔案內容 */ 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個位元組,則讀剩下的位元組。 // 將一次讀取的位元組數賦給byteread while ((byteread = randomFile.read(bytes)) != -1) { System.out.write(bytes, 0, byteread); } } catch (IOException e) { e.printStackTrace(); } finally { if (randomFile != null) { try { randomFile.close(); } catch (IOException e1) { } } } } /** * 顯示輸入資料流中還剩的位元組數 */ 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:/temp/newTemp.txt"; ReadFromFile.readFileByBytes(fileName); ReadFromFile.readFileByChars(fileName); ReadFromFile.readFileByLines(fileName); ReadFromFile.readFileByRandomAccess(fileName); }}5、將內容追加到檔案尾部public class AppendToFile { /** * A方法追加檔案:使用RandomAccessFile */ public static void appendMethodA(String fileName, String content) { try { // 開啟一個隨機訪問檔案流,按讀寫方式 RandomAccessFile randomFile = new RandomAccessFile(fileName, "rw"); // 檔案長度,位元組數 long fileLength = randomFile.length(); //將寫檔案指標移到檔案尾。 randomFile.seek(fileLength); randomFile.writeBytes(content); randomFile.close(); } catch (IOException e) { e.printStackTrace(); } } /** * B方法追加檔案:使用FileWriter */ public static void appendMethodB(String fileName, String content) { try { //開啟一個寫檔案器,建構函式中的第二個參數true表示以追加形式寫檔案 FileWriter writer = new FileWriter(fileName, true); writer.write(content); writer.close(); } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) { String fileName = "C:/temp/newTemp.txt"; String content = "new append!"; //按方法A追加檔案 AppendToFile.appendMethodA(fileName, content); AppendToFile.appendMethodA(fileName, "append end. \n"); //顯示檔案內容 ReadFromFile.readFileByLines(fileName); //按方法B追加檔案 AppendToFile.appendMethodB(fileName, content); AppendToFile.appendMethodB(fileName, "append end. \n"); //顯示檔案內容 ReadFromFile.readFileByLines(fileName); }}
二、
java讀寫txt檔案總結2
import java.io.BufferedReader;import java.io.File;import java.io.FileReader;import java.io.FileWriter;public class TxtFile {public void read() {FileReader fr = null;BufferedReader br = null;try {fr = new FileReader("F://a.txt");br = new BufferedReader(fr);String line = br.readLine();while (line != null) {System.out.println(line);line = br.readLine();}} catch (Exception e) {System.out.println(e);} finally {try {if (br != null)br.close();if (fr != null)fr.close();// 關閉檔案} catch (Exception e) {System.out.println(e);}}}public void write() {File file = null;FileWriter fw = null;try {file = new File("F://a.txt");fw = new FileWriter(file);for (int i = 0; i < 20; i++) {fw.append("第" + i + 1 + "次");}} catch (Exception e) {System.out.println(e);} finally {try {if (fw != null)fw.close();// 關閉檔案} catch (Exception e) {System.out.println(e);}}}}
三、
Java檔案讀寫總結3各方法效率測試
讀檔案:
FileInputStream
通過開啟一個到實際檔案的串連來建立一個 FileInputStream,該檔案通過檔案系統中的路徑名
name 指定。建立一個新 FileDescriptor 對象來表示此檔案串連。
InputStreamReader
InputStreamReader 是位元組流通向字元流的橋樑:它使用指定的 charset 讀取位元組並將其解碼為字
符。它使用的字元集可以由名稱指定或顯式給定,否則可能接受平台預設的字元集。
BufferedReader
從字元輸入資料流中讀取文本,緩衝各個字元,從而提供字元、數組和行的高效讀取。 可以指定緩衝區
的大小,或者可使用預設的大小。大多數情況下,預設值就足夠大了。
StringBuffer
安全執行緒的可變字元序列。一個類似於 String 的字串緩衝區,但不能修改。雖然在任意時間點上
它都包含某種特定的字元序列,但通過某些方法調用可以改變該序列的長度和內容。
public static void main(String[] args) { //讀取檔案內容 File a = new File("C:/add2.txt"); if(a.exists()){ FileInputStream fi = new FileInputStream(a); InputStreamReader isr = new InputStreamReader(fi, "GBk"); BufferedReader bfin = new BufferedReader(isr); String rLine = ""; while((rLine = bfin.readLine())!=null){ System.out.println(rLine); } }}
寫檔案:
在java寫檔案中,通常會使用FileOutputStream和FileWriter,FileWriter只能寫文字檔。FileOutputStream也經常結合BufferedOutputStream。因為實際應用中寫文字檔的情況佔了大多數。所以下面測試用不同的方式產生一個相同行數、大小相同的檔案的三種不同方式。
import java.io.File;import java.io.FileOutputStream;import java.io.*;public class FileTest { publicFileTest() { } publicstatic void main(String[] args) { FileOutputStream out = null; FileOutputStream outSTr = null; BufferedOutputStream Buff=null; FileWriter fw = null; int count=1000;//寫檔案行數 try { out = new FileOutputStream(new File("C:/add.txt")); long begin = System.currentTimeMillis(); for (int i = 0; i < count; i++) { out.write("測試java 檔案操作\r\n".getBytes()); } out.close(); long end = System.currentTimeMillis(); System.out.println("FileOutputStream執行耗時:" + (end - begin) + "豪秒"); outSTr = new FileOutputStream(new File("C:/add0.txt")); Buff=new BufferedOutputStream(outSTr); long begin0 = System.currentTimeMillis(); for (int i = 0; i < count; i++) { Buff.write("測試java 檔案操作\r\n".getBytes()); } Buff.flush(); Buff.close(); long end0 = System.currentTimeMillis(); System.out.println("BufferedOutputStream執行耗時:" + (end0 - begin0) +" 豪秒"); fw = new FileWriter("C:/add2.txt"); long begin3 = System.currentTimeMillis(); for (int i = 0; i < count; i++) { fw.write("測試java 檔案操作\r\n"); } fw.close(); long end3 = System.currentTimeMillis(); System.out.println("FileWriter執行耗時:" + (end3 - begin3) + "豪秒"); } catch (Exception e) { e.printStackTrace(); } finally { try { fw.close(); Buff.close(); outSTr.close(); out.close(); } catch (Exception e) { e.printStackTrace(); } } }}
以下結果經過多次執行,取常出現的資料,由於只是簡單比較,不做詳細統計。
1.當count=1000的,即寫檔案1000行的時候,寫出的檔案大小為18.5KB:
FileOutputStream執行耗時:46 豪秒
BufferedOutputStream執行耗時:31 豪秒
FileWriter執行耗時:15 豪秒
2.當count=10000的,即寫檔案10000行的時候,寫出的檔案大小為185KB:
FileOutputStream執行耗時:188 豪秒
BufferedOutputStream執行耗時:32 豪秒
FileWriter執行耗時:16 豪秒
3.當count=100000的,即寫檔案100000行的時候,寫出的檔案大小為1856KB:
FileOutputStream執行耗時:1266 豪秒
BufferedOutputStream執行耗時:125 豪秒
FileWriter執行耗時:93 豪秒
4.當count=1000000的,即寫檔案1000000行的時候,寫出的檔案大小為18555KB:
FileOutputStream執行耗時:12063 豪秒
BufferedOutputStream執行耗時:1484 豪秒
FileWriter執行耗時:969 豪秒
由以上資料可以看到,如果不用緩衝流BufferedOutputStream,FileOutputStream寫檔案的魯棒性是很不好的。當寫1000000行的檔案的時候,FileOutputStream比FileWriter要慢11094毫秒(11秒),BufferedOutputStream比FileWriter慢515毫秒。
不要小看這幾秒的時間。當操作的資料量很大的時候,這點效能的差距就會很大了。在通用資料移轉工具匯出資料庫2千萬條記錄產生sql指令檔的時候,效能效能相差10分鐘以上。
四、
Java建立檔案夾及檔案
package Test; import java.io.File; import java.io.IOException; public class CreateFileTest { /** * 建立單個檔案 * @param destFileName 檔案名稱 * @return 建立成功返回true,否則返回false */ public static boolean CreateFile(String destFileName) { File file = new File(destFileName); if (file.exists()) { System.out.println("建立單個檔案" + destFileName + "失敗,目標檔案已存在!"); return false; } if (destFileName.endsWith(File.separator)) { System.out.println("建立單個檔案" + destFileName + "失敗,目標不能是目錄!"); return false; } if (!file.getParentFile().exists()) { System.out.println("目標檔案所在路徑不存在,準備建立。。。"); if (!file.getParentFile().mkdirs()) { System.out.println("建立目錄檔案所在的目錄失敗!"); return false; } } // 建立目標檔案 try { if (file.createNewFile()) { System.out.println("建立單個檔案" + destFileName + "成功!"); return true; } else { System.out.println("建立單個檔案" + destFileName + "失敗!"); return false; } } catch (IOException e) { e.printStackTrace(); System.out.println("建立單個檔案" + destFileName + "失敗!"); return false; } } /** * 建立目錄 * @param destDirName 目標目錄名 * @return 目錄建立成功返回true,否則返回false */ public static boolean createDir(String destDirName) { File dir = new File(destDirName); if(dir.exists()) { System.out.println("建立目錄" + destDirName + "失敗,目標目錄已存在!"); return false; } if(!destDirName.endsWith(File.separator)) destDirName = destDirName + File.separator; // 建立單個目錄 if(dir.mkdirs()) { System.out.println("建立目錄" + destDirName + "成功!"); return true; } else { System.out.println("建立目錄" + destDirName + "成功!"); return false; } } /** * 建立臨時檔案 * @param prefix 臨時檔案的首碼 * @param suffix 臨時檔案的尾碼 * @param dirName 臨時檔案所在的目錄,如果輸入null,則在使用者的文檔目錄下建立臨時檔案 * @return 臨時檔案建立成功返回抽象路徑名的規範路徑名字串,否則返回null */ public static String createTempFile(String prefix, String suffix, String dirName) { File tempFile = null; try{ if(dirName == null) { // 在預設資料夾下建立臨時檔案 tempFile = File.createTempFile(prefix, suffix); return tempFile.getCanonicalPath(); }else { File dir = new File(dirName); // 如果臨時檔案所在目錄不存在,首先建立 if(!dir.exists()) { if(!CreateFileTest.createDir(dirName)){ System.out.println("建立臨時檔案失敗,不能建立臨時檔案所在目錄!"); return null; } } tempFile = File.createTempFile(prefix, suffix, dir); return tempFile.getCanonicalPath(); } } catch(IOException e) { e.printStackTrace(); System.out.println("建立臨時檔案失敗" + e.getMessage()); return null; } } public static void main(String[] args) { // 建立目錄 String dirName = "d:/test/test0/test1"; CreateFileTest.createDir(dirName); // 建立檔案 String fileName = dirName + "/test2/testFile.txt"; CreateFileTest.CreateFile(fileName); // 建立臨時檔案 String prefix = "temp"; String suffix = ".txt"; for(int i = 0; i < 10; i++) { System.out.println("建立了臨時檔案:" + CreateFileTest.createTempFile(prefix, suffix, dirName)); } } }