openplanning

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

Xem thêm các chuyên mục:

Hãy theo dõi chúng tôi trên Fanpage để nhận được thông báo mỗi khi có bài viết mới. Facebook

1- PipedReader

Để dễ dàng hiểu về PipedReader tôi đưa ra một tình huống như hình minh hoạ dưới đây:
Giả sử bạn đang phát triển một ứng dụng Multithreading (Đa luồng), và bạn có 2 Thread độc lập là Thread-AThread-B. Câu hỏi đặt ra là:
  • Cần làm gì để mỗi khi các ký tự xuất hiện trên Thread-A chúng sẽ được chuyển sang Thread-B một cách tự động?
PipedWriterPipedReader được tạo ra giúp bạn xử lý tình huống đề cập ở trên. Mỗi khi dữ liệu được ghi vào PipedWriter chúng sẽ xuất hiện một cách tự động trên PipedReader.
PipedReader constructors

PipedReader()

PipedReader(int pipeSize)

PipedReader(PipedWriter src)

PipedReader(PipedWriter src, int pipeSize)
Để dữ liệu ghi vào PipedWriter xuất hiện trên PipedReader bạn phải kết nối (connect) hai đối tượng này với nhau.

PipedWriter pipedWriter = new PipedWriter();
PipedReader pipedReader = new PipedReader();

pipedWriter.connect(pipedReader);
Code trên cũng tương đương với các cách dưới đây:

PipedWriter pipedWriter = new PipedWriter();
PipedReader pipedReader = new PipedReader();

pipedReader.connect(pipedWriter);

PipedWriter pipedWriter = new PipedWriter();
PipedReader pipedReader = new PipedReader(pipedWriter);

PipedReader pipedReader = new PipedReader();
PipedWriter pipedWriter = new PipedWriter(pipedReader);
  • TODO Link?

2- Example 1

PipedReaderEx1.java

package org.o7planning.pipedreader.ex;

import java.io.IOException;
import java.io.Reader;
import java.io.Writer;
import java.io.PipedReader;
import java.io.PipedWriter;

public class PipedReaderEx1 {

    private PipedReader pipedReader;
    private PipedWriter pipedWriter;

    public static void main(String[] args) throws IOException, InterruptedException {
        new PipedReaderEx1().test();
    }

    private void test() throws IOException, InterruptedException {

        // Create a PipedReader
        pipedReader = new PipedReader();

        // Data written to 'pipedWriter'
        // will appear automatically at 'pipedReader'.
        pipedWriter = new PipedWriter(pipedReader);

        new ThreadB().start();
        new ThreadA().start();
    }

    //
    class ThreadA extends Thread {
        @Override
        public void run() {
            try {
                char[] chs = new char[] { 'a', 'a', 'b', 'c', 'e' };

                for (char ch : chs) {
                    pipedWriter.write(ch);
                    Thread.sleep(1000);
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                closeQuietly(pipedWriter);
            }
        }
    }

    //
    class ThreadB extends Thread {

        @Override
        public void run() {
            try {
                int ch = 0;
                while ((ch = pipedReader.read()) != -1) {
                    System.out.println((char) ch);
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                closeQuietly(pipedReader);
            }
        }
    }

    private void closeQuietly(Reader reader) {
        if (reader != null) {
            try {
                reader.close();
            } catch (IOException e) {
            }
        }
    }

    private void closeQuietly(Writer writer) {
        if (writer != null) {
            try {
                writer.close();
            } catch (IOException e) {
            }
        }
    }
}
Output:

3- Example 2

Ví dụ: Sử dụng PipedReader, PipedWriter với BufferedReaderBufferedWriter để nâng cao hiệu xuất của chương trình.
PipedReaderEx2.java

package org.o7planning.pipedreader.ex;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer;
import java.io.PipedReader;
import java.io.PipedWriter;

public class PipedReaderEx2 {

    private BufferedReader bufferedReader;
    private BufferedWriter bufferedWriter;

    public static void main(String[] args) throws IOException, InterruptedException {
        new PipedReaderEx2().test();
    }

    private void test() throws IOException, InterruptedException {

        
        PipedReader pipedReader = new PipedReader();  
        PipedWriter pipedWriter = new PipedWriter();
        
        pipedReader.connect(pipedWriter);
        
        this.bufferedReader = new BufferedReader(pipedReader);
        this.bufferedWriter = new BufferedWriter(pipedWriter);

        new ThreadB().start();
        new ThreadA().start();
    }

    //
    class ThreadA extends Thread {
        @Override
        public void run() {
            try {
                String[] texts = new String[] { "One\nTwo\n", "Three\nFour\n", "Five" };

                for (String text: texts) {
                    bufferedWriter.write(text);
                    bufferedWriter.flush();
                    Thread.sleep(1000);
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                closeQuietly(bufferedWriter);
            }
        }
    }

    //
    class ThreadB extends Thread {

        @Override
        public void run() {
            try {
                String line;
                while ((line = bufferedReader.readLine()) != null) {
                    System.out.println(line);
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                closeQuietly(bufferedReader);
            }
        }
    }

    private void closeQuietly(Reader reader) {
        if (reader != null) {
            try {
                reader.close();
            } catch (IOException e) {
            }
        }
    }

    private void closeQuietly(Writer writer) {
        if (writer != null) {
            try {
                writer.close();
            } catch (IOException e) {
            }
        }
    }
}
Output:

Xem thêm các chuyên mục: