завел мой врач издалека.
410013796724260
• Webmoney
R335386147728
Z369087728698
Потоки вывода, OutputStreamСтандартная библиотека Java имеет весьма развитые средства вывода данных. Все возможности вывода данных сосредоточены в пакете java.io. Существуют две параллельные иерархии классов вывода : OutputStream и Writer. Класс Writer введен в последних версиях Java. В данной статье рассматривается вопрос использования потоков для вывода данных в файл. Иерархии выходных OutputStream потоков представлена на следующем рисунке.
Поток Stream- это абстрактное значение источника или приёмника данных, которые способны обрабатывать информацию. Есть два типа потоков: байтовые и символьные. В некоторых ситуациях символьные потоки более эффективны, чем байтовые. Классы, производные от классов OutputStream или Writer, имеют методы с именами write() для записи одиночных байтов или массива байтов (отвечают за вывод данных). Выходной поток OutputStreamКласс OutputStream - это абстрактный класс, определяющий байтовый поток вывода. Наследники данного класса определяют куда направлять данные: в массив байтов, в файл или канал. Из массива байт можно создать текстовую строку String. Методы класса OutputStream :
Класс ByteArrayOutputStreamКласс ByteArrayOutputStream представляет поток вывода, использующий массив байтов в качестве места вывода. Чтобы создать объект данного класса, можно использовать один из его конструкторов : ByteArrayOutputStream() ByteArrayOutputStream(int size) Первый конструктор создает массив данных для хранения байтов длиной в 32 байта, а второй конструктор создает массив длиной size. Примеры использования класса ByteArrayOutputStream :
import java.io.ByteArrayOutputStream;
public class TestBOS
{
public static void main(String[] args)
{
ByteArrayOutputStream bos;
bos = new ByteArrayOutputStream();
String text = "Hello World!";
byte[] buffer = text.getBytes();
try{
bos.write(buffer);
} catch(Exception e) {
System.out.println(e.getMessage());
}
// Преобразование массива байтов в строку
System.out.println(bos.toString());
// Вывод в консоль по символьно
byte[] array = bos.toByteArray();
for (byte b: array) {
System.out.print((char)b);
}
System.out.println();
}
}
В классе ByteArrayOutputStream метод write записывает в поток некоторые данные (массив байтов). Этот массив байтов записывается в объекте ByteArrayOutputStream в защищенное поле buf, которое представляет также массив байтов (protected byte[] buf). Так как метод write может вызвать исключение, то вызов этого метода помещается в блок try..catch. Используя методы toString() и toByteArray(), можно получить массив байтов buf в виде текста или непосредственно в виде массива байт. С помощью метода writeTo можно перенаправить массив байт в другой поток. Данный метод в качестве параметра принимает объект OutputStream, в который производится запись массива байт : Для ByteArrayOutputStream не надо явным образом закрывать поток с помощью метода close. Класс FileOutputStreamКласс FileOutputStream создаёт объект класса OutputStream, который можно использовать для записи байтов в файл. Это основной класс для работы с файлами. Создание нового объекта не зависит от того, существует ли заданный файл или нет. Если файл отсутствует, то будет создан новый файл. В случае попытки открытия файла, доступного только для чтения, будет вызвано исключение. FileOutputStream имеет следующий конструкторы:
public FileOutputStream(File file)
throws FileNotFoundException;
public FileOutputStream(String name)
throws FileNotFoundException;
public FileOutputStream(String name, boolean append)
throws FileNotFoundException;
Смысл конструкторов последнего понятен из их описания. Но имеется несколько нюансов :
Какой-либо дополнительной функциональности по сравнению с базовым классом FileOutputStream не добавляет.
ByteArrayOutputStream bos = new ByteArrayOutputStream();
String text = "Hello Wolrd!";
byte[] buffer = text.getBytes();
try {
bos.write(buffer);
} catch(Exception e){
System.out.println(e.getMessage());
}
try {
FileOutputStream fos = new FileOutputStream("hello.txt");
bos.writeTo(fos);
} catch(IOException e){
System.out.println(e.getMessage());
}
Класс BufferedOutputStreamКласс BufferedOutputStream создает буфер для потоков вывода. Этот буфер накапливает выводимые байты без постоянного обращения к устройству. И когда буфер заполнен, производится запись данных.
import java.io.*;
...
String text = "Hello world!"; // строка для записи
FileOutputStream fos = new FileOutputStream("file.txt");
try {
BufferedOutputStream bos = new BufferedOutputStream(fos);
// Переводим текст в байты
byte[] buffer = text.getBytes();
bos.write(buffer, 0, buffer.length);
} catch(IOException e) {
System.out.println(e.getMessage());
}
Класс BufferedOutputStream в конструкторе принимает в качестве параметра объект OutputStream - в примере это файловый поток вывода FileOutputStream. BufferedOutputStream не добавляет много новой функциональности, он просто оптимизирует действие потока выводаи его следует использовать для организации более эффективного буферизованного вывода в поток. Класс DataOutputStreamКласс DataOutputStream позволяет писать данные в поток через интерфейс DataOutput, который определяет методы, преобразующие элементарные значения в форму последовательности байтов. Такие потоки облегчают сохранение в файле двоичных данных. Для записи каждого из примитивных типов предназначен свой метод класса DataOutputStream:
import java.io.*;
...
FileOutputStream fos = new FileOutputStream("c://data.bin");
// запись в файл
try (DataOutputStream dos = new DataOutputStream(fos)) {
// записываем значения
dos.writeUTF("Киса Воробьянинов");
dos.writeInt(30);
dos.writeDouble(20.58);
dos.writeBoolean(falss);
System.out.println("Запись в файл выполнена");
} catch(IOException e){
System.out.println(e.getMessage());
}
Класс PrintStreamPrintStream является именно тем классом, который используется для вывода информации в консоль. Когда мы с помощью вызова System.out.println() пишем в консоль некоторую информацию, то тем самым используется PrintStream, так как переменная out класса System представляет объект класса PrintStream, а метод println() - это метод класса PrintStream. Но PrintStream можно использовать для записи информации в поток вывода. Например, запишем информацию в файл:
import java.io.*;
...
String text = "Hello, World!"; // строка для записи
FileOutputStream fos = new FileOutputStream("C:/data.txt");
try {
PrintStream printStream = new PrintStream(fos));
printStream.println(text);
System.out.println("Запись в файл выполнена");
} catch(IOException e) {
System.out.println(e.getMessage());
}
В данном примере используется конструктор PrintStream, который в качестве параметра принимает поток вывода FileOutputStream. Можно было бы также использовать конструктор с указанием названия файла для записи: PrintStream (String filename). С помощью метода println() производится запись информации в выходной поток - то есть в объект FileOutputStream. В случае с выводом на консоль с помощью System.out.println() в качестве потока вывода выступает консоль. Для вывода информации в выходной поток PrintStream использует следующие методы: println(): вывод строковой информации с переводом строки print(): вывод строковой информации без перевода строки printf(): форматированный вывод Следующий код показывает возможности использования форматированного вывода класса PrintStream :
int i = 15;
printStream.printf("Квадрат числа %d равен %d \n", i, i*i);
Класс ObjectOutputStreamКласс ObjectOutputStream используется для сериализации объектов в поток. Сериализация представляет процесс записи состояния объекта в поток, соответственно процесс извлечения или восстановления состояния объекта из потока называется десериализацией. Сериализация очень удобна, когда идет работа со сложными объектами. Для создания объекта ObjectOutputStream необходимо в конструктор передать поток, в который будет производится запись объектов. Для записи данных ObjectOutputStream использует ряд методов, среди которых можно выделить следующие:
Представленные методы охватывают весь спектр данных, которые можно сериализовать. Пример использования класса ObjectOutputStream :
import java.io.*;
class Person implements Serializable
{
private static final long serialVersionUID = 1L;
public String name ;
public int age ;
public double height ;
public boolean married;
Person(String name,int age,double height,boolean married)
{
this.name = name;
this.age = age;
this.height = height;
this.married = married;
}
}
public class Example
{
public static void main(String[] args)
{
FileOutputStream fos;
fos = new FileOutputStream("c:/data/persons.dat");
try {
ObjectOutputStream oos;
Person person;
oos = new ObjectOutputStream(fos);
person = new Person("Остап Бендер",35,175,false);
oos.writeObject (person);
}
catch(Exception e){
System.out.println(e.getMessage());
}
}
}
Необходимо принимать во внимание, что сериализовать можно только те объекты, которые реализуют интерфейс Serializable. Класс PipedOutputStreamПакет java.io содержит класс PipedOutputStream, который может быть подключен к PipedInputStream, используемый для установления связи между двумя каналами. Данные в PipedOutputStream передаются в потоке Thread, который отправляет их в подключенный PipedInputStream, где данные также читаются, но в другом потоке. То есть, класс PipedOutputStream предназначен для передачи информации между программами через каналы (pipes). Наиболее часто используемые методы класса PipedOutputStream :
Все методы класса могут вызвать исключение IOException. Пример использования класса PipedOutputStream :
import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
public class Example
{
public static void main(String[] args)
{
PipedOutputStream pos = new PipedOutputStream();
PipedInputStream pis = new PipedInputStream();
byte[] bytes = "Hello, World!".getBytes();
try {
// Установление связи между "трубами"
pos.connect(pis);
// Запись данных в PipedOutputStream
for (int i = 0; i < bytes.length; i++)
pos.write(bytes[i]);
// Чтение данных из PipedInputStream
int c;
while((c = pis.read() ) != -1) {
System.out.print((char) c);
}
} catch (IOException ioe) {
System.out.println(ioe);
}
}
}
|
