Программирование на JAVA
Меню :
Стартовая
Основы программирования
Программирование на JAVA
Программирование на C++
Программирование на Pascal
Задачи по программированию
Такое соединение можно обеспечить либо вызовом метода connect() с передачей соответствующего объекта Pipedl/OStream (будем так кратно обозначать пару классов, в данном случае PipedlnputStream и PipedOutputStream), либо передать этот объект еще при вызове конструктора.
Использование связки PipedlnputStream и PipedOutputStream показано в следующем примере:
try {
int countRead = 0;
byte[] toRead = new byte[100];
PipedlnputStream pipeln = new PipedlnputStream();
PipedOutputStream pipeOut= new PipedOutputStream(pipeln);
// Считывать в массив, пока он полностью не будет заполнен
while(countRead<toRead.length) {
// Записать в поток некоторое количество байт
for(inti=0; i<(Math.random()*10); i++) {
pipeOut.write((byte)(Math.random()*127));
}
// Считать из потока доступные данные,
// добавить их к уже считанным.
int willRead = pipeln.availableO;
if (willRead+countReadMoRead.length)
//Нужно считать только до предела массива
willRead = toRead.length-countRead;
countRead += pipeln.read(toRead, countRead, willRead);
}
} catch (lOException e) {
System.out.println ("Impossible lOException occur: "); e. printStackTrace( ) ;
}
Данный пример носит чисто демонстративный характер (в результате его работы массив toRead будет заполнен случайными числами). Более явно выгода от использования Pipedl/OStream в основном проявляется при разработке многопоточного приложения. Если в программе запускается несколько потоков исполнения, организовать передачу данных между ними удобно с помощью этих классов. Для этого нужно создать связанные объекты Pipedl/OStream, после чего передать ссылки на них в соответствующие потоки. Поток выполнения, в котором производится чтение данных, может содержать подобный код:
// inStream - объект класса PipedlnputStream try {
while(true) {
byte[] readedBytes = null; synchronized(inStream) { int bytesAvailable = inStream.available(); readedBytes = new byte[bytesAvailable]; inStream.read(readedBytes);
}
// обработка полученных данных из readedBytes
II-
) catch(IOException e) {
/* lOException будет брошено, когда поток inStream, либо связанный с ним PipedOutputStream, уже закрыт, и при этом производится попытка считывания из inStream */ System.out.println("pa6oTa с потоком inStream завершена");