betacode

Руководство Java FilterWriter

  1. FilterWriter
  2. Examples

1. FilterWriter

FilterWriter - это абстрактный подкласс класса Writer. Это базовый класс для создания подклассов, используемых для выборочной записи необходимых символов.
FilterWriter не записывает непосредственно символы в целевой объект (например, файл), вместо этого он управляет другим Writer, который отвечает за запись данных в целевой объект. FilterWriter фильтрует или обрабатывает символы, записанные в него, а затем записывает результаты в Writer, которым он управляет.
Исходный код класса FilterWriter показывает: Все методы, которые он наследует от от родительского класса, были переопределены (override), чтобы действовать как прокси объекта Writer, которым он управляет:
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 - это простой шифр с заменой букв, заменяющий каждую букву другой буквой, которая находится на 13 позиции после нее в алфавите. ROT13 - это простой случай шифра Caesar (Caesar cipher).
Ниже приведена таблица букв и соответствующих им замен, полученных в результате использования алгоритма ROT13.
Стандартный алфавит Latinh состоит из 26 букв (2х13). В принципе, алгоритм ROT13 заменяет одну букву на другую и использует тот же алгоритм для обратного результата. Например, алгоритм ROT13 превращает букву "A" в "N" и использует алгоритм ROT13 для "N", чтобы получить "A" в качестве замены.
ROT13 часто считается ярким примером слабого шифрования (encryption).
Следующий класс ROT13 предоставляет статический метод rotate(int), который принимает букву в качестве входных данных и возвращает заменяющую букву в качестве выходных данных с помощью алгоритма 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);
        }
    }
}
Напишите класс ROT13Writer, расширенный из класса FilterWriter. Символы, написанные в ROT13Writer, будут заменены с помощью алгоритма 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);
    }
}
Пример использования 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
Пример использования ROT13Writer для записи данных в файл:
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

Руководства Java IO

Show More