"Здравей, Амиго! Сега ще ти разкажа за два интерфейса: InputStream и OutputStream . Те са декларирани като абстрактни класове, но ако се заровиш по-дълбоко, можеш да видиш, че по същество те са интерфейси . Почти всичките им методи са абстрактни, с изключение на няколко незначителни метода Те много прorчат на " телохранителя ", който разгледахме по-рано.

Това са много интересни интерфейси. Засега умишлено ще ги наричам интерфейси , за да разберете защо имаме нужда от тях. И тогава ще говорим защо те всъщност са абстрактни класове.

"Добре. И така, Howви са тези интерфейси?"

— Ще ви кажа без повече приказки.

Java има това интересно нещо, наречено « поток ». Потокът е много проста единица. А неговата простота е ключът към много мощен начин за обмен на данни. Има два типа потоци: потоци за четене и потоци за запис .

Както вероятно вече се досещате, можете да записвате данни в поток за запис . Има метод за запис за това. Можете да четете данни от поток за четене . Има метод read () за това.

InputStream  е интерфейсът за поток, който поддържа четене. Той определя следната способност: „byteовете могат да бъдат прочетени от мен“.

По подобен начин OutputStream , OutputStream е интерфейс за поток, който поддържа писане. Той дефинира следната способност: „може да ми се записват byteове“.

"Това е?"

"До голяма степен. Но целият смисъл е, че Java има много класове, които могат да работят с InputStream и OutputStream . Например, искате да прочетете файл от диска и да покажете съдържанието му на екрана. Нищо не може да бъде по-лесно."

За да прочетем данни от файл на диск, имаме специалния клас FileInputStream , който имплементира интерфейса InputStream . Искате ли да запишете тези данни в друг файл? За това имаме класа FileOutputStream , който имплементира интерфейса OutputStream . Следният code показва Howво трябва да направите, за да копирате данни от един файл в друг.

Код
public static void main(String[] args) throws IOException
{
 InputStream inStream = new FileInputStream("c:/source.txt");
 OutputStream outStream = new FileOutputStream("c:/result.txt");

 while (inStream.available() > 0)
 {
  int data = inStream.read(); //read one byte from the input stream
  outStream.write(data); //write that byte to the other stream.
 }

 inStream.close(); //close the streams
 outStream.close();
}

Представете си, че сме написали клас и сме добавor  способностите InputStream  и  OutputStream към него.

Ако сме внедрor правилно тези интерфейси, тогава екземплярите на нашия клас вече могат да бъдат записани or прочетени от файл. Просто като прочетете съдържанието им чрез метода за четене . Или могат да бъдат заредени от файл чрез създаване на обект и използване на метода за запис за запис на съдържанието на file.

— Може би пример?

"Сигурен."

Код Описание
class MyClass
{
private ArrayList<Integer> list;
}
За простота си представете, че нашият клас съдържа един обект, ArrayList, който съдържа Integers.

Сега ще добавим методи за четене и запис към него

Код Описание
class MyClass
{
private ArrayList<Integer> list;
public void write(int data)
{
list.add(data);
}
public int read()
{
int first = list.get(0);
list.remove(0);
return first;
}

public int available()
{
return list.size();
}
}
Сега нашият клас имплементира метода read , който прави възможно последователното четене на цялото съдържание на list .

И методът за запис , който ви позволява да записвате стойности в нашия списък.

Разбира се, това не е реализация на интерфейсите InputStream и OutputStream, но е много подобно.

„Да, разбирам. И така, How да запазите съдържанието на такъв обект във файл?“

„Нека ви дам един пример:“

Напишете обект MyClass във файл
public static void main(String[] args)
{
 MyClass myObject = new MyClass();
 OutputStream outStream = new FileOutputStream ("c:/my-object-data.txt");

 while (myObject.available() > 0)
 {
  int data = myObject.read(); //read one int from the input stream
  outStream.write(data); //write that int to the other stream.
 }

 outStream.close();
}
Прочетете MyClass обект от файл
public static void main(String[] args)
{
 InputStream inStream = new FileInputStream("c:/my-object-data.txt");
 MyClass myObject = new MyClass();

 while (inStream.available() > 0)
 {
  int data = inStream.read(); //read one int from the input stream
  myObject.write(data); //write that int to the other stream.
 }

 inStream.close(); //close the streams
}

„За бога! Наистина е много подобно на работата с InputStream/OutputStream. Потоците са сладки!“

— И после малко!