2012-07-31 11 views
6

Ho bisogno di ottenere la dimensione in byte di un InputStream senza creare un'istanza File. C'è un modo per farlo usando Java NIO?Dimensioni InputStream Java

+2

Perché si bisogno di questo? – Jeffrey

+3

Il contratto di "InputStream" non dice nulla per quanto riguarda il mandato di essere finito. – oldrinb

+1

O in merito alla sua definizione anticipata. – EJP

risposta

24

Di un generale InputStream? Dovresti semplicemente continuare a leggere e leggere (ad esempio nello stesso buffer, più e più volte) contando quanti byte hai letto, fino a quando non arrivi alla fine del flusso.

Ovviamente, non sarà possibile leggere i dati stessi ... se si desidera farlo, è necessario conservare i dati mentre vengono letti, ad es. copiandolo su un ByteArrayOutputStream.

(Se sei in grado di elaborare i dati nello stesso momento in cui esegui la lunghezza, fallo semplicemente - mentre lo leggi usando un ciclo, leggendo sempre nello stesso buffer, basta incrementare un contatore per registrare . quanto hai letto hai in realtà non ci ha fornito alcuna informazione su ciò che si vuole fare con il flusso)

+1

Oppure basta copiarlo sulla destinazione man mano che si procede, eliminare il conteggio e ByteArrayOutputStream, e la latenza e lo spazio sprecato, pronto in memoria. – EJP

+0

@EJP: Dipende da cosa farai dopo. Non è possibile copiarlo a una destinazione. –

+0

Quindi leggilo e processalo mentre lo fai. Sono molto sospettoso delle "soluzioni" che iniziano leggendo l'intero input, a meno che non si sappia che l'input è molto piccolo, nel qual caso non hai proprio bisogno di sapere di quale dimensione si tratti, vero? – EJP

1

Un paio di opzioni aggiuntive:.

a seconda del bloccando natura del flusso di input, è possibile chiamare available() sullo stream.

Se gli stream sono piccoli, è possibile scriverli in PushbackInputStream s, contare i byte e quindi riavvolgere.

+1

-1. available() fa * not * restituisce la dimensione di un flusso e c'è un avvertimento specifico nel Javadoc che lo dice. E * tutti * i flussi di input stanno bloccando. – EJP

+6

Devono contraddire. Controlla il JavaDoc. http://docs.oracle.com/javase/6/docs/api/java/io/FileInputStream.html#available%28%29. Il valore restituito di available() specifica che è il numero di byte che possono essere letti ** senza ** il blocco. Inoltre, "In alcuni casi, una lettura non bloccante (o skip) può sembrare bloccata quando è semplicemente lenta, ad esempio quando legge file di grandi dimensioni su reti lente". E nel caso di FileInputStreams, è spesso un indicatore affidabile di dimensioni. – Nicholas

+2

Questo è esattamente quello che ho detto. È esattamente l'* opposto * di quello che hai detto.Hai detto che available() può essere usato per restituire la dimensione del flusso di input, che è l'argomento di questa domanda. Non è la stessa cosa che il numero di byte può essere letto senza bloccare. Considera una presa. La parte dopo "inoltre" non ha alcuna rilevanza apparente. C'è un'altra frase che non hai citato che mette in guardia in modo specifico contro l'utilizzo nell'ultima frase, e non c'è nulla nella domanda su FileInputStream. – EJP

6

Non è noto in linea di principio (si consideri un peer che non smette mai di scrivere) e non ne ha bisogno. Basta leggere e scrivere in un loop usando un buffer di dimensioni fisse. NIO non offre alcuna soluzione magica.

-2

è possibile ottenere la dimensione di InputStream che utilizzano getBytes (InputStream) di Utils.java controllare questo link seguente

Get Bytes from Inputstream

+0

In altre parole, è sufficiente leggere lo stream fino alla fine dello stream oppure fare affidamento su proprietà non documentate di ByteArrayInputStream. Un collegamento di qualità molto scarsa e non utilizza NIO specificato nella domanda. -1 – EJP

Problemi correlati