Слайд 2Java Advanced / Ввод-вывод
Содержание
Потоки ввода-вывода
Файловый ввод-вывод и конвертация потоков
Фильтрующие потоки
Дополнительные возможности потоков
Расширенный
ввод-вывод
Дескрипторы файлов
Текстовый ввод
Ввод-вывод и исключения
Заключение
Слайд 3Java Advanced / Ввод-вывод
Ввод-вывод в Java
Потоки ввода-вывода
Пакет java.io
Слайд 5Java Advanced / Ввод-вывод
Виды потоков
Направление
Ввод
Вывод
Содержимое
Байтовые
Символьные
Слайд 6Java Advanced / Ввод-вывод
Классы потоков
Слайд 7Java Advanced / Ввод-вывод
Исключительные ситуации
Класс IOException
Корень иерархии исключений ввода-вывода
Бросается всеми операциями ввода/вывода
Класс
EOFException
Достигнут конец потока
Класс FileNotFoundException
Файл не найден
Класс UnsupportedEncodingException
Неизвестная кодировка
Слайд 8Java Advanced / Ввод-вывод
Потоки ввода
Основные операции
int read() — чтение элемента
read(T[] v), read(T[]
v, off, len) — чтение элементов в массив
Дополнительные операции
skip(n) — пропуск n элементов
close() — закрытие потока
Пометки и возвраты
mark(limit) — пометка текущей позиции
markSupported() – поддерживается ли mark()
reset() — возврат к помеченной позиции
Слайд 9Java Advanced / Ввод-вывод
Потоки вывода
Основные операции
write(int v) — запись элемента
write(T[] v) —
запись массива элементов
write(T[] v, off, len) — запись части массива
Дополнительные операции
flush() — запись буфера
close() — закрытие потока
Слайд 10Java Advanced / Ввод-вывод
Пример: ?
?
void copy(InputStream is, OutputStream os)
throws IOException
{
byte[]
b = new byte[1024];
int c = 0;
while ((c = is.read(b)) >= 0) {
os.write(b, 0, c);
}
}
Слайд 11Файловый ввод-вывод и конвертация потоков
Часть 2
Слайд 12Java Advanced / Ввод-вывод
Классы файлового ввода-вывода
Классы File*
FileInputStream
FileOutputStream
FileReader
FileWriter
Слайд 13Java Advanced / Ввод-вывод
Создание файловых потоков
Для символьных потоков используется кодировка по умолчанию
Для
ввода/вывода
File*(File file) — по дескриптору
File*(String file) — по имени
Для дописывания
File*(File file, boolean append) — по дескриптору
File*(String file, boolean append) — по имени
Слайд 14Java Advanced / Ввод-вывод
Пример: ?
?
Reader reader = new FileReader("input.txt");
Writer writer = new
FileWriter("output.txt");
int c = 0;
while ((c = reader.read()) >= 0) {
writer.write(Character.toUpperCase((char) c));
}
reader.close();
writer.close();
Слайд 15Java Advanced / Ввод-вывод
Байтовый поток ? символьный
При чтении возможно преобразование байтового
потока в символьный, с указанием кодировки
Класс InputStreamReader
InputStreamReader(InputStream, encoding?)
Слайд 16Java Advanced / Ввод-вывод
Символьный поток ? байтовый
При записи возможно преобразование символьного потока
в байтовый, с указанием кодировки
Класс OutputStreamWriter
OutputStreamWriter(OutputStream, encoding?)
Слайд 17Java Advanced / Ввод-вывод
Пример: ?
?
Reader reader = new InputStreamReader(
new FileInputStream("input.txt"), "Cp1251");
Writer
writer = new OutputStreamWriter(
new FileOutputStream("output.txt"), "Cp866");
int c = 0;
while ((c = reader.read()) >= 0) {
writer.write(c);
}
reader.close();
writer.close();
Слайд 18Дополнительные возможности потоков
Часть 4
Слайд 19Java Advanced / Ввод-вывод
Эмуляция чтения
Чтение производится из буфера в памяти, передаваемого конструктору
Классы
ByteArrayInputStream
– чтение из массива байт
CharArrayReader – чтение из массива символов
StringReader – чтение из строки
Слайд 20Java Advanced / Ввод-вывод
Эмуляция записи
Запись производится в буфер в памяти, который доступен
в любое время
Классы
ByteArrayOutputStream – запись в массив байт (toByteArray())
CharArrayWriter – запись в массив символов (toString(), toCharArray())
StringWriter – запись в StringBuffer (toString(), toStringBuffer())
Слайд 21Java Advanced / Ввод-вывод
Конкатенация потоков
Несколько байтовых потоков можно конкатенировать
Если первый из потоков
закончился, производится чтение из второго и т.д.
Класс SequenceInputStream
SequenceInputStream(InputStream, InputStream) – конкатенация двух потоков
SequenceInputStream(Enumeration) – конкатенация нескольких потоков
Слайд 22Java Advanced / Ввод-вывод
Вывод с подавлением ошибок
Вывод осуществляется построчно, с подавлением ошибок
Класс
PrintStream, PrintWriter
checkError() – проверить, была ли ошибка
print(…) – запись без перевода строки
println(…) – запись с переводом строки
System.out – это PrintStream
Слайд 24Java Advanced / Ввод-вывод
Расширенная запись данных
Платформонезависимая запись примитивных типов и строк
Интерфейс DataOutput
writeT(T)
– запись примитивных типов
writeUTF() – запись строки в кодировке UTF-8
Кодировка модифицирована!
Реализация
DataOutputStream
Слайд 25Java Advanced / Ввод-вывод
Расширенное чтение данных
Платформонезависимое чтение примитивных типов и строк
Интерфейс DataInput
T
readT() – чтение примитивных типов
readUnsignedByte() / readUnsignedShort() – чтение беззнаковых целых
readUTF() – чтение строки в кодировке UTF-8
Реализация
DataInputStream
Слайд 26Java Advanced / Ввод-вывод
Файлы c произвольным доступом
Класс RandomAccessFile
Реализует DataInput, DataOutput
Конструктор
RandomAccessFile(file, mode) –
открыть файл в заданном режиме
Слайд 27Java Advanced / Ввод-вывод
Дополнительные операции
Методы
length() – получить размер файла
setLength() – установить
размер файла
getFilePointer() – получить положение указателя
seek(long) – установить положения указателя
Слайд 29Java Advanced / Ввод-вывод
Scanner
Scanner позволяет читать значения примитивных типов и строки из
текстовых источников
Входные данные – интерпретируются как текст
Readable
InputStream [charset]
File [charset]
String
Слайд 30Java Advanced / Ввод-вывод
Scanner – разделители
Входные данные текст:
«123 abc -22»
– число, пробел,
строка, пробел, число
Текстовые данные разделяются с помощью разделителя (delimiter)
delimiter()
useDelimiter()
по умолчанию – «whitespace»
пробелы
табуляции
переводы строк
Слайд 31Java Advanced / Ввод-вывод
Scanner – чтение строк
Методы чтения строк
next() – следующая строка,
отделенная разделителем
hasNext()
NoSuchElementException
Реализует Iterator
nextLine() – считать символы до конца строки
hasNextLine()
Слайд 32Java Advanced / Ввод-вывод
Scanner – чтение примитивов
T nextT() – чтение значений примитивного
типа
сначала считывается текст до разделителя
затем этот текст преобразуется в значение примитивного типа
InputMismatchException
nextT(int radix) – чтение данных в системе счисления с заданным основанием
nextByte(), nextShort(), nextInt(), nextLong(), nextBigInteger()
Слайд 33Java Advanced / Ввод-вывод
Scanner – ?
Scanner scanner =
new Scanner("123 a -5\n
abc 12a 546 df");
while (scanner.hasNext()) {
if (!scanner.hasNextInt()) {
scanner.next();
} else {
System.out.println(scanner.nextInt());
}
}
Слайд 34Java Advanced / Ввод-вывод
Scanner – другие методы
Кодировки
locale()
useLocale()
Система счисления
radix()
useRadix()
Исключения
IOException подавляется
ioException() – последнее исключение
ввода-вывода, null, если исключения не было
Слайд 36Java Advanced / Ввод-вывод
Дескрипторы файлов
Позволяют осуществлять манипуляции с файлами
Класс File
Создание дескриптора по
имени
File(pathname) – абсолютный или относительный путь
В дескриптора по имени и директории
File(File dir, name)
File(String dir, name)
Слайд 37Java Advanced / Ввод-вывод
Разделители
separator / separtorChar – платформозависимый разделитель директорий
pathSeparator / pathSeparatorChar
– платформозависимый разделитель в файлов и директорий в путях
Слайд 38Java Advanced / Ввод-вывод
Операции с дескрипторами
Получение информации
getName() – имя
getPath() – путь
getAbsolutePath() –
абсолютный путь
getAbsoluteFile() – абсолютный дескриптор
getCanonicalPath() – канонический путь
getCanonicalFile() – канонический дескриптор
Определение родителя
String getParent() – как строки
File getParentFile() – как дескриптора
Слайд 39Java Advanced / Ввод-вывод
Операции с файлами (1)
Проверка типа
isFile() – является ли файлом
isDirectory()
– является ли директорией
isHidden() – является ли скрытым
Получение информации о файле
exist() – проверка существования
length() – длина файла
lastModified() – время последней модификации
Слайд 40Java Advanced / Ввод-вывод
Операции с файлами (2)
Создание
mkdir() – создать одну директорию
mkdirs() –
создать все директории
createNewFile() – создать пустой файл
Удаление
delete() – удалить немедленно
deleteOnExit() – удалить после завершения
Переименование / перенос
renameTo(file) – переименовать / перенести в заданное место
Слайд 41Java Advanced / Ввод-вывод
Листинг директории
Листинг всех файлов
String[] list() – получить имена файлов
File[]
listFiles() – получить дескрипторы файлов
Листинг по критерию
String[] list(FileNameFilter) – получить имена файлов
File[] listFiles(FileFilter) – получить дескрипторы файлов
Слайд 43Java Advanced / Ввод-вывод
Обычная обработка исключений
Reader reader = new FileReader("input.txt");
try {
//
Операции с файлом
} finally {
if (reader != null) {
reader.close();
}
}
Слайд 44Java Advanced / Ввод-вывод
Надежная обработка исключений
Reader reader = new FileReader("input.txt");
try {
//
Операции с файлом
reader.close();
} catch (IOException e) {
try {
reader.close();
} catch (IOException e) { /* Ignoring */ }
throw e;
}
Слайд 45Java Advanced / Ввод-вывод
Альтернативный метод
Reader reader = null;
try {
reader = new
FileReader("input.txt");
…
} finally {
if (reader != null) {
reader.close();
}
}
Слайд 46Java Advanced / Ввод-вывод
Случай нескольких потоков
Reader reader = new FileReader("input.txt");
try {
Writer
writer = new FileWriter("output.txt");
try {
// Операции ввода-вывода
...
} finally {
writer.close();
}
} finally {
reader.close();
}
Слайд 48Java Advanced / Ввод-вывод
Ссылки
I/O tutorial // http://java.sun.com/docs/books/tutorial/essential/io/index.html
I/O in Java 2 Platform //
http://java.sun.com/j2se/1.5.0/docs/guide/io/