В 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;
}
Основные этапы разработки сайта для стоматологической клиники
Продвижение своими сайтами как стратегия роста и независимости