Слайд 2
Содержание
Поток.
Байтовые и символьные потоки.
Базовые классы.
Блочное копирование.
Класс File.
Ввод/вывод на
консоль.
Чтение строк с консоли.
Сериализация.
Байтовый в символьный и наоборот.
Перекодирование файла.
Слайд 3
Поток
Поток является абстракцией, которая или производит, или потребляет
информацию.
Все потоки ведут себя одинаковым образом, хотя фактические
физические устройства, с которыми они связаны, могут сильно различаться.
Благодаря потокам ваша программа выполняет ввод/вывод, не понимая различий между клавиатурой и сетью.
Поток скрывает детали низкоуровневых процессов ввода/вывода.
В Java система ввода-вывода представлена в java.io.*
Слайд 4
Байтовые и символьные потоки
Потоки бывают для чтения(ввод) и
записи(вывод).
Два типа потоков – байтовый и символьный.
Чтение с
клавиатуры,
чтение из файла и т.д.
Вывод на консоль,
запись в файл и т.д.
Слайд 10
Класс ByteArrayInputStream
Поток, считывающий (записывающий) данные из массива байт.
Слайд 11
Класс ByteArrayOutputStream
Применяется для записи в массив.
Слайд 12
Блочное копирование
Процедура копирования
void copy(InputStream is, OutputStream os) throws
IOException {
byte[] b = new byte[1024];
int c = 0;
while ((c = is.read(b)) >= 0) {
os.write(b, 0, c);
}
}
Слайд 13
Класс File
Позволяет осуществлять манипуляции с файлами и директориями
Создание
дескриптора по имени:
File(pathname) – абсолютный или относительный путь
Создание дескриптора
по имени и директории:
File(File dir, name) File(String dir, name)
Получение информации
getName() – получить имя
getPath() – получить имя и путь
getAbsolutePath() – получить абсолютный путь
getAbsoluteFile() – получить абсолютный дескриптор
Определение родителя
String getParent() – как строки
File getParetnFile() – как дескриптора
Платформозависимые разделители
separator / separtorChar – разделитель директорий
pathSeparator / pathSeparatorChar – разделитель в файлов и директорий в путях
Слайд 14
Операции с файлами
Проверка типа
isFile() – является ли файлом
isDirectory()
– является ли директорией
isHidden() – является ли скрытым
Получение информации
о файле
exist() – проверка существования
length() – длина файла
lastModifier() – время последней модификации
Создание
mkdir() – создать одну директорию
mkdirs() – создать все директории
createNewFile() – создать пустой файл
Удаление
delete() – удалить немедленно
deleteOnExit() – удалить после завершения
Переименование / перенос
renameTo(file) – переименовать / перенисти в заданное место
Слайд 15
Листинг директории
Листинг всех файлов
String[] list() – получить имена
файлов
File[] listFiles() – получить дескрипторы файлов
Листинг по критерию
String[] list(FileNameFilter)
– получить имена файлов
File[] listFiles(FileFilter) – получить дескрипторы файлов
Слайд 16
Класс FileInputStream
Поток для чтения из файла по байтам.
try
{
FileInputStream fin =
new FileInputStream("/etc/hosts");
try {
int i = -1;
while ((i = fin.read()) != -1) {
System.out.print((char) i);
}
} finally {
fin.close();
}
} catch (FileNotFoundException ex) {
System.out.println(ex.getMessage());
} catch (IOException ex) {
System.out.println(ex.getMessage());
}
Слайд 17
Класс FileOutputStream
Поток для записи в файл по байтам.
String
text = "Hello world!"; // строка для записи
try {
FileOutputStream fos = new FileOutputStream("notes.txt");
try {
// перевод строки в байты
byte[] buffer = text.getBytes();
fos.write(buffer, 0, buffer.length);
} finally {
fos.close();
}
} catch (FileNotFoundException ex) {
System.out.println(ex.getMessage());
} catch (IOException ex) {
System.out.println(ex.getMessage());
}
Слайд 18
Классы BufferedInputStream и BufferedOutputStream
Чтение и запись данных происходит
из буфера.
Ускоряет процесс в несколько раз.
Запись в устройство вывода
произойдет, когда буфер заполнится.
метод flush() или close() - сброс и запись данных
try {BufferedInputStream bis = new BufferedInputStream(
new FileInputStream(new File("/etc/hosts")));
try {
int c;
while ((c = bis.read()) != -1) {
System.out.print((char) c);
}
} finally { bis.close(); }
} catch (Exception e) {
System.out.println(e.getMessage());
}
Слайд 19
Классы FileReader и FileWriter
Writer writer;
try {
Reader reader
= new FileReader("notes.txt");
try {
writer = new FileWriter("output.txt");
int c = 0;
while ((c = reader.read()) >= 0) {
writer.write(Character.toUpperCase((char) c));
}
writer.close();
} finally {
reader.close();
}
} catch (FileNotFoundException e) {
System.out.println(e.getMessage());
} catch (IOException e) {
e.printStackTrace();
}
Слайд 20
Байтовый поток в символьный
При чтении возможно преобразование байтового
потока в символьный, с указанием кодировки
Класс InputStreamReader
InputStreamReader(InputStream, encoding)
Слайд 21
Ввод/вывод на консоль
PrintWriter pw = new PrintWriter(System.out, true);
pw.println("Это
Слайд 22
Чтение строк с консоли
BufferedReader
br = new BufferedReader(new InputStreamReader(System.in));
List
list = new ArrayList<>();
System.out.println("Введите строки текста.");
System.out.println("Введите 'stop' для завершения.");
String s = null;
while(true){
try {
s = br.readLine();
} catch (IOException e) {
e.printStackTrace();
}
if(s.equals("stop")) break;
list.add(s);
}
System.out.println("Вот ваши строки:");
for (String str :list) {
System.out.println(str);
}
Слайд 23
Символьный поток в байтовый
При записи возможно преобразование символьного
потока в байтовый, с указанием кодировки
Класс OutputStreamWriter
OutputStreamWriter(OutputStream, encoding)
Слайд 24
Пример: перекодирование файла
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);
reader.close();
writer.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
Слайд 25
Сериализация
Сериализация – процесс преобразования объекта в последовательность байт.
Сериализованный
объект легко передать по сети, сохранить в файл.
Чтобы объект
мог быть сериализован, он должен реализовывать интерфейс java.io.Serializable.
java.io.Serializable — маркер, нет ни одного метода.
Классы ObjectInputStream и ObjectOutputStream производят сериализацию и десериализацию объектов.
Свойства класса, помеченные модификатором transient, не сериализуются.
Слайд 26
Пример сериализации
class Person implements Serializable {
public String name = null;
public int age = 0;
}
ObjectInputStream objectInputStream;
try {
ObjectOutputStream objectOutputStream = new ObjectOutputStream(
new FileOutputStream("person.bin"));
try {
Person person = new Person();
person.name = "Jakob Jenkov";
person.age = 40;
objectOutputStream.writeObject(person);
objectOutputStream.close();
} finally {objectOutputStream.close(); }
} catch (FileNotFoundException e) {e.printStackTrace();
} catch (IOException e) {e.printStackTrace();}
Слайд 27
Пример десериализации
try {
objectInputStream = new ObjectInputStream(new FileInputStream("person.bin"));
try {
Person personRead = (Person) objectInputStream.readObject();
System.out.println(personRead.name);
System.out.println(personRead.age);
} finally {
objectInputStream.close();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}