Trong bài viết này, tôi sẽ giới thiệu đến các bạn 4 cách để ghi dữ liệu xuống file trong hệ thống. Bạn cũng có thể xem lại bài viết giới thiệu các cách đọc file dữ liệu mà tôi đã đăng tải trước đó.
Tổng hợp 4 cách ghi file dữ liệu trong Java

4 cách ghi file dữ liệu trong Java

Trước khi chúng ta xem qua code example hãy cùng tôi xem qua các cách mà chúng ta sẽ dùng có gì nhé.
  1. FileWriter: FileWriter là cách đơn giản nhất để chúng ta ghi nội dung xuống file khi làm việc với Java. Nó cung cấp các phương thức quá tải (overloaded method) cho phép chúng ta ghi số int, byte array và String xuống File. Bạn cũng có thể ghi một phần của chuỗi (String) hoặc mảng byte (byte array) bằng cách sử dụng FileWriter. FileWriter ghi trực tiếp nội dung vào tập tin nên chúng ta chỉ nên sử dụng khi số lượng viết rất ít.
  2. BufferedWriter: BufferedWriter gần giống như FileWrite nhưng nó sử dụng bộ đệm bên trong để ghi dữ liệu xuống file. Do đó, nếu số lượng hoạt động ghi dữ liệu lớn hơn thì bạn nên sử dụng BufferedWriter để đảm bảo hiệu suất tốt hơn.
  3. FileOutputStream: FileWriter và BufferedWriter được sử dụng để ghi văn bản xuống. Nhưng nếu như bạn cần ghi dữ liệu thô (raw stream data) xuống file thì bạn nên sử dụng FileOutputStream.
  4. Files: Java 7 đã giới thiệu một lớp tiện ích có tên là File và chúng ta có thể sử dụng nó để làm việc hiệu quả hơn. Thực tế, bên trong nó đang sử dụng OutputStream để ghi byte array xuống file.

Ví dụ ghi file dữ liệu

Dưới đây là code example mà bạn có thể tham khảo để ghi file trong Java sử dụng FileWriter, BufferedWriter, FileOutputStream và Files.

WriteFileExample.java
package com.vanthuong.example;

import java.io.Closeable;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.io.OutputStream;
import java.nio.file.Files;
import java.nio.file.Paths;

public class WriteFileExample {

  public static void main(String[] args) {
    String data = "This content will be wrote to File in Java";
    int numOfLines = 10000;

    System.out.println("---Using FileWriter---");
    writeUsingFileWriter(data);

    System.out.println("---Using BufferedWriter---");
    writeUsingBufferedWriter(data, numOfLines);

    System.out.println("---Using File Class---");
    writeUsingFiles(data);

    System.out.println("---Using OutputStream---");
    writeUsingOutputStream(data);
    System.out.println("---DONE---");
  }

  private static void close(Closeable closeable) {
    try {
      closeable.close();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }

  /**
   * Use Streams when you are dealing with raw data
   *
   * @param data
   */
  private static void writeUsingOutputStream(String data) {
    OutputStream outputStream = null;
    try {
      outputStream = new FileOutputStream(new File("/Users/THUONGLEE/OutputStream.txt"));
      outputStream.write(data.getBytes(), 0, data.length());
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      close(outputStream);
    }
  }

  /**
   * Use Files class from Java 1.7 to write files, internally uses OutputStream
   *
   * @param data
   */
  private static void writeUsingFiles(String data) {
    try {
      Files.write(Paths.get("/Users/THUONGLEE/files.txt"), data.getBytes());
    } catch (IOException e) {
      e.printStackTrace();
    }
  }

  /**
   * Use BufferedWriter when number of write operations are more
   * It uses internal buffer to reduce real IO operations and saves time
   *
   * @param data
   * @param numOfLines
   */
  private static void writeUsingBufferedWriter(String data, int numOfLines) {
    File file = new File("/Users/THUONGLEE/BufferedWriter.txt");
    FileWriter fileWriter = null;
    BufferedWriter bufferedWriter = null;
    String dataWithNewLine = data + System.getProperty("line.separator");
    
    try {
      fileWriter = new FileWriter(file);
      bufferedWriter = new BufferedWriter(fileWriter);
      for (int index = numOfLines; index > 0; index--) {
        bufferedWriter.write(dataWithNewLine);
      }
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      close(bufferedWriter);
      close(fileWriter);
    }
  }

  /**
   * Use FileWriter when number of write operations are less
   * * @param data
   */
  private static void writeUsingFileWriter(String data) {
    File file = new File("/Users/THUONGLEE/FileWriter.txt");
    FileWriter fileWriter = null;
    
    try {
      fileWriter = new FileWriter(file);
      fileWriter.write(data);
    } catch (IOException e) {
      e.printStackTrace();
    } finally {
      close(fileWriter);
    }
  }
}

Trên đây là 4 cách để ghi dữ liệu xuống File trong Java mà bạn có thể lựa chọn để sử dụng sao cho phù hợp với yêu cầu của dự án. Hi vọng rằng trong tương lai Java sẽ được hỗ trợ thêm những phương pháp mới có hiệu năng tốt hơn. Cuối cùng, chúc các bạn học tốt nhé.
Thương Nguyễn