I am familiar with the concept of InputStream
,buffers and why they are useful (when you need to work with data that might be larger then the machines RAM for example) .
I was wondering though, how does the InputStream
actually carry all that data?. Could a OutOfMemoryError
be caused if there is TOO much data being transfered?
If I connect from a client to a server,requesting a 100GB file, the server starts iterating through the bytes of the file with a buffer, and writing the bytes back to the client with outputStream.write(byte[])
. The client is not ready to read the InputStream
right now,for whatever reason. Will the server continue sending the bytes of the file indefinitely? and if so, won't the outputstream/inputstream
be larger than the RAM of one of these machines?
InputStream
and OutputStream
implementations do not generally use a lot of memory. In fact, the word "Stream" in these types means that it does not need to hold the data, because it is accessed in a sequential manner -- in the same way that a stream can transfer water between a lake and the ocean without holding a lot of water itself.
But "stream" is not the best word to describe this. It's more like a pipe, because when you transfer data from a server to a client, every stage transfers back-pressure from the client that controls the rate at which data gets sent. This is similar to how your faucet controls the rate of flow through your pipes all the way to the city reservoir:
InputStream
only requests more data from the OS when its internal (small) buffers are empty. Each request allows only a limited amount of data to be transferred; OutputStream
, the OutputStream
will try to write data to the OS. When the OS buffer is full, it will make the server process wait until the server-side buffer has space to accept new data. Notice that a slow client can make the server process take a very long time. If you're writing a server, and you don't control the clients, then it's very important to consider this and to ensure that there are not a lot of server-side resources tied up while a long data transfer takes place.
Your question is as interesting as difficult to answer properly.
InputStream
and OutputStream
are not a storage means, but an access means: They describe that the data shall be accessed in sequential, unidirectional order , but not how it shall be stored. The actual way of storing the data is implementation-dependent . So, would there be an InputStream that stores the whole amount of data simultaneally in memory? Yes, could be, though it would be an appalling implementation. The most common and sensitive implementation of InputStreams / OutputStreams is by storing just a fixed and short amount of data into a temporary buffer of 4K-8K, for example.
(So far, I supposed you already knew that, but it was necessary to tell.)
How many time will the server block? Typically, a server should have a security timeout to ensure that long blocks will break the connection, thus releasing the blocked thread. The same should have the client.
The timeouts set for the connection depend on the implementation, and the protocol.
No, it does not need to hold all data. I just advances forward in the file (usually using buffered data). The stream can discard old buffers as it pleases.
Note that there are aa lot of very different implementations of inputstreams, so the exact behaviour varies a lot.
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.