„Ще започнем с потоци за вход/изход на файлове. Но най-напред.“
Има два класа за четене и писане на файлове: FileInputStream и FileOutputStream . Както вероятно вече се досещате, FileInputStream може последователно да чете byteове от файл, а FileOutputStream може последователно да записва byteове във файл. Ето методите, които тези класове имат:
Метод | Какво прави методът |
---|---|
|
— Това е конструкторът. Позволява ви да посочите името на файл на диска, от който създаденият обект ще чете данни. |
|
— Този метод чете един byte от file и го връща. Върнатата стойност се разширява до int. |
|
— Този метод връща броя непрочетени (налични) byteове. |
|
— Този метод «затваря» потока. Извиквате това, когато приключите с работата с потока. След това обектът извършва операциите по поддържане, необходими за затваряне на file и т.н. В този момент не можете да четете повече данни от потока. |
Просто за забавление, нека изчислим сумата от всички byteове във файл. Ето How изглежда codeът:
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?“
"Добре. Вижте това:"
Метод | Какво прави методът |
---|---|
|
"Това е конструкторът. Той ви позволява да посочите името на файл на диска, в който създаденият обект ще записва данни." |
|
„Този метод записва следващия byte, съкращавайки данните до един byte.“ |
|
„Данните, които трябва да бъдат записани, често първо се събират в големи блокове в паметта и след това само се записват на диск.“
Командата flush принуждава цялата незаписана информация да бъде записана на диска. |
|
"Този метод «затваря» потока. Извиквате го, когато приключите с работата с потока.» След това обектът извършва операциите по поддръжката, необходими за затваряне на 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.“
GO TO FULL VERSION