Cодержание
Руководство Java PipedReader
View more Tutorials:



Чтобы легче понять PipedReader, я проиллюстрирую это на примере ниже:

Предположим, что вы разрабатываете Multithreading (многопоточное) приложение, и у вас есть 2 независимых Thread: Thread-A и Thread-B. Вопрос в том:
- Что нужно делать, когда каждый раз, когда символы появляются в Thread-A, они автоматически переносятся в Thread-B?

PipedWriter и PipedReader созданы для того, чтобы помочь вам справиться с ситуацией, упомянутой выше. Каждый раз, когда данные записываются в PipedWritrer, они автоматически появляются в PipedReader.
PipedReader constructors
PipedReader()
PipedReader(int pipeSize)
PipedReader(PipedWriter src)
PipedReader(PipedWriter src, int pipeSize)
Чтобы данные, записанные в PipedWriter, появились в PipedReader, необходимо соединить (connect) эти два объекта вместе.
PipedWriter pipedWriter = new PipedWriter();
PipedReader pipedReader = new PipedReader();
pipedWriter.connect(pipedReader);
Приведенный выше code эквивалентен следующим способам:
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?
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:

Например: Использование PipedReader, PipedWriter с BufferedReader и BufferedWriter для повышения производительности программы.

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:
