webentwicklung-frage-antwort-db.com.de

Bestimmen Sie die Größe eines InputStreams

Meine aktuelle Situation ist: Ich muss eine Datei lesen und den Inhalt in InputStream setzen. Anschließend muss ich den Inhalt der InputStream in ein Byte-Array einfügen, das (soweit ich weiß) die Größe der InputStream erfordert. Irgendwelche Ideen?

Auf Wunsch zeige ich den Eingabestrom an, den ich aus einer hochgeladenen Datei erstellt habe

InputStream uploadedStream = null;
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
Java.util.List items = upload.parseRequest(request);      
Java.util.Iterator iter = items.iterator();

while (iter.hasNext()) {
    FileItem item = (FileItem) iter.next();
    if (!item.isFormField()) {
        uploadedStream = item.getInputStream();
        //CHANGE uploadedStreambyte = item.get()
    }
}

Die Anforderung ist ein HttpServletRequest-Objekt, das wie FileItemFactory und ServletFileUpload vom Apache Commons FileUpload-Paket stammt.

49
ChronoXIII

Ich wollte nur hinzufügen, dass Apache Commons IO Stream-Support-Dienstprogramme zur Durchführung der Kopie hat. (Übrigens, was meinen Sie mit dem Einfügen der Datei in einen Eingabestrom? Können Sie uns Ihren Code zeigen?)

Bearbeiten:

Okay, was möchten Sie mit dem Inhalt des Elements tun? Es gibt eine item.get()die zurückgibt die gesamte Sache in einem Byte-Array.

Edit2

item.getSize() gibt den hochgeladenen Dateigröße zurück.

11
akarnokd

Ich würde in ein ByteArrayOutputStream einlesen und dann toByteArray () aufrufen, um das resultierende Bytearray zu erhalten. Sie müssen die Größe nicht im Voraus definieren (obwohl es möglicherweise eine Optimierung ist , wenn Sie sie kennen . In vielen Fällen wird dies nicht der Fall sein.)

34
Brian Agnew

Dies ist ein WIRKLICH alter Thread, aber es war immer noch das erste, was auftauchte, als ich das Problem googelte. Also wollte ich nur folgendes hinzufügen:

InputStream inputStream = conn.getInputStream();
int length = inputStream.available();

Arbeitete für mich. Und VIEL einfacher als die anderen Antworten hier. 

33
W. B. Reed

Sie können die Datenmenge in einem Stream nicht bestimmen, ohne sie zu lesen. Sie können jedoch nach der Größe einer Datei fragen:

http://Java.Sun.com/javase/6/docs/api/Java/io/File.html#length ()

Wenn dies nicht möglich ist, können Sie die Bytes, die Sie aus dem Eingabestrom lesen, in einen ByteArrayOutputStream schreiben, der nach Bedarf wächst.

16
Andrew Duffy

sie können die Größe von InputStream mithilfe von getBytes (inputStream) von Utils.Java ermitteln. Überprüfen Sie den folgenden Link

Hole Bytes von Inputstream

4
Gnanam R

Für InputStream

IoUtils.toByteArray(inputStream).length

Für optionales <MultipartFile>

Stream.of(multipartFile.get()).mapToLong(file->file.getSize()).findFirst().getAsLong()
1
amstegraf

Wenn Sie wissen, dass Ihre InputStream eine FileInputStream oder eine ByteArrayInputStream ist, können Sie mit ein wenig Überlegung die Stream-Größe ermitteln ohne den gesamten Inhalt zu lesen . Hier ist eine Beispielmethode:

static long getInputLength(InputStream inputStream) {
    try {
        if (inputStream instanceof FilterInputStream) {
            FilterInputStream filtered = (FilterInputStream)inputStream;
            Field field = FilterInputStream.class.getDeclaredField("in");
            field.setAccessible(true);
            InputStream internal = (InputStream) field.get(filtered);
            return getInputLength(internal);
        } else if (inputStream instanceof ByteArrayInputStream) {
            ByteArrayInputStream wrapper = (ByteArrayInputStream)inputStream;
            Field field = ByteArrayInputStream.class.getDeclaredField("buf");
            field.setAccessible(true);
            byte[] buffer = (byte[])field.get(wrapper);
            return buffer.length;
        } else if (inputStream instanceof FileInputStream) {
            FileInputStream fileStream = (FileInputStream)inputStream;
            return fileStream.getChannel().size();
        }
    } catch (NoSuchFieldException | IllegalAccessException | IOException exception) {
        // Ignore all errors and just return -1.
    }
    return -1;
}

Dies könnte erweitert werden, um zusätzliche Eingabestreams zu unterstützen, da bin ich mir sicher.

0
Travis Parks

Bei explizitem Umgang mit einer ByteArrayInputStream können Sie im Gegensatz zu einigen Kommentaren auf dieser Seite die .available()-Funktion verwenden, um die Größe zu ermitteln. Sie müssen es nur tun, bevor Sie damit beginnen zu lesen.

Aus den JavaDocs:

Gibt die Anzahl der verbleibenden Bytes zurück, die von diesem Eingabestrom gelesen (oder __ übersprungen werden können). Der zurückgegebene Wert ist count - pos, welcher ist die Anzahl der noch zu lesenden Bytes aus dem Eingangspuffer.

https://docs.Oracle.com/javase/7/docs/api/Java/io/ByteArrayInputStream.html#available ()