Программирование на JAVA
Меню :
Стартовая
Основы программирования
Программирование на JAVA
Программирование на C++
Программирование на Pascal
Задачи по программированию
}
Если с объектом inStream одновременно могут работать несколько потоков выполнения, то необходимо использовать блок synchronized (как и сделано в примере), который гарантирует, что в период между вызовами inStream.availableO и inStream.read(...) ни в каком другом потоке выполнения не будет производиться считывание из inStream. Поэтому вызов inStream.read(readedBytes) не приведет к блокировке и все данные, готовые к считыванию, будут считаны.
StringBufferlnputStream
Иногда бывает удобно работать с текстовой строкой String как с потоком байт. Для этого можно воспользоваться классом StringBufferlnputStream. При создании объекта этого класса необходимо передать конструктору объект String. Данные, возвращаемые методом read(), будут считываться именно из этой строки. При этом символы будут преобразовываться в байты с потерей точности - старший байт отбрасывается (напомним, что символ char состоит из двух байт).
SequencelnputStream
Класс SequencelnputStream объединяет поток данных из других двух и более входных потоков. Данные будут вычитываться последовательно -сначала все данные из первого потока в списке, затем из второго, и так далее. Конец потока SequencelnputStream будет достигнут только тогда, когда будет достигнут конец потока, последнего в списке.
В этом классе имеется два конструктора — принимающий два потока и принимающий Enumeration (в котором, конечно, должны быть только экземпляры InputStream и его наследников). Когда вызывается метод read(), SequencelnputStream пытается считать байт из текущего входного потока. Если в нем больше данных нет (считанное из него значение равно -1), у него вызывается метод close() и следующий входной поток становится текущим. Так продолжается до тех пор, пока не будут получены все данные из последнего потока. Если при считывании обнаруживается, что больше входных потоков нет, SequencelnputStream возвращает -1. Вызов метода close() у SequencelnputStream закрывает все содержащиеся в нем входные потоки. Пример:
FilelnputStream inFilel = null; FilelnputStream inFile2 = null; SequencelnputStream sequenceStream = null; FileOutputStream outFtte = null; try{
inFilel = new FilelnputStream("file1 .txt");
inFile2 = new FilelnputStream("file2.txt");
sequenceStream = new SequencelnputStream(inFile1, inFile2);