В Java потоки ввода-вывода InputStream
и OutputStream
представляют собой концепцию работы с внешним миром, будь то файл на диске, экран монитора, сетевое подключение или принтер. То есть всего, что выходит за пределы приложения.
Если я правильно понимаю, то в компьютере все в конечном итоге представляет собой поток байтов, и Stream-ы унифицируют работу над этим всем. Просто для каждого периферийного устройства я пишу свою реализацию read()
и write()
.
Есть конкретные классы - например FileOutputStream
, который работает конкретно с файлами на диске. В нем в write()
-методе используется native-метод, который осуществляет работу по записи данных в файл.
Но, например, я хочу работать с файлом по ftp. Или хочу вывести файл на печать через принтер. При таком концепте я должен делать это все через те же OutputStream
. Как я должен написать реализацию класса OutputStream
, а конкретно метода write()
, чтобы отправить поток байтов в принтер? Или же в другой файл через ftp-соединение?
OutputStream
, как и InputStream
являются абстрактными классами, то есть не содержат реализации одного или более методов.
Конкретно в классе OutputStream
отсутствует реализация метода:
public abstract void write(int oneByte) throws IOException;
Однако в документации говорится
All output stream subclasses should override both
write(int)
and write(byte[],int,int)
, write(byte[],int,int)
. The
three argument overload is necessary for bulk access to the data. This is
much more efficient than byte-by-byte access.
То есть обязательно необходимо реализовать запись одного байта и массива байт.
Таким образом вам необходимо унаследовать абстрактный класс OutputStream
и реализовать передачу байтов устройству в методах write
. Это не обязательно должен быть native
метод, ваш класс может содержать высокоуровневое определение интерфейса взаимодействия с устройством, например через библиотеки, которые реализуют подключение к устройству и организуют передачу байт.
Пример записи в байт напрямую в принтер (на порту "/dev/usb/lp0") на языке Java
:
BufferedWriter writer = new BufferedWriter(new FileWriter("/dev/usb/lp0"));
writer.write(new String("Hello world").getBytes());
writer.close();
Однако не уверен что у Java будет достаточно прав, поэтому привожу эквивалент на C
:
int main()
{
FILE *printer = fopen("/dev/usb/lp0", "w");
fprintf(printer, "Hello World.\n\f");
fflush(printer);
fclose(printer);
return 0;
}
Оборудование для ресторана: новинки профессиональной кухонной техники
Частный дом престарелых в Киеве: комфорт, забота и профессиональный уход
Начал разбираться с JavaFx и появился вопросВозможно ли сделать так, что при нажатии на элементы TreeView появлялся текст, который привязан к этому...
Что будет с программным кодом, если объявить объект родительского класса с конструктором дочернего класса? Иначе говоря, какой конструктор...
Известный факт что массив в Java это объект, а значит он должен иметь класс из которого мы строим этот объектПо идее он должен быть финальным...