Технологии Java

Структура курса

Структура

  • Лекции
  • Домашние задания
  • Практика
  • Зачет

Практика и баллы

  • Версии
    • Простая M3232−35
    • Сложная M3236−39
  • Модификации
  • Задержка
    • Не более 3 недель
  • Минусы
    • Не горят
  • Бонусы
    • Первому сдавшему
    • Нашедшим ошибки/опечатки

Содержание

  • База
    • Ввод-вывод
    • Коллекции
    • Потоки
    • Рефлексия
  • Инструментарий
  • Многопоточное программирование
  • Сетевые приложения
  • Разное
    • Интернационализация и локализация
    • Сборка мусора

Ввод-вывод в Java

  • Потоки ввода-вывода
  • Пакет java.io
    • Потоки ввода-вывода
    • Дескрипторы файлов
  • Пакет java.nio
    • Асинхронный ввод-вывод
  • Пакет java.nio.file
    • Дескрипторы путей
    • Новый (7+) API для управления файлами

Виды потоков

  • Направление
    • Ввод
    • Вывод
  • Содержимое

Исключительные ситуации

  • Класс IOException
    • Корень иерархии исключений ввода-вывода
    • Бросается всеми операциями ввода/вывода
  • Класс EOFException
    • Попытка чтения после конца потока
  • Класс FileNotFoundException
    • Файл не найден
  • Класс UnsupportedEncodingException
    • Неизвестная кодировка

Потоки ввода

Пометки и возвраты

  • Проверка поддержки
  • Операции
    • mark(limit) — пометка текущей позиции
    • reset() — возврат к помеченной позиции

Потоки вывода

Пример: Блочное копирование

void copy(InputStream is, OutputStream os)
    throws IOException
{
    byte[] b = new byte[1 << 16];
    int c = 0;
    while ((c = is.read(b)) >= 0) {
        os.write(b, 0, c);
    }
}

Классы файлового ввода-вывода

Создание файловых потоков

Пример: преобразование регистра

  • Файл input.txt копируется в output.txt с изменением регистра
    • try (
          Reader reader = new FileReader("input.txt",
              StandardCharsets.UTF_8);
          Writer writer = new FileWriter("output.txt",
              StandardCharsets.UTF_8);
      ) {
          int c = 0;
          while ((c = reader.read()) >= 0) {
              writer.write(Character.toUpperCase((char) c));
          }
      }
      

Байтовый ⇒ символьный

Символьный ⇒ байтовый

Пример: перекодирование файла

  • Файл input.txt копируется в output.txt с изменением кодировки с Cp1251 на Cp866
    • try (
          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);
          }
      }
      

Фильтрующие потоки

  • Направляют все вызовы вложенному потоку
  • Классы Filter*

Пример: «шифрующий» поток

  • public class EncodingOutputStream
            extends FilterOutputStream {
        private final int key;
        public EncodingOutputStream(
                OutputStream os, int key) {
            super(os);
            this.key = key;
        }
        public void write(int b) throws IOException {
            super.write(b ^ key);
        }
    }
    

Буферизующие потоки

  • Содержат буфер, который считывают / записывают целиком
  • Классы Buffered*

Чтение с возвратом

  • Позволяют “возвращать” в поток элементы, которые затем будут “прочитаны”
  • Классы Pushback*

Эмуляция чтения

Эмуляция записи

Пустые потоки

Конкатенация потоков

Вывод с подавлением ошибок

Ввод с подсчетом строк

Консольный ввод-вывод

Символьная консоль

Порядок байт

  • Какие байты будут выведены при записи числа 0x12345678?
    • Зависит от системы
  • Возможные варианты:
    • 78, 56, 34, 12 – little-endian (x86)
    • 12, 34, 56, 78 – big-endian (network byte order)
    • 34, 12, 78, 56 – mixed-endian (PDP-11)
  • Требуется зафиксировать порядок
    • big-endian

Запись

Чтение

Файлы c произвольным доступом

  • Класс RandomAccessFile
    • Реализует DataInput, DataOutput
    • RandomAccessFile(file, mode) – открыть файл в заданном режиме
      Строка Режим
      rЧтение
      rwЧтение и запись
      rwdСинхронные чтение и запись
      rwsСинхронные чтение и запись (+метаданные)

Навигация по файлу

  • Методы
    • length() – получить размер файла
    • setLength(long) – установить размер файла
    • getFilePointer() – получить положение указателя
    • seek(long) – установить положение указателя
    • skipBytes(int) – пропустить байты

Дескрипторы файлов

Разделители

Операции с дескрипторами

Операции с файлами (1)

  • Проверка типа
    • isFile() – является ли файлом
    • isDirectory() – является ли директорией
    • isHidden() – является ли скрытым
  • Получение информации о файле
    • exists() – проверка существования
    • length() – длина файла
    • lastModified() – время последней модификации

Операции с файлами (2)

  • Создание
    • mkdir() – создать одну директорию
    • mkdirs() – создать все директории
    • createNewFile() – создать пустой файл
  • Удаление
    • delete() – удалить немедленно
    • deleteOnExit() – удалить после завершения
  • Переименование / перенос
    • renameTo(file) – переименовать / перенести в заданное место

Листинг директории

Права доступа к файлам

Информация о файловых системах

Новые возможности

  • Пакет java.nio.file
    • Управление файлами
    • Path – описание путей
    • Files – действия над файлами
  • Пакет java.nio.file.attribute
    • Управление доступом

Пути

Информация о путях

Операции с файлами (1)

Операции с файлами (2)

Операции с файлами (3)

Чтение файлов

Запись файлов

Операции с каталогами

Обход дерева файлов

Другие возможности

Автоматическое закрытие

  • Try-with-resources
    try (Reader reader = new FileReader("in.txt")) {
        // Операции с файлом
    }
    // Ресурс автоматически закрывается
    

Обычная обработка исключений

  • Reader reader = new FileReader("input.txt");
    try {
        // Операции с файлом
    } finally {
        reader.close();
    }
    

Альтернативный метод

  • Не рекомендуется
    Reader reader = null;
    try {
        reader = new FileReader("input.txt");
        …
    } finally {
        if (reader != null) {
            reader.close();
        }
    }
    

Гарантированное закрытие

  • С возвратом исходной ошибки
    Reader reader = new FileReader("input.txt");
    try {
         // Операции с файлом
        reader.close();
    } catch (IOException e) {
        try {
            reader.close();
        } catch (IOException ignored) {}
        throw e;
    }
    

Случай нескольких потоков (1)

  • Reader reader = new FileReader("input.txt");
    try {
        Writer writer = new FileWriter("output.txt");
        try {
            // Операции ввода-вывода
        } finally {
            writer.close();
        }
    } finally {
        reader.close();
    }
    

Случай нескольких потоков (2)

try (
    Reader reader = new FileReader("input.txt");
    Writer writer = new FileWriter("output.txt");
) {
    // Операции ввода-вывода
}

Подавление исключений

Осталось за кадром

  • Сериализация
    • Сохранение состояния объекта в бинарной форме
    • Будет позднее
  • NIO
    • Асинхронный ввод-вывод
    • Будет позднее
  • Security (видимо, удалят)
    • Управление доступом в JVM
    • Планируют убрать
  • Piped Streams
    • Для многопоточных программ

Ссылки

Вопросы

???