openplanning

Hướng dẫn và ví dụ Java Writer

  1. Writer
  2. write(int)
  3. write(char[])
  4. write(char[], int, int)
  5. close()
  6. write(String)
  7. write(String, int, int)
  8. append(CharSequence)
  9. append(CharSequence, int , int)
  10. append(char)
  11. flush()

1. Writer

Writer là một lớp nằm trong package java.io, nó là một lớp cơ sở đại diện cho một dòng chảy của các ký tự (stream of characters) để ghi các ký tự vào một mục tiêu nào đó, chẳng hạn file văn bản.
public abstract class Writer implements Appendable, Closeable, Flushable
Về cơ bản bạn không thể sử dụng lớp Writer một cách trực tiếp vì nó là một lớp trừu tượng, tuy nhiên trong trường hợp cụ thể bạn có thể sử dụng một trong các lớp con của nó.
Hãy xem một tình huống ghi các ký tự sau đây vào một file với mã hoá UTF-8:
JP日本-八洲
Java sử dụng 2 bytes để lưu trữ một ký tự, và đây là hình minh hoạ các bytes của văn bản nói trên:
FileWriter là một lớp con của Writer thường được sử dụng để ghi các ký tự vào một file văn bản. Mỗi ký tự trên Writer là 2 bytes, nhưng khi bạn ghi chúng vào một file văn bản UTF-8 mỗi ký tự có thể được lưu trữ bởi 1, 2, 3 hoặc 4 bytes.
Xem thêm giải thích của tôi về cách Java chuyển đổi các ký tự Java thành các ký tự UTF-8:
Writer methods
public static Writer nullWriter()

public void write(int c) throws IOException

public void write(char cbuf[]) throws IOException

public void write(char cbuf[], int off, int len) throws IOException

public void write(String str) throws IOException

public void write(String str, int off, int len) throws IOException

public Writer append(CharSequence csq) throws IOException

public Writer append(CharSequence csq, int start, int end) throws IOException

public Writer append(char c) throws IOException

public void flush() throws IOException

public void close() throws IOException

2. write(int)

public void write(int chr) throws IOException
Ghi một ký tự vào Writer. Tham số chr là mã của ký tự, là một số nguyên nằm trong khoảng 0 đến 65535. Nếu giá trị của chr nằm ngoài phạm vi nói trên nó sẽ bị bỏ qua.
Writer_write_ex1.java
package org.o7planning.writer.ex;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.nio.charset.StandardCharsets;

public class Writer_write_ex1 {

    // Windows path: C:/Somedirectory/out-file.txt
    private static final String file_path = "/Volumes/Data/test/out-file.txt";

    public static void main(String[] args) throws IOException {
        File file = new File(file_path);
        // Create parent folder:
        file.getParentFile().mkdirs();

        // FileWriter constructor in Java 11.
        Writer writer = new FileWriter(file, StandardCharsets.UTF_8);

        writer.write((int)'J'); // 74
        
        writer.write((int)'P'); // 80
        
        writer.write((int)'日'); // 26085  
        
        writer.write(26412);     // 本
        
        writer.write((int)'-');  // 45
        
        writer.write(20843);    // 八
        
        writer.write((int)'洲'); // 27954
        
        writer.close();
    }
}
Output:
out-file.txt
JP日本-八洲

3. write(char[])

public void write(char[] cbuf) throws IOException
Ghi một mảng ký tự vào Writer.
Writer_write_ex2.java
package org.o7planning.writer.ex;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.nio.charset.StandardCharsets;

public class Writer_write_ex2 {

    // Windows path: C:/Somedirectory/out-file.txt
    private static final String file_path = "/Volumes/Data/test/out-file.txt";

    public static void main(String[] args) throws IOException {
        File file = new File(file_path);
        // Create parent folder:
        file.getParentFile().mkdirs();

        // FileWriter constructor in Java 11.
        Writer writer = new FileWriter(file, StandardCharsets.UTF_8);

        writer.write((int)'J'); // 74
        
        char[] cbuf = new char[] {'P', '日', '本', '-', '八', '洲'};
        
        writer.write(cbuf);  
        
        writer.close();
    }
}
Output:
out-file.txt
JP日本-八洲

4. write(char[], int, int)

public void write(char[] cbuf, int off, int len) throws IOException
Ghi một phần của một mảng ký tự vào Writer. Ghi các ký tự từ chỉ số offset đến chỉ số offset+len.
Writer_write_ex3.java
package org.o7planning.writer.ex;

import java.io.IOException;
import java.io.StringWriter;

public class Writer_write_ex3 {

    public static void main(String[] args) throws IOException {
        // StringWriter is a subclass of Writer.
        StringWriter stringWriter = new StringWriter();  
        
        char[] cbuf = new char[] {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};
        
        stringWriter.write(cbuf, 2, 5); // '2', ...'6'
        
        String s = stringWriter.toString();
        System.out.println(s);
        
        stringWriter.close();
    }
}
Output:
23456

5. close()

public void close() throws IOException
Phương thức close() được sử dụng để đóng stream này, phương thức flush() sẽ được gọi đầu tiên. Khi stream đã bị đóng, các lệnh gọi thêm write() hoặc flush() sẽ khiến IOException được ném ra. Đóng stream đã đóng trước đó không có tác dụng.
public interface Closeable extends AutoCloseable
Lớp Writer thi hành interface Closeable. Nếu bạn viết code theo quy tắc của AutoCloseable thì hệ thống sẽ tự đóng stream cho bạn mà không cần phải gọi trực tiếp phương thức close().
Writer_close_ex1.java
package org.o7planning.writer.ex;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.nio.charset.StandardCharsets;

public class Writer_close_ex1 {

    // Windows path: C:/Somedirectory/out-file.txt
    private static final String file_path = "/Volumes/Data/test/out-file.txt";

    public static void main(String[] args) throws IOException {
        File file = new File(file_path);
        // Create parent folder:
        file.getParentFile().mkdirs();
        
        try (Writer writer = new FileWriter(file, StandardCharsets.UTF_8)) {
            writer.write((int) 'J'); // 74
            writer.write((int) 'P'); // 80
            writer.write((int) '日'); // 26085
            writer.write(26412); // 本
            writer.write((int) '-'); // 45
            writer.write(20843); // 八
            writer.write((int) '洲'); // 27954
        }
    }
}
  • Hướng dẫn và ví dụ Java Closeable

6. write(String)

public void write(String str) throws IOException
Ghi một String vào Writer.
Ví dụ:
writer.write("Some String");

7. write(String, int, int)

public void write(String str, int offset, int len) throws IOException
Ghi một phần của một String vào Writer. Ghi các ký tự từ chỉ số offset đến chỉ số offset+len vào Writer.
Ví dụ:
writer.write("0123456789", 2, 5); // 23456

8. append(CharSequence)

public Writer append(CharSequence csq) throws IOException
Nối các ký tự của CharSequence vào Writer. Phương thức này trả về đối tượng Writer hiện tại, điều này cho phép bạn gọi tiếp một phương thức khác của Writer thay vì kết thúc bởi dấu chấm phẩy ( ; ).
Writer_append_ex1.java
package org.o7planning.writer.ex;

import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;

public class Writer_append_ex1 {

    public static void main(String[] args) throws IOException {
        // StringWriter is a subclass of Writer.
        Writer writer = new StringWriter();

        writer.append("01234").append("5678").write("9");

        System.out.println(writer.toString()); // 0123456789

        writer.close();
    }
}

9. append(CharSequence, int , int)

public Writer append(CharSequence csq, int start, int end) throws IOException
Nối một phần CharSequence vào Writer. Phương thức này trả về đối tượng Writer hiện tại.

10. append(char)

public Writer append(char chr) throws IOException
Nối một ký tự vào Writer. Phương thức này trả về đối tượng Writer hiện tại, điều này cho phép bạn gọi tiếp một phương thức khác của Writer thay vì kết thúc bởi dấu chấm phẩy ( ; ).
Writer_append_ex2.java
package org.o7planning.writer.ex;

import java.io.IOException;
import java.io.StringWriter;
import java.io.Writer;

public class Writer_append_ex2 {

    public static void main(String[] args) throws IOException {

        Writer writer = new StringWriter();

        writer.append('J').append('P').append('日').append('本');

        System.out.println(writer.toString()); // JP日本
        writer.close();
    }
}

11. flush()

public void flush() throws IOException
Dữ liệu mà bạn ghi vào Writer đôi khi được lưu trữ một cách tạm thời trên bộ đệm, phương thức flush() được sử dụng để xả (flush) toàn bộ dữ liệu trên bộ đệm vào mục tiêu.
Bạn có đọc bài viết về BufferedWriter dưới đây để hiểu hơn về phương thức flush().
Nếu đích dự kiến của Writer này là một phần trừu tượng được cung cấp bên dưới hệ điều hành, chẳng hạn như một tệp, thì việc xả stream chỉ đảm bảo rằng các ký tự trước đó đã được ghi vào stream sẽ được chuyển đến hệ điều hành để ghi; nó không đảm bảo rằng chúng thực sự được ghi vào một thiết bị vật lý như ổ đĩa.

Các hướng dẫn Java IO

Show More