Java多種寫檔案方式

Real_man發表於2019-03-26

寫檔案在開發小工具時常用到,比如爬取某些網站的資訊,資料量不是很大,儲存到本地即可。當然如果會一些額外的技能,比如多執行緒,網路之類的,小工具會更加有意思。

這裡看下Java不同的寫檔案方式:

  • BufferedWriter
  • PrintWriter
  • FileOutputStream
  • DataOutputStream
  • RandomAccessFile
  • FileChannel
  • Files

BufferedWriter

把類中定義的方法資訊,寫入檔案

    static String fileName = "/Users/aihe/tmp/writeFileDemo.txt";
	static void writeFileWithBufferedWriter() throws IOException {
        Method[] methods = WriteFileDemo.class.getDeclaredMethods();
        String str = Arrays.toString(methods);
        BufferedWriter writer = new BufferedWriter(new FileWriter(fileName));
        writer.write(str);
        writer.close();
    }
複製程式碼

image-20190326081928256

追加資訊到已經存在的檔案:

    static void appendFileWithBufferedWriter() throws IOException {
    	// FileWriter的第二個引數代表是否追加
        BufferedWriter writer = new BufferedWriter(new FileWriter(fileName,true));
        writer.append("追加資訊");
        writer.close();
    }
複製程式碼

image-20190326082146211

PrintWriter

PrintWriter可以輸出格式化的資訊到檔案中。

    static void writingFileWithPrintWriter()
            throws IOException {
        Method[] methods = WriteFileDemo.class.getDeclaredMethods();
        String str = Arrays.toString(methods);
		// 可以使用FileWriter,BufferedWriter
        FileWriter fileWriter = new FileWriter(fileName);
        PrintWriter printWriter = new PrintWriter(fileWriter);
        printWriter.printf("當前類的方法資訊: %s \n方法的個數:%d \n", str, methods.length);
        printWriter.close();
    }
複製程式碼

image-20190326082536781

FileOutputStream

用來寫入二進位制資料到檔案中,需要將String轉換為bytes。

    static void writingFileWithFileOutputStream()
            throws IOException {
        Method[] methods = WriteFileDemo.class.getDeclaredMethods();
        String str = Arrays.toString(methods);

        FileOutputStream outputStream = new FileOutputStream(fileName);
        // 需要將String轉換為bytes
        byte[] strToBytes = str.getBytes();
        outputStream.write(strToBytes);

        outputStream.close();
    }
複製程式碼

image-20190326083040667

DataOutputStream

寫法如上

   static void writingFileWithDataOutputStream()
            throws IOException {
        Method[] methods = WriteFileDemo.class.getDeclaredMethods();
        String str = Arrays.toString(methods);

        FileOutputStream fos = new FileOutputStream(fileName);
        DataOutputStream outStream = new DataOutputStream(new BufferedOutputStream(fos));
        outStream.writeUTF(str);
        outStream.close();

        // verify the results
        String result;
        FileInputStream fis = new FileInputStream(fileName);
        DataInputStream reader = new DataInputStream(fis);
        result = reader.readUTF();
        reader.close();

        System.out.println(result.equals(str));
    }
複製程式碼

RandomAccessFile

想要寫入或者編輯一個已經存在的檔案,而不是寫入一個全新的檔案或者單純的追加,那麼我們可以使用RandomAccessFile。這個類可以讓我們寫入特定的位置,如下:

寫入中文的時候使用writeUTF方法,不然可能會亂碼

    static void writeToPositionWithRAF(String filename, long position)
            throws IOException {
        RandomAccessFile writer = new RandomAccessFile(filename, "rw");
        writer.seek(position);
        //寫入中文的時候防止亂碼
        writer.writeUTF("新內容");
        writer.close();
    }
複製程式碼

image-20190326084711766

FileChannel

在處理大檔案的時候,FileChannel會比標準的io更快。

static void writeWithFileChannel() throws IOException {
    RandomAccessFile stream = new RandomAccessFile(fileName, "rw");
    FileChannel channel = stream.getChannel();

    String value = WriteFileDemo.class.getSimpleName();
    byte[] strBytes = value.getBytes();
    ByteBuffer buffer = ByteBuffer.allocate(strBytes.length);
    buffer.put(strBytes);
    buffer.flip();
    channel.write(buffer);

    stream.close();
    channel.close();

}
複製程式碼

image-20190326085329071

Files

Files是Java7引入的工具類,通過它,我們可以建立,移動,刪除,複製檔案。目錄也是一種特殊的檔案,對目錄也適用。當然也可以用於讀寫檔案


    static void writeWithFiles()
            throws IOException {
        String str = "Hello";

        Path path = Paths.get(fileName);
        byte[] strToBytes = str.getBytes();

        Files.write(path, strToBytes);

        String read = Files.readAllLines(path).get(0);

        System.out.println(str.equals(read));
    }
複製程式碼

image-20190326085644551

最後

操作檔案的時候記得要關閉檔案流,也可以使用java7的try-with-resource語法。

  • BufferedWriter 提供高效的讀寫字元,字串,陣列。
  • PrintWriter 寫入格式化文字
  • FileOutputStream 寫入二進位制流
  • DataOutputStream 寫primary型別
  • RandomAccessFile 隨機讀寫檔案,在指定的位置編輯檔案
  • FileChannel 寫入大檔案

參考

相關文章