1.11Каналы обмена информацией
. В пакете java.io есть четыре класса pipedxxx, облегчающие передачу данных между подпроцессами.
В одном подпроцессе — источнике информации — создается объект класса PipedWriter+ или PipedOutputStream, в который записывается информация методами write () этих классов.
В другом .подпроцессе —приемнике информации — формируется объект класса PipedReader или PipedInputStream. Он связывается с объектом-источником с помощью конструктора или специальным методом connect (), и читает информацию методами read ().
Источник и приемник можно создать и связать в обратном порядке.
Так создается однонаправленный канал (pipe) информации. На самом деле это некоторая область оперативной памяти, к которой организован совместный доступ двух или более подпроцессов. Доступ синхронизируется, записывающие процессы не могут помешать чтению.
Если надо организовать двусторонний обмен информацией, то создаются два канала.
В листинге 18.5 метод run о класса source генерирует информацию, для простоты просто целые числа k, и передает £е в канал методом pw. write (k). Метод run() класса Target читает информацию из канала методом pr.read(). Концы канала связываются с помощью конструктора класса Target. На Рисунок 18.6 видна последовательность записи и чтения информации.
class Target extends Thread{
private PipedReader pr;
Target(PipedWriter pw){
try{
pr = new PipedReader(pw);
}
catch(IOException e){
System.err.println("From Target(): " + e);
}
}
PipedReader getStream(){ return pr;}
public void run(){
while(true)
try{
System.out.println("Reading: " + pr.read());
}
catch(IOException e)
{
System.out.println("The job's finished.");
System.exit(0);
}
}
}
class Source extends Thread{
private PipedWriter pw;
Source (){
pw = new PipedWriter();
}
PipedWriter getStream(){ return pw;}
public void run(){
for (int k = 0; k < 10; k++)
try{
pw.write(k);
System.out.println("Writing: " + k);
}catch(Exception e){
System.err.println("From Source.run(): " + e) ;
}
}
}
class PipedPrWr{
public static void main(String[] args){
Source s = new Source();
Target t = new Target(s.getStream());
s.start();
t.start();
}
}
- 1Потоки ввода/вывода
- 1.1Потоки в Java
- 1.2Иерархия классов
- 1.3Потоковые классы
- 1.4Консольный ввод/вывод
- 1.5Файловый ввод/вывод
- 1.6Получение свойств файла
- 1.7Буферизованный ввод/вывод
- 1.8Поток простых типов Java
- 1.9Кодировка utf-8
- 1.10Прямой доступ к файлу
- 1.11Каналы обмена информацией
- 1.12Сериализация объектов
- 1.13Печать в Java
- 1.14Печать средствами Java 2d
- 1.15Печать файла
- 1.16Печать страниц с разными параметрами