Потоки являются абстрактной концепцией последовательностей байтов.
Файлы представляют собой статические формы данных данных, в то время как потоки относятся к форме при передаче данных.
Классы потока разделены на две основные категории: классы потока узлов и классы фильтрованных потоков (также называемые классы потока процесса).
Класс, соответствующий целевому устройству, называется классом потока узлов. Программа также может вызвать класс потока узлов через непрямой класс потока для достижения более гибкого и удобного чтения различных типов данных. Этот класс косвенного потока является классом потока фильтров (также называемый класс потока обработки) или класс упаковки.
Процесс вызова класса обертки выглядит следующим образом:
Взаимосвязь между классификацией потока
Независимо от того, насколько богата и сложна классификация потоков, его корни поступают из четырех основных классов. Отношения между этими четырьмя классами следующие:
| Байтовый поток | Поток персонажей | |
| Входной поток | InputStream | Читатель |
| Выходной поток | OutputStream | Писатель |
Unicode кодирует сохраненные символы в Java, а класс обработки потока символов отвечает за преобразование других внешних кодированных потоков символов и потоков символов Unicode в Java. Классы входные потоки и преобразования ручки outputstreamwriter преобразования потоков символов и байтовых потоков. Поток символов (может обрабатывать по одному буферу за раз) более эффективен при одной операции, чем байтовый поток (по одному байту за раз).
InputStream
Поскольку inputstream и outputstream являются классами воздержания, они не могут указать, какое устройство IO соответствует. Ниже есть много подклассов, в том числе конкретные устройства ввода -вывода, такие как сети, трубопроводы, память, файлы и т. Д., И их различные объекты подкласса, используемые в реальных программах.
ПРИМЕЧАНИЕ. Мы называем источник ввода и цель, соответствующую классу потока узлов, узлом потока (узел).
ПРИМЕЧАНИЕ. При написании содержимого файла a для файла b программа использует выходной класс или класс ввода для работы файла A. Класс ввода и вывода относится к программе, а не от имени файла, поэтому мы должны создать класс ввода для завершения операции в файле A и выходного класса для завершения операции в файле B.
OutputStream
Ориентированный на персонаж читатель/писатель
Поток, направленный символами Unicode, означает чтение из потока или написание информации в потоку в символах Unicode. Точно так же читатель/писатель также является воздержанным классом.
Читатель
Писатель
Повторное использование кода программы IO:
Обычно при написании кода используйте -1 в качестве конца ввода клавиатуры и не используйте System.in непосредственно в письменной функции. Просто при вызове функции System.in передается как параметр. Таким образом, когда мы хотим прочитать данные из файла в будущем, чтобы заменить ручной ввод клавиатуры, мы можем использовать эту функцию напрямую, поэтому программе не нужно вносить слишком много модификаций, чтобы достичь эффекта неизменного и адаптации к изменениям.
Преобразование байтовых потоков и потоков символов
InputStreamReader и OutputStreamReader: преобразовать байто-ориентированный поток в потоку, ориентированный на символ.
Класс InputStreamReader - это мост от байтового потока в потоку символов: он считывается в байтах и преобразует его в поток символов в соответствии с указанным методом кодирования.
Используемый метод кодирования может быть указан по имени или методом кодирования по умолчанию, приемлемым для платформы.
Каждый вызов к одному из методов read () inputStreamReader может привести к чтению одного или нескольких байтов из входного потока базового байта.
Чтобы достичь более высокой эффективности, рассмотрите возможность инкапсулирования InputStreamReader с BufferedReader.
BufferedReader in = new BufferedReader (New InputStreamReader (System.in));
Резюме использования потоковой передачи Java
Я столкнулся с множеством потоков Java в моей самой профессиональной работе, и краткое изложение следующего:
1. Сгенерировать формат zip. То, с чем вы сталкиваетесь, это генерировать zip -файлы в сервлете, вывести их в веб -клиент и загружать напрямую.
response.setContentType ("Application/Zip"); response.addheader ("content-disposition", "Attactment; filename =/" xxx.zip/ ""); Zipoutputstream out = new ZipOutputStream (response.getOutputStream ()) для () {Zipentry intry = new Zipentry ("aa" + i ".dat"); out.putnewentry (intry); байты [] bt = s.getbytes (); out.writebytes (bt, 0, bt.length ()); out.closeentry (); } out.flush (); out.close (); Zipoutputstream наследует от java.io.filteroutputstream. Поэтому реальная операция записи записывается через параметр outputStream.
Его void write (byte [] b, int off, int len), наконец, вызывает. Write (b, off, len);
Если вы хотите сгенерировать zip -файл, напишите New ZipoutputStream (New FileOutputStream (path));
2. Подобное письмо XML.
Xmlwriter writer = new XmlWriter (New FileOutputStream (Path), Formatter)
Writer.write (doc). Принцип аналогичен вышеуказанному
3. Напишите текстовые файлы и добавьте их.
PrintStream ps = new PrintStream (New FileOutputStream (Path, True), "UTF-8") ps.println (ы); // может писать различные типы, такие как логический, инт и т. Д.PrintSteam также наследует от FilterOutputStream
DataOutputStream Out = new DataOutputStream (socket.getOutputStream ()); out.writebytes (bt); out.writeboolean (логический V);
DataOutputStream также является FilterOutputStream.
5. Читать из текста
BufferedReader Reader = New BufferedReader (New FileReader (Path)); reader.readline ();
Образец буферидации такой же, как и рисунок фильтра выше. В нем хранится объект, который объект считывателя передается как параметр и используется для фактического чтения.
Класс, соответствующий Java 1.0 BufferedReader, является BufferedInputStream, который является FilterInputStream.
6. Читать из сокета
BufferedInputStream IS = новый BufferedInputStream (Socket.getInputStream ()); is.read (bt, 0, bt.length ());
Суммировать:
Серия базовых потоков класса является InputStream и OutputStream. Они являются абстрактными классами, и единственными необходимыми методами являются (взять вывод в качестве примера)
void write (int b) бросает ioException; void write (byte b []) бросает ioexceptionvoid write (byte b [], int off, int len)
Самая базовая вещь - это операция байта. Первый метод, кажется, пишет целое число, но на самом деле он пишет только один байт (самые низкие восемь битов). Его подкласс делится на две серии, одна из них - напрямую эксплуатировать выходное устройство. Мы столкнулись выше, так это File (FileOutputStream) и выходной выход (ServletOutputStream). Другие часто используемые также являются байтором, который работает непосредственно в памяти.
Затем находится серия FilterOutputStream, которая получает параметр сиденья объекта OutputStream, а реальная операция записи завершается через объект. Например, ZipOutputStream отвечает только за генерацию сжатых данных. Что касается того, записываются ли эти данные в файл, память или сервис -ответ, он определяется входными параметрами. Это рисунок декоратора.
Обычно используемые операции в серии фильтров включают PrintStream (предоставление Print, println, write (boolean [int, char, string]) и, наконец, с использованием метода out.write для написания его в байтах.
Существует также DataOutputStream, который предоставляет writebyte/writeboolean/writedouble/writelong/wiretutf и другие методы.
Есть также розетка/молния и другие вещи, которые обычно не используются.
Поток Java очень удобна и сложна. Сложность означает, что реализация функции часто требует нескольких классов, и есть несколько комбинаций. Это все еще нужно суммировать на практике.