openplanning

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

  1. FilterWriter
  2. Examples

1. FilterWriter

FilterWriter là một lớp con trừu tượng của lớp Writer. Nó là lớp cơ sở để tạo ra các lớp con được sử dụng để ghi một cách có chọn lọc các ký tự theo yêu cầu.
FilterWriter không trực tiếp ghi các ký tự vào mục tiêu (chẳng hạn file), thay vào đó nó quản lý một Writer khác chịu trách nhiệm ghi dữ liệu vào mục tiêu. FilterWriter lọc hoặc chế biến các ký tự ghi vào nó, sau đó ghi kết quả sang Writer mà nó quản lý.
Nhìn vào mã nguồn của lớp FilterWriter cho thấy: Tất cả các phương thức mà nó thừa kế từ lớp cha đã được ghi đè (override) để hoạt động như một người uỷ quyền của đối tượng Writer mà nó quản lý:
FilterWriter
public abstract class FilterWriter extends Writer {  
    protected Writer out;
    
    protected FilterWriter(Writer out) {
        super(out);
        this.out = out;
    }
    public void write(int c) throws IOException {
        out.write(c);
    }
    public void write(char cbuf[], int off, int len) throws IOException {
        out.write(cbuf, off, len);
    }
    public void write(String str, int off, int len) throws IOException {
        out.write(str, off, len);
    }
    public void flush() throws IOException {
        out.flush();
    }
    public void close() throws IOException {
        out.close();
    }
}
FilterWriter constructors
protected FilterWriter(Writer out)

2. Examples

ROT13 là một mật mã thay thế chữ cái (letter substitution cipher) đơn giản, nó thay thế mỗi chữ cái bởi một chữ cái khác đứng sau nó 13 vị trí trên bảng chữ cái. ROT13 là một trường hợp đơn giản của mật mã Caesar (Caesar cipher).
Dưới đây là bảng các chữ cái và các chữ cái thay thế tương ứng của chúng, kết quả của việc sử dụng thuật toán ROT13.
Bảng chữ cái Latinh cơ bản có 26 chữ cái (2x13), nên về cơ bản thuật toán ROT13 sẽ biến đổi một chữ cái thành một chữ cái khác, và sử dụng chính thuật toán này để đảo ngược kết quả. Chẳng hạn thuật toán ROT13 biến chữ "A" thành "N", và sử dụng thuật toán ROT13 cho "N" để có kết quả "A".
ROT13 thường được coi là một ví dụ điển hình về một mật mã hoá (encryption) yếu.
Lớp ROT13 dưới đây cung cấp một phương thức tĩnh rotate(int) chấp nhận đầu vào là một chữ cái và trả về một chữ cái thay thế theo thuật toán ROT13:
ROT13.java
package org.o7planning.filterwriter.ex;

public class ROT13 {

    /**
     * <pre>
     *   a <==> n
     *   b <==> o
     *   c <==> p
     *   d <==> q
     *   e <==> r
     *   ...
     *   y <==> l
     *   z <==> m
     * </pre>
     */
    public static int rotate(int inChar) {
        int outChar;

        if (inChar >= (int) 'a' && inChar <= (int) 'z') {
            outChar = (((inChar - 'a') + 13) % 26) + 'a';
        } else if (inChar >= (int) 'A' && inChar <= (int) 'Z') {
            outChar = (((inChar - 'A') + 13) % 26) + 'A';
        } else {
            outChar = inChar;
        }
        return outChar;
    }

    // Test
    public static void main(String[] args) {
        for (char ch = 'a'; ch <= 'z'; ch++) {
            char m = (char) rotate(ch);
            System.out.println(ch + " ==> " + m);
        }
        System.out.println(" --- ");
        for (char ch = 'A'; ch <= 'Z'; ch++) {
            char m = (char) rotate(ch);
            System.out.println(ch + " ==> " + m);
        }
    }
}
Viết lớp ROT13Writer mở rộng từ lớp FilterWriter. Các ký tự được ghi vào ROT13Writer sẽ bị thay thế theo thuật toán ROT13:
ROT13Writer.java
package org.o7planning.filterwriter.ex;

import java.io.FilterWriter;
import java.io.IOException;
import java.io.Writer;
 
public class ROT13Writer extends FilterWriter {
 
    public ROT13Writer(Writer out) {
        super(out);
    }  
    
    @Override
    public void write(int outChar) throws IOException {
        super.write(ROT13.rotate(outChar));
    }
 
    @Override
    public void write(char[] cbuf, int offset, int length) throws IOException {
        char[] tempbuf = new char[length];
        for (int i = 0; i < length; i++) {
            tempbuf[i] = (char) ROT13.rotate(cbuf[offset + i]);
        }
        super.write(tempbuf, 0, length);
    }  
    
    @Override
    public void write(String str, int off, int len) throws IOException {
        char[] cbuf = str.toCharArray();
        this.write(cbuf, off, len);
    }
}
Ví dụ sử dụng ROT13Writer:
ROT13WriterTest1.java
package org.o7planning.filterwriter.ex;

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

public class ROT13WriterTest1 {

    public static void main(String[] args) throws IOException {
        Writer targetWriter = new StringWriter();
        FilterWriter filterWriter = new ROT13Writer(targetWriter);
        
        String inputString = "Hello";
        
        filterWriter.write(inputString);
        filterWriter.close();
        
        String outputString = targetWriter.toString();
        System.out.println(inputString + " ==> " + outputString);
    }
}
Output:
Hello ==> Uryyb
Ví dụ sử dụng ROT13Writer ghi dữ liệu vào file:
ROT13WriterTest2.java
package org.o7planning.filterwriter.ex;

import java.io.File;
import java.io.FileWriter;
import java.io.FilterWriter;
import java.io.IOException;
import java.io.Writer;

public class ROT13WriterTest2 {

    public static void main(String[] args) throws IOException {
        // Windows: C:/somedir/rot13-out-file.txt
        File outFile = new File("/Volumes/Data/test/rot13-out-file.txt");
        outFile.getParentFile().mkdirs();
        
        Writer targetWriter = new FileWriter(outFile);
        FilterWriter filterWriter = new ROT13Writer(targetWriter);
        
        String inputString = "Uryyb";
        
        filterWriter.write(inputString);
        filterWriter.close();
    }
}
Output:
rot13-out-file.txt
Hello

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

Show More