Java, осень 2014: Ввод-вывод, доступ к файловой системе

37
Ввод/вывод, доступ к файловой системе Алексей Владыкин 13 октября 2014 Алексей Владыкин Ввод/вывод 13 октября 2014 1 / 37

description

Классы: java.io.File и java.nio.file.* Потоки байт: InputStream, OutputStream. Потоки символов: Reader, Writer. java.io.StreamTokenizer и java.util.Scanner.

Transcript of Java, осень 2014: Ввод-вывод, доступ к файловой системе

Page 1: Java, осень 2014: Ввод-вывод, доступ к файловой системе

Ввод/вывод, доступ к файловой системе

Алексей Владыкин

13 октября 2014

Алексей Владыкин Ввод/вывод 13 октября 2014 1 / 37

Page 2: Java, осень 2014: Ввод-вывод, доступ к файловой системе

1 Доступ к файловой системе

2 Потоки байт

3 Потоки символов

4 NIO

5 Когда Java не хватает

Алексей Владыкин Ввод/вывод 13 октября 2014 2 / 37

Page 3: Java, осень 2014: Ввод-вывод, доступ к файловой системе

Доступ к файловой системе

Алексей Владыкин Ввод/вывод 13 октября 2014 3 / 37

Page 4: Java, осень 2014: Ввод-вывод, доступ к файловой системе

Доступ к файловой системе java.io.File

java.io.File

Представляет файл или директорию

Файл идентифицируется путем, специфичным для ОС/ФС\\server\share\C:\Program Files\Java/usr/bin/ls

Алексей Владыкин Ввод/вывод 13 октября 2014 4 / 37

Page 5: Java, осень 2014: Ввод-вывод, доступ к файловой системе

Доступ к файловой системе java.io.File

Работа с путями

File java = new File("/usr/bin/java");java.isAbsolute (); // truejava.getPath (); // "/usr/bin/java"java.getName (); // "java"java.getParent (); // "/usr/bin"

Файла по этому пути может не бытьПоддерживаются абсолютные и относительные пути

Алексей Владыкин Ввод/вывод 13 октября 2014 5 / 37

Page 6: Java, осень 2014: Ввод-вывод, доступ к файловой системе

Доступ к файловой системе java.io.File

Работа с путями

String getPath()

String getAbsolutePath()

String getCanonicalPath()

Алексей Владыкин Ввод/вывод 13 октября 2014 6 / 37

Page 7: Java, осень 2014: Ввод-вывод, доступ к файловой системе

Доступ к файловой системе java.io.File

Работа с файлами

File java = new File("/usr/bin/java");java.exists (); // truejava.isFile (); // truejava.canRead (); // truejava.length (); // 1536java.lastModified ();// 1231914805000

Если файла нет, length() и lastModified() возвращают 0

Алексей Владыкин Ввод/вывод 13 октября 2014 7 / 37

Page 8: Java, осень 2014: Ввод-вывод, доступ к файловой системе

Доступ к файловой системе java.io.File

Работа с директориями

File usrbin = new File("/usr/bin");usrbin.exists (); // trueusrbin.isDirectory (); // trueusrbin.list (); // array of Stringsusrbin.listFiles (); // array of Files

Если директория не существует, list() вернет null

Есть list() и listFiles() с фильтром

Алексей Владыкин Ввод/вывод 13 октября 2014 8 / 37

Page 9: Java, осень 2014: Ввод-вывод, доступ к файловой системе

Доступ к файловой системе java.io.File

Модификация файловой системы

boolean createNewFile()

boolean delete()

boolean renameTo(File dest)

boolean mkdir()boolean mkdirs()

Алексей Владыкин Ввод/вывод 13 октября 2014 9 / 37

Page 10: Java, осень 2014: Ввод-вывод, доступ к файловой системе

Доступ к файловой системе java.nio.file.*

java.nio.file.*

Новый API для работы с файловой системой (aka NIO.2)

Добавлен в Java 7

Покрывает всю функциональность java.io.File

Более стройный API, а также более широкие возможности (работасо ссылками, с атрибутами файлов, отслеживание изменений)

Алексей Владыкин Ввод/вывод 13 октября 2014 10 / 37

Page 11: Java, осень 2014: Ввод-вывод, доступ к файловой системе

Доступ к файловой системе java.nio.file.*

Центральная сущность — java.nio.file.Path — представляетпуть в файловой системе

Доступ к файловой системе обеспечивает классjava.nio.file.Files

Алексей Владыкин Ввод/вывод 13 октября 2014 11 / 37

Page 12: Java, осень 2014: Ввод-вывод, доступ к файловой системе

Доступ к файловой системе java.nio.file.*

Работа с путями

Path java = Paths.get("/usr/bin/java");java.isAbsolute (); // truejava.toString (); // /usr/bin/javajava.getFileName (); // javajava.getParent (); // /usr/binjava.getNameCount (); // 3java.getName (1); // bin

Основные операции с путями реализованы, не надо вручнуювозиться с разными разделителями на разных ОС/ФС

Алексей Владыкин Ввод/вывод 13 октября 2014 12 / 37

Page 13: Java, осень 2014: Ввод-вывод, доступ к файловой системе

Доступ к файловой системе java.nio.file.*

Работа с файлами

Path java = Paths.get("/usr/bin/java");Files.exists(java); // trueFiles.isRegularFile(java); // trueFiles.isReadable(java); // trueFiles.size(java); // 1536Files.getLastModifiedTime(java)

.toMillis (); // 1231914805000

Если файла нет, size() и getLastModifiedTime() бросаютNoSuchFileException

Алексей Владыкин Ввод/вывод 13 октября 2014 13 / 37

Page 14: Java, осень 2014: Ввод-вывод, доступ к файловой системе

Доступ к файловой системе java.nio.file.*

Работа с директориями

Path usrbin = Paths.get("/usr/bin");Files.exists(usrbin ); // trueFiles.isDirectory(usrbin ); // true

try (DirectoryStream <Path > dirStream =Files.newDirectoryStream(usrbin )) {

for (Path child : dirStream) {System.out.println(child);

}}

Если директория не существует,newDirectoryStream() бросит NoSuchFileExceptionЕсть вариант с фильтром

Алексей Владыкин Ввод/вывод 13 октября 2014 14 / 37

Page 15: Java, осень 2014: Ввод-вывод, доступ к файловой системе

Доступ к файловой системе java.nio.file.*

Модификация файловой системы

Path createFile(Path path)

void delete(Path path)

Path move(Path source, Path target)Path copy(Path source, Path target)

Path createDirectory(Path dir)Path createDirectories(Path dir)

Алексей Владыкин Ввод/вывод 13 октября 2014 15 / 37

Page 16: Java, осень 2014: Ввод-вывод, доступ к файловой системе

Потоки байт

Алексей Владыкин Ввод/вывод 13 октября 2014 16 / 37

Page 17: Java, осень 2014: Ввод-вывод, доступ к файловой системе

Потоки байт

Ввод данныхjava.io.InputStream

Вывод данныхjava.io.OutputStream

Производные классы для конкретных случаев

Бросают java.io.IOException в случае ошибок

Алексей Владыкин Ввод/вывод 13 октября 2014 17 / 37

Page 18: Java, осень 2014: Ввод-вывод, доступ к файловой системе

Потоки байт Ввод данных

java.io.InputStream

int read()

int read(byte b[])int read(byte b[], int off, int len)

void close()

Алексей Владыкин Ввод/вывод 13 октября 2014 18 / 37

Page 19: Java, осень 2014: Ввод-вывод, доступ к файловой системе

Потоки байт Ввод данных

java.io.InputStream — подклассы

java.io.FileInputStream

new FileInputStream(new File("input.data"))

java.io.ByteArrayInputStream

new ByteArrayInputStream(new byte[] {1, 2, 3})

java.io.DataInputStream

new DataInputStream(anotherInputStream)

java.util.zip.DeflaterInputStream

new DeflaterInputStream(anotherInputStream)

Алексей Владыкин Ввод/вывод 13 октября 2014 19 / 37

Page 20: Java, осень 2014: Ввод-вывод, доступ к файловой системе

Потоки байт Вывод данных

java.io.OutputStream

void write(int b)

void write(byte b[])void write(byte b[], int off, int len)

void flush()

void close()

Алексей Владыкин Ввод/вывод 13 октября 2014 20 / 37

Page 21: Java, осень 2014: Ввод-вывод, доступ к файловой системе

Потоки байт Вывод данных

java.io.OutputStream — подклассы

java.io.FileOutputStreamnew FileOutputStream(new File("output.data"))

java.io.ByteArrayOutputStreamnew ByteArrayOutputStream()

java.io.DataOutputStream

new DataOutputStream(anotherOutputStream)

java.util.zip.DeflaterOutputStream

new DeflaterInputStream(anotherOutputStream)

Алексей Владыкин Ввод/вывод 13 октября 2014 21 / 37

Page 22: Java, осень 2014: Ввод-вывод, доступ к файловой системе

Потоки байт Вывод данных

Копирование потока

byte[] buf = new byte [1024];int bytesRead;while (( bytesRead = inputStream.read(buf)) > 0) {

outputStream.write(buf , 0, bytesRead );}

Алексей Владыкин Ввод/вывод 13 октября 2014 22 / 37

Page 23: Java, осень 2014: Ввод-вывод, доступ к файловой системе

Потоки символов

Алексей Владыкин Ввод/вывод 13 октября 2014 23 / 37

Page 24: Java, осень 2014: Ввод-вывод, доступ к файловой системе

Потоки символов Ввод данных

Ввод данныхjava.io.Reader

Вывод данныхjava.io.Writer

Производные классы для конкретных случаев

Бросают java.io.IOException в случае ошибок

Алексей Владыкин Ввод/вывод 13 октября 2014 24 / 37

Page 25: Java, осень 2014: Ввод-вывод, доступ к файловой системе

Потоки символов Ввод данных

java.io.Reader

int read()

int read(char cbuf[])int read(char cbuf[], int off, int len)

void close()

Алексей Владыкин Ввод/вывод 13 октября 2014 25 / 37

Page 26: Java, осень 2014: Ввод-вывод, доступ к файловой системе

Потоки символов Ввод данных

java.io.Reader — подклассы

java.io.InputStreamReader

new InputStreamReader(inputStream, "UTF-8")

java.io.CharArrayReader

new CharArrayReader(new char[] {’a’, ’b’, ’c’})

java.io.BufferedReader

new BufferedReader(anotherReader)добавляет буферизацию и String readLine()

Алексей Владыкин Ввод/вывод 13 октября 2014 26 / 37

Page 27: Java, осень 2014: Ввод-вывод, доступ к файловой системе

Потоки символов Вывод данных

java.io.Writer

void write(int c)

void write(char cbuf[])void write(char cbuf[], int off, int len)

void flush()

void close()

Алексей Владыкин Ввод/вывод 13 октября 2014 27 / 37

Page 28: Java, осень 2014: Ввод-вывод, доступ к файловой системе

Потоки символов Вывод данных

java.io.Writer — подклассы

java.io.OutputStreamWriter

new OutputStreamWriter(outputStream, "UTF-8")

java.io.CharArrayWriter

new CharArrayWriter()

java.io.BufferedWriter

new BufferedWriter(anotherWriter)добавляет буферизацию и void newLine()

Алексей Владыкин Ввод/вывод 13 октября 2014 28 / 37

Page 29: Java, осень 2014: Ввод-вывод, доступ к файловой системе

Потоки символов Вывод данных

Форматированный вывод

java.io.PrintStream и java.io.PrintWriter

Добавляют методы print(), println(), printf()

Вместо исключения устанавливают флаг ошибки

Алексей Владыкин Ввод/вывод 13 октября 2014 29 / 37

Page 30: Java, осень 2014: Ввод-вывод, доступ к файловой системе

Потоки символов Вывод данных

Форматированный ввод

java.io.StreamTokenizerумеет разбирать текст на «слова» и «числа»

java.util.Scannerдобавлен в Java 5умеет разбирать все примитивные типы, а также искать токены попроизвольному регулярному выражениюподдерживает локали

Алексей Владыкин Ввод/вывод 13 октября 2014 30 / 37

Page 31: Java, осень 2014: Ввод-вывод, доступ к файловой системе

Потоки символов Вывод данных

java.lang.System

public static final InputStream in = null;public static final PrintStream out = null;public static final PrintStream err = null;

Алексей Владыкин Ввод/вывод 13 октября 2014 31 / 37

Page 32: Java, осень 2014: Ввод-вывод, доступ к файловой системе

NIO

Алексей Владыкин Ввод/вывод 13 октября 2014 32 / 37

Page 33: Java, осень 2014: Ввод-вывод, доступ к файловой системе

NIO

java.nio.*

Высокопроизводительный масштабируемый неблокирующийввод-вывод

Буфер: java.nio.BufferКанал: java.nio.channels.ChannelСелектор: java.nio.channels.Selector

Алексей Владыкин Ввод/вывод 13 октября 2014 33 / 37

Page 34: Java, осень 2014: Ввод-вывод, доступ к файловой системе

Когда Java не хватает

Алексей Владыкин Ввод/вывод 13 октября 2014 34 / 37

Page 35: Java, осень 2014: Ввод-вывод, доступ к файловой системе

Когда Java не хватает

Запуск внешних процессов

ProcessBuilder processBuilder =new ProcessBuilder("cmd", "/c", "dir");

Process process = processBuilder.start ();

InpuStream inputStream = process.getInputStream ();BufferedReader reader = new BufferedReader(

new InputStreamReader(inputStream , "cp866"));

String line;while ((line = reader.readLine ()) != null) {

System.out.println(line);}

int exitCode = process.waitFor ();

Алексей Владыкин Ввод/вывод 13 октября 2014 35 / 37

Page 36: Java, осень 2014: Ввод-вывод, доступ к файловой системе

Когда Java не хватает

JNI

Java Native Interface

Возможность вызова нативного кода из JVMТеряется переносимость кода (либо надо подкладывать нативныебиблиотеки под все поддерживаемые платформы)

Алексей Владыкин Ввод/вывод 13 октября 2014 36 / 37

Page 37: Java, осень 2014: Ввод-вывод, доступ к файловой системе

Что сегодня узнали

Как ходить по файловой системе, получать списки файлов идиректорий, читать их атрибуты

Как читать и писать двоичные данные при помощи потоков байт

Как читать и писать текстовые данные при помощи потоковсимволов

Алексей Владыкин Ввод/вывод 13 октября 2014 37 / 37