Java讀取檔案方法大全

來源:互聯網
上載者:User

一、

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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.