„Здравей, Амиго! Днес отново ще се поразровим How работят InputStream и OutputStream . Първоначалното обяснение всъщност беше малко опростено. Това не са интерфейси. Те са абстрактни класове и дори имат няколко внедрени метода. Нека да разгледаме методите, които имат:"
InputStream методи | Какво прави методът |
---|---|
|
Този метод незабавно чете блок от byteове в буфера ( byteов масив ), докато буферът се запълни or докато източникът няма повече byteове за четене. Методът връща броя на действително прочетените byteове (който може да бъде по-малък от дължината на масива) |
|
Този метод чете един byte и го връща. Резултатът се разширява до int for looks. Ако няма повече byteове за четене, методът връща -1. |
|
Този метод връща броя непрочетени (налични) byteове. |
|
Този метод "затваря" потока. Извиквате това, когато приключите с работата с потока. След това обектът извършва операциите по поддържане, необходими за затваряне на file и т.н. В този момент не можете да четете повече данни от потока. |
„Значи можем да четем не само отделни byteове, но и цели блокове?“
"Точно."
„Можем ли да пишем и цели блокове?“
„Да, вижте го:“
OutputStream методи | Какво прави методът |
---|---|
|
Този метод записва един byte. Типът int е стеснен до byte. Допълнителната част просто се изхвърля. |
|
Този метод записва блок от byteове. |
|
Този метод записва част от блок от byteове. Използва се в случаите, когато byteовият масив може да не е запълнен изцяло. |
|
Ако потокът съхранява вътрешно няHowви данни, които все още не са записани, този метод принуждава записването им. |
|
Този метод "затваря" потока. Извиквате това, когато приключите с работата с потока. След това обектът изпълнява операциите по поддържане, необходими за затваряне на 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).
„Сега всичко е ясно. Благодаря, Ели.“
GO TO FULL VERSION