Вы находитесь на странице: 1из 14

Стандартные средства

ввода-вывода.

java.io
Потоки
Источниками и получателями данных могут быть
 файлы

 сетевые соединения

 блоки памяти

Данные передаются в виде набора байтов.


Абстрактные базовые классы для работы с потоками:
 InputStream

 OutputStream
Основные функции чтения
(класс InputStream)
 int read() – читает и возвращает как int 1 байт, -1=конец потока
 int read(byte[] b) – читает байты в массив из потока, возвращает
их количество
 int read(byte[] b, int offset, int len) – то же самое, но читает
начиная с b[offset] не более len байт
 long skip(long n) - пропустить n байт (вернет фактическое число)

 void mark(int readlimit) – запомнить позицию, помнить о ней


следующие readlimit байт
 void reset() – вернуться на запомненную позицию, при
невозможности – IOException
 boolean markSupported() – доступны ли mark и reset()

 close() – закрывает поток


Основные функции записи
(класс OutputStream)
 void write(int b) – записывает 1 байт в поток
 void write(byte[] b) – записывает все байты из массива в поток
 void write(byte[] b, int off, int len) – то же самое, но пишет
начиная с b[offset] ровно len байт

 void flush() – сохранить буфер (если он есть, то передаётся ОС)


 close() – закрывает поток
Наследники классов
InputStream и OutputStream
 ByteArrayInputStream, ByteArrayOutputStream – работа с
байтовым массивом (чтение/запись данных).

ByteArrayInputStream имеет конструктор


ByteArrayInputStream(byte[] buf)

ByteArrayOutputStream содержит методы toString(), toByteArray()


возвращающие результат в нужной форме

 FileInputStream, FileOutputStream – работа с файлом


Дополнительные возможности java.nio доступны через
функцию FileChannel getChannel().
Потоки-фильтры, наследники
FilterInputStream, FilterOutputStream
Такие потоки добавляют новое поведение к уже
существующим потокам.

 BufferedInputStream, BufferedOutputStream организуют


буферизованный ввод-вывод. Конструкторы
BufferedInputStream(InputStream in, int size)
BufferedOutputStream(OutputStream out, int size)
позволяют указать размер буфера

 DataInputStream, DataOutputStream – двоичный ввод-вывод


различных типов (см. следующий слайд)
 PrintStream – удобный текстовый вывод в байтовый поток или
файл, не Unicode. (cм. PrintWriter)

 Множество других, специфических потоков, например


 javax.crypto.CipherIn(Out)putStream – шифрованный ввод-вывод
 java.util.zip.DeflaterIn(Out)putStream – ввод-вывод со сжатием
DataInputStream,
DataOutputStream
 boolean readBoolean()  float readFloat()
 byte readByte()  int readInt()
 char readChar()  long readLong()
 double readDouble()  short readShort()
 int readUnsignedByte()
 int readUnsignedShort()

 void readFully(byte[] b)
 void readFully(byte[] b, int off, int len)
 String readLine() – читает строку как набор байтов, не Unicode
 String readUTF() – читает строку, UTF-8 с модификацией (!)
 int skipBytes(int n)

 Методы записи аналогичны


Пример

static final String dataFile = "invoicedata";


static final double[] prices = { 19.99, 9.99, 15.99, 3.99, 4.99 };
static final int[] units = { 12, 8, 13, 29, 50 };
static final String[] descs = { "Java T-shirt", "Java Mug", "Duke Juggling
Dolls", "Java Pin", "Java Key Chain”};

DataOutputStream out = new DataOutputStream(


new BufferedOutputStream(new FileOutputStream(dataFile)));

for (int i = 0; i < prices.length; i ++) {


out.writeDouble(prices[i]);
out.writeInt(units[i]);
out.writeUTF(descs[i]);
}
ObjectInputStream, ObjectOutputStream –
хранение сериализованных объектов
 Содержат методы простого двоичного ввода-вывода,
аналогичные Data-Input-Output-Stream

 Object readObject() – считывает сериализуемый объект


 void writeObject(Object obj) – записывает сериализуемый объект
 void writeUnshared(Object obj) – записывает объект без учета его
связи с остальными сохраняемыми объектами

1. Сохраняются и считываются все поля, кроме transient


2. Сохраняются и считываются все объекты по полям-ссылкам, без
повторов в потоке
3. Используется свой стандартный формат хранения классов, если
реализуется интерфейс-маркер Serializable и пользовательские
запись-чтение при реализации интерфейса Externalizable:
void readExternal(ObjectInput in)
void writeExternal(ObjectOutput out)
Пример
FileOutputStream fos = new FileOutputStream("t.tmp");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeInt(12345);
oos.writeObject("Today");
oos.writeObject(new Date());
oos.close();

FileInputStream fis = new FileInputStream("t.tmp");


ObjectInputStream ois = new ObjectInputStream(fis);

int i = ois.readInt();
String today = (String) ois.readObject();
Date date = (Date) ois.readObject();
ois.close();
Символьный ввод-вывод

 Абстрактные классы Reader и Writer аналогичны InputStream и


OutputStream, но работают не с типом byte, а с типом char.
Это обеспечивает простой ввод-вывод в Unicode:
int read(CharBuffer target)
void write(String str)
void write(String str, int off, int len)

 Аналогично доступны FileReader, FileWriter


 Классы для ввода-вывода через строку или массив char[]:
StringReader/StringWriter, CharArrayReader/CharArrayWriter
 Буферизованный ввод-вывод:
BufferedReader / BufferedWrite
Текстовый вывод в поток или файл
с поддержкой кодировок – PrintWriter
 boolean checkError() – flush() + проверка
 void close()
System.out –
 void flush()
тоже PrintStream
 PrintWriter append(char c)
 PrintWriter append(CharSequence csq)
 PrintWriter append(CharSequence csq, int start, int end)

 PrintWriter format(Locale l, String format, Object... args)


 PrintWriter format(String format, Object... args)
 PrintWriter printf(Locale l, String format, Object... args)
 PrintWriter printf(String format, Object... args)

 void print(boolean b),print(char c),print(char[] s),print(double d)


print(float f),print(int i),print(long l),print(Object obj),print(String s)
 такие же void println(…)

 void write(char[] buf),write(char[] buf, int off, int len)


 void write(int c), void write(String s), write(String s, int off, int len)
Конструкторы PrintWriter
 PrintWriter(File file)
 PrintWriter(File file, String csn) – csn = кодировка (charset)
 PrintWriter(OutputStream out)
 PrintWriter(OutputStream out, boolean autoFlush)
 PrintWriter(String fileName)
 PrintWriter(String fileName, String csn)
 PrintWriter(Writer out)
 PrintWriter(Writer out, boolean autoFlush)
Форматирование
System.out.format("%f, %1$+020.10f %n", Math.PI)

Параметр
Со знаком,
№1
с ведущими нулями,
занять 20 символов,
10 после запятой.
тип double (%f)

3.141593, +00000003.1415926536

Вам также может понравиться