„Здравей, Амиго! Днес отново ще се поразровим How работят InputStream и OutputStream . Първоначалното обяснение всъщност беше малко опростено. Това не са интерфейси. Те са абстрактни класове и дори имат няколко внедрени метода. Нека да разгледаме методите, които имат:"

InputStream методи Какво прави методът
int read(byte[] buff);
Този метод незабавно чете блок от byteове в буфера ( byteов масив ), докато буферът се запълни or докато източникът няма повече byteове за четене.
Методът връща броя на действително прочетените byteове (който може да бъде по-малък от дължината на масива)
int read();
Този метод чете един byte и го връща. Резултатът се разширява до int for looks. Ако няма повече byteове за четене, методът връща -1.
int available();
Този метод връща броя непрочетени (налични) byteове.
void close();
Този метод "затваря" потока. Извиквате това, когато приключите с работата с потока.
След това обектът извършва операциите по поддържане, необходими за затваряне на file и т.н.
В този момент не можете да четете повече данни от потока.

„Значи можем да четем не само отделни byteове, но и цели блокове?“

"Точно."

„Можем ли да пишем и цели блокове?“

„Да, вижте го:“

OutputStream методи Какво прави методът
void write(int c);
Този метод записва един byte. Типът int е стеснен до byte. Допълнителната част просто се изхвърля.
void write(byte[] buff);
Този метод записва блок от byteове.
void write(byte[] buff, int from, int count);
Този метод записва част от блок от byteове. Използва се в случаите, когато byteовият масив може да не е запълнен изцяло.
void flush();
Ако потокът съхранява вътрешно няHowви данни, които все още не са записани, този метод принуждава записването им.
void close();
Този метод "затваря" потока. Извиквате това, когато приключите с работата с потока.
След това обектът изпълнява операциите по поддържане, необходими за затваряне на file и т.н. Вече не можете да записвате данни в потока и flush се извиква автоматично.

„Как ще изглежда codeът за копиране на файл, ако четем цели блокове наведнъж instead of единични byteове?“

"Хм. Нещо подобно:"

Копиране на файл на диск
public static void main(String[] args) throws Exception
{
 //Create a stream to read bytes from a file
 FileInputStream inputStream = new FileInputStream("c:/data.txt");
 //Create a stream to write bytes to a file
 FileOutputStream outputStream = new FileOutputStream("c:/result.txt");

  byte[] buffer = new byte[1000];
 while (inputStream.available() > 0) //as long as there are unread bytes
 {
  //Read the next block of bytes into buffer, and store the actual number of bytes read in count.
  int count = inputStream.read(buffer);
  outputStream.write(buffer, 0, count); //Write a block (part of a block) to the second stream
 }

 inputStream.close(); //Close both streams. We don't need them any more.
 outputStream.close();
}

„Разбирам всичко за буфера, но Howва е тази променлива за броене?“

„Когато четем последния блок от данни от файл, може да получим, да речем, 328 byteа instead of 1000. Така че, когато записваме данните, трябва да посочим, че не пишем целия блок – само първите 328 byteове."

Когато прочетем последния блок, методът за четене ще върне броя на действително прочетените byteове. 1000 всеки път, когато четем блок, с изключение на последния блок, когато получаваме 328.

Така че, когато пишем блок, ние посочваме, че не трябва да се записват всички byteове в буфера, а само 328 (т.е. стойността, съхранена в променливата count).

„Сега всичко е ясно. Благодаря, Ели.“