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