Java: Få storleken på en InputStream

Permalänk
Medlem

Java: Få storleken på en InputStream

Jag vill läsa in data från en inputstream och spara det i en byte array.
För att inte göra byte arrayen för stor vill jag veta storleken på datan från inputstreamen.
Det närmaste jag hittar en length-metod är .available() men enligt Java api så ska metoden inte användas till det jag vill.
Note that while some implementations of InputStream will return the total number of bytes in the stream, many will not. It is never correct to use the return value of this method to allocate a buffer intended to hold all data in this stream.

Permalänk
Medlem

Jag gissar på att det helt enkelt inte går. APIt har inte stöd för storleksbedömning av strömmar och det hade dessutom varit motsägelsefullt då själva naturen av en ström är att den levererar data bit för bit. Om det handlar om en fil i det lokala nätverket kan du få informationen med File.length(); och om den ligger på nätet får du ladda ner den först eller baka in informationen i HTTP-headern med Content-Length-parametern.

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Skrivet av Snejk:

Jag vill läsa in data från en inputstream och spara det i en byte array.
För att inte göra byte arrayen för stor vill jag veta storleken på datan från inputstreamen.
Det närmaste jag hittar en length-metod är .available() men enligt Java api så ska metoden inte användas till det jag vill.
Note that while some implementations of InputStream will return the total number of bytes in the stream, many will not. It is never correct to use the return value of this method to allocate a buffer intended to hold all data in this stream.

Har du såna prestandaproblem att du måste göra detta?

Visa signatur

Asus Striker II Extreme / XFX Geforce GTX 280 / Q9450 @ 3.6GHz/ TRUE Noctua 120/ 4x1GB Corsair TWIN3X2048-1333C9DHX / X25-M G2 80gb Velociraptor / Win 7 Ultimate x64/ Antec P190

MovieDatabase

Permalänk
Medlem
Skrivet av Snejk:

Jag vill läsa in data från en inputstream och spara det i en byte array.
För att inte göra byte arrayen för stor vill jag veta storleken på datan från inputstreamen.
Det närmaste jag hittar en length-metod är .available() men enligt Java api så ska metoden inte användas till det jag vill.
Note that while some implementations of InputStream will return the total number of bytes in the stream, many will not. It is never correct to use the return value of this method to allocate a buffer intended to hold all data in this stream.

Varför inte använda en ArrayList? Jag tror inte att du kommer att komma ifrån dynamisk allokering hur du än gör. Vad är det du skall läsa in föresten?

Permalänk
Medlem

Slanga den till en ByteArrayOutputStream och sedan anropa toByteArray()

Permalänk
Medlem
Skrivet av Dein:

Slanga den till en ByteArrayOutputStream och sedan anropa toByteArray()

Det måste väl ändå vara en inputstream..?

Visa signatur

Kom-pa-TI-bilitet

Permalänk
Medlem
Skrivet av Teknocide:

Det måste väl ändå vara en inputstream..?

Hm?

Typ såhär tänkte jag...

InputStream is = null; ByteArrayOutputStream buffer = new ByteArrayOutputStream(); int r; byte[] data = new byte[16384]; while ((r = is.read(data, 0, data.length)) != -1) { buffer.write(data, 0, r); } buffer.flush(); byte[] myByteArray = buffer.toByteArray();

Permalänk
Medlem

Tack för svaren!
Jag löste mitt problem genom att använda en ByteArrayOutputStream som några föreslog.

Permalänk
Medlem

Varför inte bara läsa in i en ArrayList i sådana fall? ByteArrayOutputStream måste väl innehålla en sån ändå för att kunna lagra datan; i detta läget används den som en stor vektor vilket rent intuitivt känns redundant.

Visa signatur

Kom-pa-TI-bilitet