## Абстрактные классы ввода/вывода
- `Reader` - абстрактный класс, в котором собраны самые общие методы символьного ввода
- `Writer` - абстрактный класс, в котором собраны самые общие методы символьного вывода
- `InputStream` - абстрактный класс с общими методами байтового ввода
- `OutputStream` - абстрактный класс с общими методами байтового вывода
#### Абстрактные классы `Reader`, `InputStream`
Методы:
```java
int read()
int read(char[] buf)` или `int read(byte[] buf)
int read(char[] buf, int offset, int len)` или `int read(byte[] buf, int offset, int len)
int skip(long n)
void reset()
void close()
```
#### Абстрактные классы `Writer`, `OutputStream`
Методы:
```java
write(int elem)
write(char[] buf) или write(byte[] buf)
write(char[] buf, int offset, int len) или write(byte[] buf, int offset, int len)
flush()

write(String s)
write(String s, int offset, int len)
```
## Иерархия символьных потоков
![Иерархия символьных потоков](../Pictures/06_01.%20Иерархия%20символьных%20потоков.png)
## Иерархия байтовых потоков
![Иерархия байтовых потоков](../Pictures/06_02.%20Иерархия%20байтовых%20потоков.jpg)
## Обертка классов
![Обертка классов](../Pictures/06_03.%20Обертка%20классов.png)
## Класс `FilterInputStream`
```java
public class FilterInputStream extends InputStream {
	private InputStream in;
	
	protected FilterInputStream(InputStream in) {
		this.in = in;
	}
}
```
## Примеры записи в файл
```java
int a = 12345;
FileOutputStream fos = new FileOutputStream("out.txt");
fos.write(Integer.toString(a).getBytes());
fos.close();
```
  
```java
PrintWriter pr = new PrintWriter("out1.txt");
pr.print(Integer.toString(a));
pr.close();
```
## Примеры чтения из файла
```java
FileInputStream fis = new FileInputStream("out.txt");
while(fis.available() != 0) {
	int b = fis.read();
	System.out.print((char)b);
}
fis.close
```
  
```java
FileReader fr = new FileReader("out1.txt");
while (fr.ready()) {
	int c =fr.read();
	System.out.print((char)c);
}
fis.close();
System.out.println();
```
  
```java
Scanner sc = new Scanner(new File("out1.txt"));
String str = sc.next();
System.out.println(str);
System.out.println();
```
  
```java
import mypack.Person;

import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.io.PrintWriter;

public class Main {
	public static void main(String[] args) throws Exception {
		person nekto = new Person("Artemij", 20, 1.75, false);
		DataOutputStream f1 = new DataOutputStream(new FileOutputStream("1.bin"));
		f1.writeUTF(nekto.getName());
		f1.writeInt(nekto.getAge());
		f1.writeDoublie(nekto.getHeight());
		f1.writeBoolean(nekto.isMarriage());
		f1.close;
		
		person kto;
		String name = "";
		int age = 0;
		DataInputStream f2 = new DataInputStream(new FileInputStream("1.bin"));
		name = f2.readUTF();
		age = f2.readInt();
		System.out.println(name + " " + age);
		f2.close;
	}
}
```
## Запись и чтение объектов
```java
String str = "123456";
ObjectOutputStream os = new ObjectOutputStream(new BufferedOutputStrean(new FileOutputStream("out.bin")));
os.writeObject(str);
os.flush();
os.close();

ObjectInputStream is = new ObjectInputStream(new BufferedInputStream(new FileInputStream("out.bin")));
String str1 = (String)is.readObject();
is.close();
System.out.println(str1);
```
  
```java
String str = "123456";
ObjectOutputStream os = new ObjectOutputStream(new BufferedOutputStrean(new FileOutputStream("out.bin")));
os.writeObject(nekto);
os.flush();
os.close();

ObjectInputStream is = new ObjectInputStream(new BufferedInputStream(new FileInputStream("out.bin")));
String str1 = (String)is.readObject();
is.close();
System.out.println(kto);
```
Каждый объект должен быть десериализован. Для этого соответствующий класс должен реализовывать интерфейс `serialisable`.
## Класс `File`
- `getAbsolutePath()` - абсолютный путь файла, начиная с корня системы. В Android корневым элементом является символ слеша (`/`)
- `canRead()` - доступно для чтения
- `canWrite()` - доступно для записи
- `exists()` - файл существует или нет
- `getName()` - возвращает имя файла
- `getParent()` - возвращает имя родительского каталога
- `getPath()` - путь
- `lastModified()` - дата последнего изменения
- `isFile()` - объект является файлом, а не каталогом
- `isDirectory()` - объект является каталогом
- `isAbsolute()` - возвращает `true`, если файл имеет абсолютный путь
- `renameTo(File newPath)` - переименовывает файл. В параметре указывается имя нового имени файла. Если переименование прошло неудачно, то возвращается `false`
- `delete()` - удаляет файл. Также можно удалить **пустой** каталог
## Класс `StringTokenizer`
```java
public static void main(String[] args) throws Exception {
	String str = "Я узнал, что у меня есть огромная семья";
	StringTokenizer st = new StringTokenizer(str, ",.\n\r\t");
	while (st.hasMoreTokens()) {
		System.out.println(st.nextToken());
	}
}
```
  
```java
public static void main(String[] args) throws Exception {
	FileReader f = new FileReader("1.txt");
	StreamTokenizer st = new StreanTokenizer(f);
	int token = st.nextToken();
	while (token != StreamTokenizer.TT_EOF) {
		System.out.println(st.nextToken(st.sval));
		token = st.nextToken();
	}
}
```