Слайд 1Язык программирования JAVA
Потоки ввода/вывода
Слайд 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")) {
int i = -1;
while ((i = fin.read()) != -1) {
System.out.print((char) i);
}
} catch (FileNotFoundException ex) {
System.out.println(ex.getMessage());
} catch (IOException ex) {
System.out.println(ex.getMessage());
} catch (Exception ex) {
System.out.println(ex.getMessage());
}
Слайд 17Класс FileOutputStream
Поток для записи в файл по байтам.
String text =
"Hello world!"; // строка для записи
try (FileOutputStream fos = new
FileOutputStream("notes.txt")) {
// перевод строки в байты
byte[] buffer = text.getBytes();
fos.write(buffer, 0, buffer.length);
} 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")))) {
int c;
while ((c = bis.read()) != -1) {
System.out.print((char) c);
}
} catch (Exception e) {
System.out.println(e.getMessage());
}
Слайд 19Классы FileReader и FileWriter
try (Reader reader = new FileReader("notes.txt")){
try (Writer writer = new FileWriter("output.txt")) {
int c = 0;
while ((c = reader.read()) >= 0) {
writer.write(Character.toUpperCase((char)c));
}
}
} 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("Это строка:");
int i
= -7;
pw.println(i);
double d = 4.5e-7;
pw.println(d);
char ch
= 0;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println("Введите символы, 'q' - для завершения.");
do {
try {
ch = (char) br.read();
} catch (IOException e) {
e.printStackTrace();
}
System.out.print(ch);
} while(ch != 'q');
Слайд 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("notes.txt"), "Cp1251");
Writer writer =
new OutputStreamWriter(
new FileOutputStream("output.txt"), "Cp866") ) {
int c = 0;
while ((c = reader.read()) >= 0) writer.write(c);
} 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;
}
public static final String PERSON_file =
"person.bin";
try (ObjectOutputStream objectOutputStream = new ObjectOutputStream(new FileOutputStream(PERSON_file))) {
Person person = new Person();
person.name = "Jakob Jenkov";
person.age = 40;
objectOutputStream.writeObject(person);
objectOutputStream.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
Слайд 27Пример десериализации
try (ObjectInputStream objectInputStream =
new ObjectInputStream(new FileInputStream("person.bin"))){
Person personRead = (Person) objectInputStream.readObject();
System.out.println(personRead.name);
System.out.println(personRead.age);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}