След: Существенные Классы
Урок: Основной ввод-вывод
Раздел: Файловый ввод-вывод (Обладающий NIO.2)
Чтение, при Записи, и Создавая Файлы
Домашняя страница > Существенные Классы > Основной ввод-вывод

Чтение, при Записи, и Создавая Файлы

Эта страница обсуждает детали чтения, записи, создания, и вводных файлов. Есть огромное количество методов файлового ввода-вывода, чтобы выбрать из. Чтобы помочь понять API, следующая схема располагает методы файлового ввода-вывода сложностью.

Рисунок строки с методами файлового ввода-вывода, расположенными от наименее сложного (слева) к самому сложному (справа).

Методы Файлового ввода-вывода, Расположенные от Менее сложного до Более сложного

На крайне левой из схемы служебные методы readAllBytes, readAllLines, и write методы, разработанные для простых, общих падежей. Направо от тех методы, используемые, чтобы выполнить итерации по потоку или строкам текста, такой как newBufferedReader, newBufferedWriter, тогда newInputStream и newOutputStream. Эти методы являются взаимодействующими с java.io пакет. Направо от тех методы для того, чтобы иметь дело с ByteChannels, SeekableByteChannels, и ByteBuffers, такой как newByteChannel метод. Наконец, на далеком праве методы то использование FileChannel для усовершенствованных приложений, нуждающихся в захвате файла или вводе-выводе с отображенной памятью.


Отметьте: методы для того, чтобы создать новый файл позволяют Вам определить дополнительный набор начальных атрибутов для файла. Например, на файловой системе, которая поддерживает набор POSIX стандартов (таких как UNIX), можно определить владельца файла, группового владельца, или полномочия файла в то время, когда файл создается. Управляющая страница Метаданных объясняет атрибуты файла, и как получить доступ и установить их.

У этой страницы есть следующие темы:


OpenOptions Параметр

Несколько из методов в этом разделе берут дополнительное OpenOptions параметр. Этот параметр является дополнительным, и API говорит Вам, что поведение значения по умолчанию для метода, когда ни один не определяется.

Следующий StandardOpenOptions перечисления поддерживаются:


Обычно Используемые Методы для Маленьких Файлов

Чтение Всех Байтов или Строк от Файла

Если бы у Вас есть небольшой файл, и требуется считать его все содержание в одной передаче, можно использовать readAllBytes(Path) или readAllLines(Path, Charset) метод. Эти методы заботятся о большей части работы для Вас, такой как открытие и закрытие потока, но не предназначаются для того, чтобы обработать большие файлы. Следующий код показывает, как использовать readAllBytes метод:

Path file = ...;
byte[] fileArray;
fileArray = Files.readAllBytes(file);

Запись Всех Байтов или Строк к Файлу

Можно использовать один из методов записи, чтобы записать байты, или строки, к файлу.

Следующий фрагмент кода показывает, как использовать a write метод.

Path file = ...;
byte[] buf = ...;
Files.write(file, buf);


Буферизованные Методы ввода-вывода для Текстовых файлов

java.nio.file пакет поддерживает ввод-вывод канала, который перемещает данные в буферы, обходя некоторые из уровней, которые могут потоковый ввод-вывод узкого места.

Чтение Файла при использовании Буферизованного Потокового ввода-вывода

newBufferedReader(Path, Charset) метод открывает файл для того, чтобы читать, возвращаясь a BufferedReader это может использоваться, чтобы считать текст из файла эффективным способом.

Следующий фрагмент кода показывает, как использовать newBufferedReader метод, чтобы читать из файла. Файл кодируется в "US-ASCII".

Charset charset = Charset.forName("US-ASCII");
try (BufferedReader reader = Files.newBufferedReader(file, charset)) {
    String line = null;
    while ((line = reader.readLine()) != null) {
        System.out.println(line);
    }
} catch (IOException x) {
    System.err.format("IOException: %s%n", x);
}

Запись Файла при использовании Буферизованного Потокового ввода-вывода

Можно использовать newBufferedWriter(Path, Charset, OpenOption...) метод, чтобы записать в файл, используя a BufferedWriter.

Следующий фрагмент кода показывает, как создать файл, закодированный в "US-ASCII", используя этот метод:

Charset charset = Charset.forName("US-ASCII");
String s = ...;
try (BufferedWriter writer = Files.newBufferedWriter(file, charset)) {
    writer.write(s, 0, s.length());
} catch (IOException x) {
    System.err.format("IOException: %s%n", x);
}

Методы для Небуферизованных Потоков и Взаимодействующий с java.io API

Чтение Файла при использовании Потокового ввода-вывода

Чтобы открыть файл для того, чтобы читать, можно использовать newInputStream(Path, OpenOption...) метод. Этот метод возвращает небуферизованный входной поток для того, чтобы считать байты из файла.

Path file = ...;
try (InputStream in = Files.newInputStream(file);
    BufferedReader reader =
      new BufferedReader(new InputStreamReader(in))) {
    String line = null;
    while ((line = reader.readLine()) != null) {
        System.out.println(line);
    }
} catch (IOException x) {
    System.err.println(x);
}

Создание и Запись Файла при использовании Потокового ввода-вывода

Можно создать файл, добавить к файлу, или записать в файл при использовании newOutputStream(Path, OpenOption...) метод. Этот метод открывает или создает файл для того, чтобы записать байты и возвращает небуферизованный поток вывода.

Метод берет дополнительное OpenOption параметр. Если никакие открытые опции не определяются, и файл не существует, новый файл создается. Если файл существует, это является усеченным. Эта опция эквивалентна вызову метода с CREATE и TRUNCATE_EXISTING опции.

Следующий фрагмент кода открывает файл журнала. Если файл не существует, он создается. Если файл существует, он открывается для того, чтобы добавить.

import static java.nio.file.StandardOpenOption.*;

Path logfile = ...;

// Convert the string to a
// byte array.
String s = ...;
byte data[] = s.getBytes();

try (OutputStream out = new BufferedOutputStream(
                 logfile.newOutputStream(CREATE, APPEND))) {
    ...
    out.write(data, 0, data.length);
} catch (IOException x) {
    System.err.println(x);
}

Методы для Каналов и ByteBuffers

Чтение и Запись Файлов при использовании ввода-вывода Канала

В то время как потоковый ввод-вывод читает символ за один раз, ввод-вывод канала читает буфер за один раз. ByteChannel интерфейс обеспечивает основной read и write функциональность. A SeekableByteChannel a ByteChannel у этого есть возможность поддержать позицию в канале и изменить ту позицию. A SeekableByteChannel также поддерживает усечение файла, связанного с каналом и запросами файла для его размера.

Возможность переместить в различные точки в файле и затем чтении от или записать в то расположение делает произвольный доступ файла возможным. См. Файлы Произвольного доступа для получения дополнительной информации.

Есть два метода для чтения и записи ввода-вывода канала.


Отметьте: newByteChannel методы возвращают экземпляр a SeekableByteChannel. С файловой системой значения по умолчанию можно бросить этот seekable канал байта к a FileChannel обеспечивая доступ к большему количеству расширенных функций такое отображение области файла непосредственно в память для более быстрого доступа, блокировка области файла, таким образом, другие процессы не могут получить доступ к этому, или читающие и пишущие байты от абсолютной позиции, не влияя на текущую позицию канала.

Оба newByteChannel методы позволяют Вам определить список OpenOption опции. Те же самые открытые опции, используемые newOutputStream методы поддерживаются, в дополнение к еще одной опции: READ требуется потому что SeekableByteChannel поддерживает и чтение и запись.

Определение READ открывает канал для того, чтобы читать. Определение WRITE или APPEND открывает канал для того, чтобы записать. Если ни одна из этих опций не определяется, канал открывается для того, чтобы читать.

Следующий фрагмент кода читает файл и печатает его к стандартному выводу:

// Defaults to READ
try (SeekableByteChannel sbc = Files.newByteChannel(file)) {
    ByteBuffer buf = ByteBuffer.allocate(10);

    // Read the bytes with the proper encoding for this platform.  If
    // you skip this step, you might see something that looks like
    // Chinese characters when you expect Latin-style characters.
    String encoding = System.getProperty("file.encoding");
    while (sbc.read(buf) > 0) {
        buf.rewind();
        System.out.print(Charset.forName(encoding).decode(buf));
        buf.flip();
    }
} catch (IOException x) {
    System.out.println("caught exception: " + x);

Следующий фрагмент кода, записанный для UNIX и других файловых систем POSIX, создает файл журнала с определенным набором полномочий файла. Этот код создает файл журнала или добавляет к файлу журнала, если это уже существует. Файл журнала создается с полномочиями чтения-записи для владельца и полномочиями только для чтения для группы.

import static java.nio.file.StandardCopyOption.*;

// Create the set of options for appending to the file.
Set<OpenOptions> options = new HashSet<OpenOption>();
options.add(APPEND);
options.add(CREATE);

// Create the custom permissions attribute.
Set<PosixFilePermission> perms =
    PosixFilePermissions.fromString("rw-r------");
FileAttribute<Set<PosixFilePermission>> attr =
    PosixFilePermissions.asFileAttribute(perms);

// Convert the string to a ByteBuffer.
String s = ...;
byte data[] = s.getBytes();
ByteBuffer bb = ByteBuffer.wrap(data);

try (SeekableByteChannel sbc = Files.newByteChannel(file, options, attr)) {
    sbc.write(bb);
} catch (IOException x) {
    System.out.println("exception thrown: " + x);
}

Методы для Создания Регулярных и Временных Файлов

Создание Файлов

Можно создать пустой файл с начальным набором атрибутов при использовании createFile(Path, FileAttribute<?>) метод. Например, если, во время создания, Вы хотите, чтобы у файла был определенный набор полномочий файла, используйте createFile метод, чтобы сделать так. Если Вы не определяете атрибутов, файл создается с атрибутами по умолчанию. Если файл уже существует, createFile выдает исключение.

В единственной атомарной работе, createFile метод проверяет на существование файла и создает тот файл с указанными атрибутами, который делает процесс более безопасным против вредоносного кода.

Следующий фрагмент кода создает файл с атрибутами по умолчанию:

Path file = ...;
try {
    // Create the empty file with default permissions, etc.
    Files.createFile(file);
} catch (FileAlreadyExistsException x) {
    System.err.format("file named %s" +
        " already exists%n", file);
} catch (IOException x) {
    // Some other sort of failure, such as permissions.
    System.err.format("createFile error: %s%n", x);
}

У Полномочий Файла POSIX есть пример, который использует createFile(Path, FileAttribute<?>) создать файл с предварительно установленными полномочиями.

Можно также создать новый файл при использовании newOutputStream методы, как описано в Создании и Записи Файла, используя Потоковый ввод-вывод. Если Вы открываете новый поток вывода и сразу закрываете его, пустой файл создается.

Создание Временных Файлов

Можно создать временный файл, используя один из следующих createTempFile методы:

Первый метод позволяет коду определять каталог для временного файла, и второй метод создает новый файл в каталоге временного файла значения по умолчанию. Оба метода позволяют Вам определять суффикс для имени файла, и первый метод позволяет Вам также определять префикс. Следующий фрагмент кода дает пример второго метода:

try {
    Path tempFile = Files.createTempFile(null, ".myapp");
    System.out.format("The temporary file" +
        " has been created: %s%n", tempFile)
;
} catch (IOException x) {
    System.err.format("IOException: %s%n", x);
}

Результат петляния был бы чем-то как следующее:

The temporary file has been created: /tmp/509668702974537184.myapp

Определенный формат временного имени файла является определенной платформой.


Проблемы с примерами? Попытайтесь Компилировать и Выполнить Примеры: FAQ.
Жалобы? Поздравление? Предложения? Дайте нам свою обратную связь.

Предыдущая страница: Управление Метаданными (Хранилище файлов и Атрибуты Хранилища файлов)
Следующая страница: Файлы Произвольного доступа



Spec-Zone.ru - all specs in one place