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
risposta
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)
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
@EJP: Dipende da cosa farai dopo. Non è possibile copiarlo a una destinazione. –
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
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. 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
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
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
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.
è possibile ottenere la dimensione di InputStream che utilizzano getBytes (InputStream) di Utils.java controllare questo link seguente
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
- 1. Java networking: evented Socket/InputStream
- 2. Java InputStream attendere i dati.
- 3. java stampa InputStream per consolare il contenuto
- 4. Come usare markSupported feature di inputstream java
- 5. Devo chiudere un InputStream in Java?
- 6. InputStream POST con RestTemplate
- 7. InputStream vs InputStreamReader
- 8. Dimensioni del pulsante (Java)
- 9. Dimensioni oggetto "Data" Java
- 10. Chiusura corretta di InputStream di processo Java da getInputStream
- 11. Come eseguire una copia profonda di un InputStream in Java
- 12. Stampa di un InputStream Java da un processo
- 13. La differenza di `InputStream`` DataInputStream` e `BufferedInputStream` in java?
- 14. Impossibile leggere InputStream dal processo Java (Runtime.getRuntime(). Exec() o ProcessBuilder)
- 15. Come clonare un inputstream in java in un tempo minimo
- 16. Come si converte un InputStream in una stringa in Java?
- 17. Java: come posso ottenere la codifica da inputStream?
- 18. Creazione di un InputStream Java da un enumeratore [Array [Byte]]
- 19. Risultato SQL SQL a InputStream
- 20. Reading InputStream to Arraylist
- 21. CSVReader e InputStream
- 22. InputStream a JsonObject - GSON
- 23. File to InputStream
- 24. Multithreading Java che legge un singolo file di grandi dimensioni
- 25. Come posso convertire un InputStream non compresso in un InputStream gzip in modo efficiente?
- 26. Dimensioni dello schermo in Java
- 27. Come inviare InputStream a ProcessBuilder
- 28. Come convertire un oggetto in Inputstream
- 29. Perché PrintStream "out" e InputStream "in" null?
- 30. equivalente a Files.readAllLines() per InputStream o Reader?
Perché si bisogno di questo? – Jeffrey
Il contratto di "InputStream" non dice nulla per quanto riguarda il mandato di essere finito. – oldrinb
O in merito alla sua definizione anticipata. – EJP