betacode

Руководство Java IO Character Streams

  1. Введение
  2. Разница между бинарным потоком и символьным потоком
  3. Обзор символьных потоков
  4. Class java.io.Reader
  5. Class java.io.Writer
  6. Как конвертировать бинарный поток в символьный поток?
  7. Class java.io.BufferedReader
  8. Class java.io.BufferedWriter
  9. Class java.io.FilterReader
  10. Class java.io.FilterWriter
  11. Class java.util.PushbackReader
  12. Class java.io.PrintWriter
  13. Class java.io.CharArrayReader
  14. Class java.io.CharArrayWriter
  15. Class java.io.PipedReader
  16. Class java.io.PipedWriter

1. Введение

В предыдущем руководстве я ознакомил вас с входным-выходным потоком (input-output binary stream), вам нужно понять о нем перед тем как изучать про входной-выходной символьный поток (input-output character stream), вы можете посмотреть по ссылке:

2. Разница между бинарным потоком и символьным потоком

Бинарный поток (binary stream), каждый раз читает/записывает 1 byte (Равный 8 bit)
При этом, символьный поток (character stream) каждый раз читает/записывает один символ, в зависимости от кодирования (encoding) (UTF-8, UTF-16,..) где этот символ будет равен 1, 2 или 3 byte. Посмотрим на иллюстрированное изображение ниже:
UTF-16:
Это текст на японском, если сохраниться в файле с кодированием UTF-16 (UTF-16 encoding), то byte в жестком диске будут похожи как в изображении ниже:
  • Два первых byte (254,255) только означают оповещение о начале новой строки с кодом UTF-16.
  • Следующие символы будут кодированы с помощью 2 byte.
    • Например символ 'J' кодирован с помощью 2 byte (0 и 74)
    • Символ 'P' кодирован с помощью 2 byte (0 и 80)
    • ....
  • При чтении из файла по кодированию UTF-16, он пропустит первые 2 byte, и прочитает последовательные 2 byte соединенные в один символ.
UTF-8:
Тот же текст на японском выше при записи в файл с кодированием UTF-8 будет другим, посмотрим byte сохраненные на жестком диске:
  • С символами ASCII, используется только 1 byte для хранения.
    • Например, он использует 1 byte для хранения символа 'J' (74).
    • Используется 1 byte для хранения символа 'P' (80).
  • Для хранения других символов может использовать 2 byte или 3 byte.
  • Правило для чтения 1 символа, основываясь на таблице кода UTF-8 (UTF-8 Table).
    • Читает первый byte, если <= 127, то это 1 символ ASCII.
    • Напротив если > 127, то нужно прочитать дальше второй byte, и проверить можно эти 2 byte соединить в 1 символ основывая на таблице кода UTF-8 или нет.
    • Если первые 2 byte не соответствуют одному символу, он читает дальше третий byte и соединяет в 1 символ.
    • UTF-8 использует максимум 3 byte для хранения одного символа.

То есть когда вы сохраняете текст с любым кодированием (encoding), нужно прочитаеть с соответсвующим кодированием, не то чтение принесет неправильный результат.

3. Обзор символьных потоков

Иерархия классов:

4. Class java.io.Reader

Reader являет абстрактным классом, это базовый класс для сивольных потоков чтения.
Создать файл test_reader.txt чтобы начать пример с Reader:
HelloReader.java
package org.o7planning.tutorial.javaio.readerwriter;

import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

public class HelloReader {

	public static void main(String[] args) throws IOException {
		// Создать Reader (Символьный поток), чтобы прочитать файл.
		// С кодированием (encoding) по умолчанию.
		Reader r = new FileReader("test_reader.txt");
		int i = -1;

		// Прочитать поочередно символы в потоке.
		while ((i = r.read()) != -1) {
			// Сделать cast в вид символа.
			System.out.println((char) i);
		}
		r.close();
	}

}
Результат запуска примера:
Следующий пример прочитает много символов за один раз. Этот способ увеличивает эффективность программы по сравнению с поочередным чтением каждого символа.
HelloReader2.java
package org.o7planning.tutorial.javaio.readerwriter;

import java.io.FileReader;
import java.io.IOException;
import java.io.Reader;

// Данный пример прочитает много символов за один раз.
public class HelloReader2 {

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

		// Создать объект Reader для чтения файла.
		// С кодированием (encoding) по умолчанию.
		Reader r = new FileReader("test_reader.txt");
		// Создать временным массив. 
		char[] temp = new char[10];
		int i = -1;

		// Метод read(char[]):
		// Прочитает много символов за один раз, и прикрепляет к элементам массива.
		// Возвращает количество прочитанных символов.
		// Возвращает -1 если поток (stream) закончится.
		while ((i = r.read(temp)) != -1) {
			String s = new String(temp, 0, i);
			System.out.println(s);
		}
		r.close(); 
	}

}

5. Class java.io.Writer

Writer это абстрактный класс, являющийся базой символьного потока для записи.
HelloWriter.java
package org.o7planning.tutorial.javaio.readerwriter;

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

public class HelloWriter {

	public static void main(String[] args) throws IOException {
		File dir = new File("C:/test");

		// Создать папку 'C:/test', если она еще не существует.
		dir.mkdirs();

		// Создать объект Writer, для записи данных в файл.
		// С кодированием (encoding) по умолчанию.
		Writer w = new FileWriter("C:/test/test_writer.txt");

		// Массив символов.
		char[] chars = new char[] { 'H', 'e', 'l', 'l', 'o', // 
				' ', 'w', 'r', 'i', 't', 'e', 'r' };

		// Поочередная запись символов в поток (stream).
		for (int i = 0; i < chars.length; i++) {
			char ch = chars[i];
			int j = (int) ch;
			// 
			w.write(j);
		}
		// Закрыть поток (Close stream),
		w.close();
	}
}
Результаты запуска примера:
Следующий пример это записать много символов в поток за один раз. Точнее записать массив символов в поток. Это повышает эффективность программы по сравнению с поочередной записью каждого символа.
HelloWriter2.java
package org.o7planning.tutorial.javaio.readerwriter;

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

public class HelloWriter2 {

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

		File dir = new File("C:/test");
		// Создать папку 'C:/test' если она еще не существует.
		dir.mkdirs();

		// Создать объект Writer, для записи данных в файл.
		Writer w = new FileWriter("C:/test/test_writer2.txt");

		// 
		char[] chars = new char[] { 'H', 'e', 'l', 'l', 'o', //
				' ', 'w', 'r', 'i', 't', 'e', 'r' };

		// Записать все символы в массиве в поток.
		w.write(chars);

		// Обычно Java использует буфер (buffer)
		// чтобы временно сохранитьданные.
		// Когда буфер (buffer) заполнен, данные будут сдвинуты (flush) в файл.
		// Вы так же можете сами сдвинуть (flush) данные в файл.
		w.flush();

		// Записать символ с новой строки (new line character) в поток.
		w.write('\n');

		String s = "FileWriter";

		// Записать строку в поток (stream).
		w.write(s);

		// Закрыть поток (Close stream).
		// Он сдвинет данные с буфера (buffer) в файл.
		// Одновременно закончит запись данных.
		w.close();
	}
}
Результаты запуска примера:

6. Как конвертировать бинарный поток в символьный поток?

У вас есть бинарный поток (binary stream). И вы хотите конвертировать его в символьный поток (character stream)?
В примерах выше мы ознакомились с Reader, Writer. Следующий пример позволяет вам прочитать и написать данные в поток с опредленным кодом.
Создать файл test_utf8.txt
test_utf8.txt
JP日本-八洲
При Save, Eclipse спросит вас с каким кодированием вы хотите сохранить, выберите UTF-8.
InputStreamReaderExample.java
package org.o7planning.tutorial.javaio;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;

public class InputStreamReaderExample {

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

		// Создать binary Stream (бинарный поток), для чтения файла.
		InputStream in = new FileInputStream("test_utf8.txt");

		// Создать Character stream (символьный поток) обертывающий (wrap) бинарный поток выше.
		// Với mã hóa (encoding) là UTF-8.
		Reader reader = new InputStreamReader(in, "UTF-8");

		int i = 0;
		// Прочитать поочередно каждый символ.
		while ((i = reader.read()) != -1) {
			// Сделать cast в символ и напечатать на экране.
			System.out.println((char) i + " " + i);
		}
		reader.close();
	}
}
Результаты запуска примера
Следующий пример записывает файл с определенным кодированием UTF-8.
OutputStreamWriterExample.java
package org.o7planning.tutorial.javaio;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Writer;

public class OutputStreamWriterExample {

	public static void main(String[] args) throws IOException {
		
		File dir = new File("C:/test");
		// Создать папку 'C:/test' если она не существует.
		dir.mkdirs();
		// Создать OutputStream (выходной поток) для записи данных в файл.
		OutputStream out = new FileOutputStream("C:/test/test_write_utf8.txt");

		// Создать Character Stream (символьный поток) обертывающий OutputStream выше.
		// Кодированием (encoding) является UTF-8.
		Writer writer = new OutputStreamWriter(out, "UTF-8");

		String s = "JP日本-八洲";
		writer.write(s);
		writer.close();
	}

}
Результаты запуска примера

7. Class java.io.BufferedReader

Если вы хотите прочитать данные текстового файла. BufferedReader является хорошим выбором.
// BufferedReader является прямым подклассом Reader .
// Constructor:
public BufferedReader(Reader in);

// Удобный метод полученный от BufferedReader.
// Чтение строки текста.
public String readLine();
Ví dụ:
// Пример 1:
Reader r=new FileReader("C:/test.txt");
BufferedReader br=new BufferedReader(r);

// Пример 2:
InputStream in = new FileInputStream("C:/test.txt");
Reader r = new InputStreamReader(in, "UTF-8");
BufferReader br = new BufferedReader(r);
test_multi_lines.txt
## Fruit List
Apricots
Barbados Cherries
Bitter Melon
Cherimoya
Honeydew
Jackfruit
Limes
Lychee
Mango
Oranges
Pineapple
Strawberries
BufferedReaderExample.java
package org.o7planning.tutorial.javaio.buffered;

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;

public class BufferedReaderExample {

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

		InputStream in = new FileInputStream("test_multi_lines.txt");
		Reader reader = new InputStreamReader(in, "UTF-8");
		BufferedReader br = new BufferedReader(reader);

		String s = null;
		int i = 0;

		// Прочитать каждую строку (line) данных.
		// Если читается null значит завершился Stream.
		while ((s = br.readLine()) != null) {
			i++;
			System.out.println(i + " : " + s);
		}
		br.close();
	}

}
Результаты запуска примера:

8. Class java.io.BufferedWriter

BufferedWriter это прямой подкласс Writer.
// Создать объект BufferedWriter
// с помощью обертывания (wrap) другого объекта Writer.
public BufferedWriter(Writer out);

// Индентично с write('\n');
public String newLine();
Пример:
// Создать объект Writer.
Writer w=new FileWriter("C:/test/test_bufferedWriter.txt");

// Создать объект BufferedWriter обертывающий (wrap) writer.
BufferedWriter bw=new BufferedWriter(w);

bw.write("Hello..");

// Записать символ с новой строки '\n'.
bw.newLine();

9. Class java.io.FilterReader

FilterReader это подкласс Reader. Он выборочно читает символы по запросу. Например вы хотите прочитать текст HTML, и пропустить символы в теге (tag). Вам нужно написать подкласс FilterReader и потом использовать его, вы не можете использовать FilterReader напрямую так как он является абстрактным классом (abstract class).
Например, создайте подкласс класса FilterReader, чтобы прочитать данные HTML, но пропустить символы в теге.
Пример входа "<h1>Hello</h1>" ==> выход "Hello".
RemoveHTMLReader.java
package org.o7planning.tutorial.javaio.filter;

import java.io.FilterReader;
import java.io.IOException;
import java.io.Reader;

public class RemoveHTMLReader extends FilterReader {

	boolean intag = false;

	public RemoveHTMLReader(Reader in) {
		super(in);
	}

	// Мы переопределим (override) данный метод.
	// Правилом будет:
	// Прочитать только символы находящиеся вне тегов (tag).
	@Override
	public int read(char[] buf, int from, int len) throws IOException {

		int charCount = 0;

		while (charCount == 0) {

			charCount = super.read(buf, from, len);
			if (charCount == -1) {
				// Завершение stream.
				return -1;
			}

			int last = from;

			for (int i = from; i < from + charCount; i++) {
				// Если не находится в теге HTML.
				if (!intag) {
					if (buf[i] == '<') {
						intag = true;
					} else {
						buf[last++] = buf[i];
					}
				} else if (buf[i] == '>') {
					intag = false;
				}
			}

			charCount = last - from;
		}
		return charCount;
	}

	// Тоже нужно переопределить данный метод.
	@Override
	public int read() throws IOException {
		char[] buf = new char[1];
		int result = read(buf, 0, 1);
		if (result == -1) {
			return -1;
		} else {
			return (int) buf[0];
		}
	}
}
RemoveHTMLReaderTest.java
package org.o7planning.tutorial.javaio.filter;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;

public class RemoveHTMLReaderTest {

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

		// Создать объект Reader из Constructor StringReader.
		Reader in = new StringReader("<h1>Hello \n <b>World</b><h1>");

		RemoveHTMLReader filterReader = new RemoveHTMLReader(in);
		BufferedReader br = new BufferedReader(filterReader);

		String s = null;
		while ((s = br.readLine()) != null) {
			System.out.println(s);
		}
		br.close();
	}
}
Результаты запуска примера:

10. Class java.io.FilterWriter

FilterWriter это прямой подкласс Writer, он записывает выборочно символы по запросу. Вам нужно написать подкласс FilterWriter и переопределить (override) некоторые методы класса FilterWriter.
Пример: Символы меняются при записи в поток.
Rot13.java
package org.o7planning.tutorial.javaio.filter;

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="+ch+" ==> "+ m);    
        }      
        
    }
}
RotateWriter.java
package org.o7planning.tutorial.javaio.filter;

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

public class RotateWriter extends FilterWriter {
 
	public RotateWriter(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);
	}

}
RotateWriterTest.java
package org.o7planning.tutorial.javaio.filter;

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

public class RotateWriterTest {

    
    public static void main(String[] args) throws IOException  {
        String s="abcdef";
        
        Writer writer= new StringWriter();
        
        RotateWriter rw= new RotateWriter(writer);
        rw.write(s.toCharArray(),0,s.length());
        
        rw.close();
        
        String rotateString = writer.toString();
        System.out.println("rotateString="+ rotateString);
    }
}
Результаты запуска примера:

11. Class java.util.PushbackReader

Класс PushbackReader позволяет вернуть один или много символов (push back) для следующего потока после их чтения. Ниэе являются два его Constructor:
public PushbackReader(Reader inputStream)

public PushbackReader(Reader inputStream, int bufSize)
Некоторые дополнительные методы:
// Сдвигает назад (push back) символ в поток.
public void unread(int c) throws IOException
Пример:
PushbackReaderDemo.java
package org.o7planning.tutorial.javaio.pushback;

import java.io.CharArrayReader;
import java.io.IOException;
import java.io.PushbackReader;

class PushbackReaderDemo {

	public static void main(String args[]) throws IOException {
		String s = "if (a == 4) a = 0;\\n";
		char buf[] = new char[s.length()];
		s.getChars(0, s.length(), buf, 0);
		CharArrayReader in = new CharArrayReader(buf);
		PushbackReader f = new PushbackReader(in);
		int c;
		while ((c = f.read()) != -1) {
			switch (c) {
			// Найти символ '='
			case '=':
				// Прочитать следующий символ.
				// (После нахождения символа '=').
				if ((c = f.read()) == '=') {
					System.out.print(".eq.");
				}

				else {
					System.out.print("<-");
					// Сдвинуть назад (Pushes back) этот символ в поток.
					// Похоже на перемещение курсора обратно на позицию.
					f.unread(c);
				}
				break;
			default:
				System.out.print((char) c);
				break;
			}
		}
	}

}
Результаты запуска примера:

12. Class java.io.PrintWriter

// Constructor:
// Обернуть (wrap) объект Writer.
public PrintWriter(Writer out) 
public PrintWriter(Writer out,boolean autoFlush)

// Обернуть (wrap) объект OutputStream.
public PrintWriter(OutputStream out) 
public PrintWriter(OutputStream out,boolean autoFlush)
public PrintWriter(String fileName)
...

// Method:
public void println(String s)
public void print(char ch)
StackTraceToFile.java
package org.o7planning.tutorial.javaio.printwriter;

import java.io.File;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.io.Writer;

public class StackTraceToFile {

	public static void main(String[] args) {
		try {
			// Сделать что-то.
			// Ошибка деления на 0.
			int i = 10 / 0;
		} catch (Exception e) {
			System.out.println("EXCEPTION ....");
			try {
				File dir = new File("C:/test");
				// Создать папку если она не существует.
				dir.mkdirs();
				// Создать Stream для записи данных в файл.
				Writer w = new FileWriter("C:/test/stackTrace.txt");
				
				// Создать объект PrintWriter обертывающий объект Writer 'w'.
				// Таким образом, данные записанные в PrintWriter будут записаны в FileWriter 'w'.
				PrintWriter pw = new PrintWriter(w);

				// Записать ошибочную информацию в поток 'pw'.
				e.printStackTrace(pw);
				System.out.println("Finish !");
			} catch (Exception e1) {
				System.out.println("Error:" + e);
			}
		}
	}

}
StackTraceToString.java
package org.o7planning.tutorial.javaio.printwriter;

import java.io.PrintWriter;
import java.io.StringWriter;

public class StackTraceToString {

	public static void main(String[] args) {
		try {
			// Сделать что-то
			// Ошибка деления на 0.
			int i = 1000 / 0;
		} catch (Exception e) {
			System.out.println("EXCEPTION ....");
			try {
				StringWriter sw = new StringWriter();
				// Создать объект PrintWriter обертывающий StringWriter 'sw'.
				// Таким образом, данные записанные в PrintWriter будут записаны в 'sw'.
				PrintWriter pw = new PrintWriter(sw);

				// Записать ошибочную информацию в 'pw'.
				e.printStackTrace(pw);

				StringBuffer sb = sw.getBuffer();
				String s = sb.toString();
				System.out.println("Exception String:");
				System.out.println(s);
			} catch (Exception e1) {
				System.out.println("Error:" + e);
			}
		}

	}

}
Результаты запуска примера:

13. Class java.io.CharArrayReader

CharArrayReaderDemo.java
package org.o7planning.tutorial.javaio.chararray;

import java.io.CharArrayReader;
import java.io.IOException;

public class CharArrayReaderDemo {
    
    public static void main(String args[]) throws IOException {
        
        String tmp = "abcdefghijklmnopqrstuvwxyz";
        int length = tmp.length();
        char c[] = new char[length];
        tmp.getChars(0, length, c, 0);
        
        CharArrayReader input1 = new CharArrayReader(c);
        CharArrayReader input2 = new CharArrayReader(c, 0, 5);
        
        int i;
        System.out.println("input1 is:");
        while ((i = input1.read()) != -1) {
            System.out.print((char) i);
        }
        System.out.println();
        System.out.println("input2 is:");
        while ((i = input2.read()) != -1) {
            System.out.print((char) i);
        }
        System.out.println();
    }
}
Результаты запуска примера:

14. Class java.io.CharArrayWriter

Некоторые дополнительные методы:
// Записывает данные этого поток в другой поток.
public void writeTo(Writer out) throws IOException
CharArrayWriterDemo.java
package org.o7planning.tutorial.javaio.chararray;

import java.io.CharArrayWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

public class CharArrayWriterDemo {

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

		char[] c = { 'H', 'e', 'l', 'l', 'o', ' ', 'W', 'o', 'r', 'l', 'd', '!' };
		CharArrayWriter out = new CharArrayWriter();
		// Записать данные в 'out'
		out.write(c);

		File dir = new File("C:/test");
		dir.mkdirs();

		FileWriter f1 = new FileWriter(new File("C:/test/a.txt"));

		// Записать данные 'out' в 'f1'.
		out.writeTo(f1);

		FileWriter f2 = new FileWriter(new File("C:/test/b.txt"));

		// Записать данные 'out' в 'f2'.
		out.writeTo(f2);

		f1.close();
		f2.close();

		// Закрыть поток CharArrayWriter 'out'.
		out.close();

		FileWriter f3 = new FileWriter(new File("C:/test/c.txt"));

		// С CharArrayWriter, после закрытия.
		// Метод writeTo(..) больше не работает.
		// И не создает исключение если вы используете writeTo(..).
		out.writeTo(f3);

		System.out.println("Done!");
	}
}

15. Class java.io.PipedReader

No ADS
  • TODO
PipeReaderExample1.java
package org.o7planning.tutorial.javaio.pipereader;

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

public class PipeReaderExample1 {

	private Reader pipedReader;

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

	private void test() throws IOException, InterruptedException {
		// Create a 'pipedWriter',
		PipedWriter pipedWriter = new PipedWriter();

		// Data writing to 'pipedWriter'
		// will automatically appear in 'pipedReader'.
		pipedReader = new PipedReader(pipedWriter);

		new ThreadRead().start();

		char[] chs = new char[] { 'a', 'a', 'b', 'c' , 'e' };

		// Write data to 'pipedWriter'.
		for (char ch : chs) {
			pipedWriter.write(ch);
			Thread.sleep(1000);
		}
		pipedWriter.close();
	}

	// A Thread to read the data that appears on 'pipedReader'.
	class ThreadRead extends Thread {

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

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

}
PipeReaderExample2.java
package org.o7planning.tutorial.javaio.pipereader;

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

public class PipeReaderExample2 {

	private BufferedReader bufferedReader;

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

	private void test() throws IOException, InterruptedException {
		// Create a 'pipedWriter',
		PipedWriter pipedWriter = new PipedWriter();

		// Data writing to 'pipedWriter'
		// will automatically appear in 'pipedReader'.
		PipedReader pipedReader = new PipedReader(pipedWriter);
		
		// Tạo một 'bufferedReader' wrapped 'pipedReader'.
		bufferedReader = new BufferedReader(pipedReader);

		new ThreadRead().start();

		String[] strs = new String[] { "Hello ", "There", "\n", "I am ", "Tran" };

		// Write data to 'pipedWriter'.
		for (String str : strs) {
			pipedWriter.write(str);
			Thread.sleep(500);
		}
		pipedWriter.close();
	}

	// A Thread to read the data that appears on 'bufferedReader' ('pipedReader').
	class ThreadRead extends Thread {

		@Override
		public void run() {
			try {
				String line = null;
				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) {
			}
		}
	}

}

16. Class java.io.PipedWriter

No ADS

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

Show More