„Ще започнем с потоци за вход/изход на файлове. Но най-напред.“

Има два класа за четене и писане на файлове: FileInputStream и FileOutputStream . Както вероятно вече се досещате, FileInputStream може последователно да чете byteове от файл, а FileOutputStream може последователно да записва byteове във файл. Ето методите, които тези класове имат:

Метод Какво прави методът
FileInputStream(String fileName);
— Това е конструкторът. Позволява ви да посочите името на файл на диска, от който създаденият обект ще чете данни.
int read();
— Този метод чете един byte от file и го връща. Върнатата стойност се разширява до int.
int available();
— Този метод връща броя непрочетени (налични) byteове.
void close();
— Този метод «затваря» потока. Извиквате това, когато приключите с работата с потока.
След това обектът извършва операциите по поддържане, необходими за затваряне на file и т.н.
В този момент не можете да четете повече данни от потока.

Просто за забавление, нека изчислим сумата от всички byteове във файл. Ето How изглежда codeът:

Обобщете всички byteове във файл
public static void main(String[] args) throws Exception
{
 //Create a FileInputStream object bound to «c:/data.txt».
 FileInputStream inputStream = new FileInputStream("c:/data.txt");
 long sum = 0;

 while (inputStream.available() > 0) //as long as there are unread bytes
 {
  int data = inputStream.read(); //Read the next byte
  sum +=  data; //Add it to the running total
 }
 inputStream.close(); // Close the stream

 System.out.println(sum); // Display the sum on the screen.
}

„Вече разгледахме нещо подобно. Как е организиран FileOutputStream?“

"Добре. Вижте това:"

Метод Какво прави методът
FileOutputStream (String fileName);
"Това е конструкторът. Той ви позволява да посочите името на файл на диска, в който създаденият обект ще записва данни."
void write(int data);
„Този ​​метод записва следващия byte, съкращавайки данните до един byte.“
void flush();
„Данните, които трябва да бъдат записани, често първо се събират в големи блокове в паметта и след това само се записват на диск.“

Командата flush принуждава цялата незаписана информация да бъде записана на диска.

void close();
"Този метод «затваря» потока. Извиквате го, когато приключите с работата с потока.»
След това обектът извършва операциите по поддръжката, необходими за затваряне на file и т.н.

Вече не можете да записвате данни в потока и flush се извиква автоматично.

"Това е?"

"Да, всъщност има само един метод за писане: write(). Той записва само един byte наведнъж. Но ви позволява да пишете толкова информация, колкото искате във file."

Програмирането е процес на разделяне на една голяма и сложна задача на много малки. По същество тук се случва същият процес: четенето и записването на големи блокове от данни се разделя на четене и писане на парчета с размер на хапка - един byte наведнъж.

Ето How можете да използвате тези класове, за да копирате файл на диск:

Копиране на файл на диск
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");

 while (inputStream.available() > 0) //as long as there are unread bytes
 {
  int data = inputStream.read(); // Read the next byte into the data variable
  outputStream.write(data); // and write it to the second stream
 }

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

„Благодаря, Риши. Най-накрая разбрах How всъщност работи този code.“