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

На крайне левой из схемы служебные методы readAllBytes, readAllLines, и write методы, разработанные для простых, общих падежей. Направо от тех методы, используемые, чтобы выполнить итерации по потоку или строкам текста, такой как newBufferedReader, newBufferedWriter, тогда newInputStream и newOutputStream. Эти методы являются взаимодействующими с java.io пакет. Направо от тех методы для того, чтобы иметь дело с ByteChannels, SeekableByteChannels, и ByteBuffers, такой как newByteChannel метод. Наконец, на далеком праве методы то использование FileChannel для усовершенствованных приложений, нуждающихся в захвате файла или вводе-выводе с отображенной памятью.
У этой страницы есть следующие темы:
OpenOptions Параметрjava.io APIByteBuffersOpenOptions ПараметрНесколько из методов в этом разделе берут дополнительное OpenOptions параметр. Этот параметр является дополнительным, и API говорит Вам, что поведение значения по умолчанию для метода, когда ни один не определяется.
Следующий StandardOpenOptions перечисления поддерживаются:
WRITE – Открывает файл для доступа для записи.APPEND – Добавляет новые данные до конца файла. Эта опция используется с WRITE или CREATE опции.TRUNCATE_EXISTING – Усекает файл, чтобы обнулить байты. Эта опция используется с WRITE опция.CREATE_NEW – Создает новый файл и выдает исключение, если файл уже существует.CREATE – Открывает файл, если он существует или создает новый файл, если он не делает.DELETE_ON_CLOSE – Удаляет файл, когда поток закрывается. Эта опция полезна для временных файлов.SPARSE – Подсказки, что недавно создаваемый файл будет редок. Эту усовершенствованную опцию соблюдают на некоторых файловых системах, таких как NTFS, где большие файлы с данными "разрывы" могут храниться более эффективным способом, где те пустые разрывы не используют дисковое пространство.SYNC – Сохраняет файл (и контент и метаданные), синхронизировался с базовым устройством хранения.DSYNC – Сохраняет контент файла синхронизируемым с базовым устройством хранения.Если бы у Вас есть небольшой файл, и требуется считать его все содержание в одной передаче, можно использовать readAllBytes(Path) или метод. Эти методы заботятся о большей части работы для Вас, такой как открытие и закрытие потока, но не предназначаются для того, чтобы обработать большие файлы. Следующий код показывает, как использовать readAllBytes метод:
Path file = ...; byte[] fileArray; fileArray = Files.readAllBytes(file);
Можно использовать один из методов записи, чтобы записать байты, или строки, к файлу.
Следующий фрагмент кода показывает, как использовать a write метод.
Path file = ...; byte[] buf = ...; Files.write(file, buf);
java.nio.file пакет поддерживает ввод-вывод канала, который перемещает данные в буферы, обходя некоторые из уровней, которые могут потоковый ввод-вывод узкого места.
метод открывает файл для того, чтобы читать, возвращаясь 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);
}
Можно использовать метод, чтобы записать в файл, используя 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Чтобы открыть файл для того, чтобы читать, можно использовать метод. Этот метод возвращает небуферизованный входной поток для того, чтобы считать байты из файла.
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);
}
Можно создать файл, добавить к файлу, или записать в файл при использовании метод. Этот метод открывает или создает файл для того, чтобы записать байты и возвращает небуферизованный поток вывода.
Метод берет дополнительное 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В то время как потоковый ввод-вывод читает символ за один раз, ввод-вывод канала читает буфер за один раз. интерфейс обеспечивает основной read и write функциональность. A a ByteChannel у этого есть возможность поддержать позицию в канале и изменить ту позицию. A SeekableByteChannel также поддерживает усечение файла, связанного с каналом и запросами файла для его размера.
Возможность переместить в различные точки в файле и затем чтении от или записать в то расположение делает произвольный доступ файла возможным. См.
Есть два метода для чтения и записи ввода-вывода канала.
newByteChannel методы возвращают экземпляр a SeekableByteChannel. С файловой системой значения по умолчанию можно бросить этот seekable канал байта к a обеспечивая доступ к большему количеству расширенных функций такое отображение области файла непосредственно в память для более быстрого доступа, блокировка области файла, таким образом, другие процессы не могут получить доступ к этому, или читающие и пишущие байты от абсолютной позиции, не влияя на текущую позицию канала. Оба 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 метод, чтобы сделать так. Если Вы не определяете атрибутов, файл создается с атрибутами по умолчанию. Если файл уже существует, 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);
}
Можно также создать новый файл при использовании 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
Определенный формат временного имени файла является определенной платформой.