Spec-Zone .ru
спецификации, руководства, описания, API
|
Программы используют потоки байтов, чтобы выполнить ввод и вывод 8-разрядных байтов. Все классы потока байтов происходят от InputStream
и OutputStream
Есть много классов потока байтов. Чтобы демонстрировать, как потоки байтов работают, мы сосредоточимся на потоках байтов файлового ввода-вывода, FileInputStream
FileOutputStream
Мы исследуем FileInputStream
и FileOutputStream
исследуя пример программы называется CopyBytes
, который использует потоки байтов, чтобы скопировать xanadu.txt
, один байт за один раз.
import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class CopyBytes { public static void main(String[] args) throws IOException { FileInputStream in = null; FileOutputStream out = null; try { in = new FileInputStream("xanadu.txt"); out = new FileOutputStream("outagain.txt"); int c; while ((c = in.read()) != -1) { out.write(c); } } finally { if (in != null) { in.close(); } if (out != null) { out.close(); } } } }
CopyBytes
проводит большую часть его времени в простом цикле, который читает входной поток и пишет поток вывода, один байт за один раз, как показано в следующем числе.
Простой ввод и вывод потока байтов.
Заметьте это read()
возвраты int
значение. Если ввод является потоком байтов, почему не делает read()
возвратите a byte
значение? Используя a int
поскольку тип возврата позволяет read()
использовать-1, чтобы указать, что это достигло конца потока.
Закрытие потока, когда это больше не необходимо, очень важно — настолько важный что CopyBytes
использование a finally
блокируйте, чтобы гарантировать, что оба потока будут закрыты, даже если ошибка произойдет. Эта практика помогает избежать серьезных утечек ресурсов.
Одна возможная ошибка - это CopyBytes
было неспособно открыть один или оба файла. Когда это происходит, потоковое соответствие переменной файлу никогда не изменяется от его начальной буквы null
значение. Именно поэтому CopyBytes
удостоверяется, что каждая потоковая переменная содержит ссылку на объект перед вызовом close
.
CopyBytes
походит на нормальную программу, но она фактически представляет своего рода низкоуровневый ввод-вывод, которого следует избежать. С тех пор xanadu.txt
содержит символьные данные, лучший подход должен использовать символьные потоки, как обсуждено в следующем разделе. Есть также потоки для более сложных типов данных. Потоки байтов должны только использоваться для самого примитивного ввода-вывода.
Итак, почему разговор о потоках байтов? Поскольку все другие потоковые типы основываются на потоках байтов.