Язык программирования Java Андрей Дмитриев ©2009
Часть 10. Система ввода-вывода Введение Обзор пакетов и классов JDK
Содержимое каталога import java.io.*; File aFile = new File("d:" + File.separator + "work"); for (int i = 0; i < aFile.list().length; i++){ println(">>"+aFile.list()[i]); }
java.io.File API(1) boolean canExecute(), boolean canRead(), boolean canWrite() – файловые атрибуты boolean exists() – проверка существования файла String getParent(), File getParentFile() – родительский каталог boolean isFile(), boolean isDirectory() – тип файла
java.io.File API(2) createNewFile() – создание файла mkdir() – создание директории delete() – удаление файла String [] list(), File [] listFiles() – содержимое каталога
Файловые фильтры class DirFilter implements FilenameFilter{ String entry; DirFilter(String entry) { this. entry = entry; } public boolean accept(File dir, String name) { String f = new File(name).getName(); return f.indexOf(entry) != -1; }
Использование фильтра String[] list = aFile.list( new DirFilter(java));
Копирование файла File inFile = new File("infile.dat"); File outFile = new File("outfile.dat"); FileInputStream inStream = new FileInputStream(inFile); FileOutputStream outStream = new FileOutputStream(outFile); int c; while ((c = inStream.read()) != -1) { outStream.write(c); }
InputStream API int available() – количество доступных байтов int read(byte []) – чтение серии байтов в массив void close() – закрытие потока skip(long bytes)
Наследники InputStream(1) FileInputStream(File) – файловый поток данных BufferedInputStream(InputStream) – буферизованный поток данных ByteArrayInputStream(byte []) – байтовый поток данных PipedInputStream(PipedOutputStream) – ассоциирован с входным потоком. Обычно применяется для меж потокового обмена данными ObjectInputStream(InputStream) – чтение стерилизованного объекта
Наследники InputStream(2) FilterInputStream(InputStream) – применяется для изменения данных на лету DataInputStream(InputStream) – работа с примитивными типами данных. Имеет методы: readByte(), readBoolean(), readInt() и т.д. PushbackInputStream(InputStream) – позволяет «вернуть» прочитанные данные обратно в поток StringBufferInputStream(String) - deprecated
OutputStream API write(byte b[]) – запись массива данных в поток flush() – запись всех хранящихся данных методом освобождения внутреннего буфера close() – закрытие потока
Наследники OutputStream(1) FileOutputStream(File) - файловый поток данных FilterOutputStream() - применяется для изменения данных на лету ByteArrayOutputStream(byte []) - байтовый поток данных PipedOutputStream(PipedOutputStream) - – ассоциирован с входным потоком. Обычно применяется для меж потокового обмена данными
Наследники OutputStream(2) DataOuputStream(OutputStream) – работа с примитивными типами данных. Имеет методы: readByte(), readBoolean(), readInt() и т.д. BufferedOutputStream(OutputStream) – буферизованный поток данных PrintStream(OutputStream) – ориентирован на работу с символами, а не с байтами
Reader/Writer Расширение иерархии Мост между байтовыми и символьными потоками Интернационализация
Аналогичные иерархии потоков InputStream OutputStream FileInputStream FileOutputStream PipedInputStream PipedOutputStream Reader Writer FileReader FileWriter PipedReader PipedWriter
RandomAccessFile Предоставляет возможность записи и чтения из определенных частей файла. Подобен массиву во внешнем хранилище. getFilePointer() – текущее положение указателя в файле seek(long pos) – изменение положения указателя length() – доступная длина файла read(byte b[]) – чтение серии байтов write(byte b[]) –запись серии байтов readInt(), readBoolean() и т.д. – чтение значения соответствующего типа writeInt(), writeBoolean() и т.д. – запись значения соответствующего типа
RandomAccessFile(запись) RandomAccessFile rf = new RandomAccessFile("rtest.dat", "rw"); for(int i = 0; i < 10; i++) rf.writeDouble(i*1.414); rf.close(); rf = new RandomAccessFile("rtest.dat", "rw"); rf.seek(5*8); rf.writeDouble( ); rf.close();
RandomAccessFile(чтение) RandomAccessFile rf = new RandomAccessFile("rtest.dat", "r"); for(int i = 0; i < 10; i++){ System.out.println(+rf.readDouble()); } rf.close();
Перенаправление потока PrintWriter out = new PrintWriter(System.out, true); out.println("Hello world"); System.out – класс OutputStream. Эта сущность может быть изменена динамически
Перенаправление потока вывода - копирование файла(1) BufferedInputStream in = new BufferedInputStream( new FileInputStream(test.in)); PrintStream out = new PrintStream( new BufferedOutputStream( new FileOutputStream("test.out"))); //шаблон Декоратор
Перенаправление потока вывода - копирование файла(2) System.setOut(out); System.setErr(out); System.setIn(in); // ассоциируем стандартные потоки с открытыми пользовательскими файлами BufferedReader br = new BufferedReader( new InputStreamReader(System.in)); String s; while((s = br.readLine()) != null) System.out.println(s); out.close();
Компрессия ZipInputStream – поток, распаковывающий данные в формате Zip ZipOutputStream - поток, сжимающий данные в формат Zip GZipInputStream - поток, распаковывающий данные в формате GZIP GZipOutputStream - поток, сжимающий данные в формат GZIP
Правда ли что… InputStream.skip(long n) гарантированно пропускает n байт Классы InputStream и FilterInputStream организованы в паттерн Декоратор