Meine aktuelle Situation ist: Ich muss eine Datei lesen und den Inhalt einfügen InputStream
. Danach muss ich den Inhalt von InputStream
in ein Byte-Array einfügen, das (soweit ich weiß) die Größe von erfordert InputStream
. Irgendwelche Ideen?
Wie gewünscht, zeige ich den Eingabestream an, den ich aus einer hochgeladenen Datei erstelle
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()
}
}
Der Antrag ist ein HttpServletRequest
Objekt, das wie das ist FileItemFactory
und ServletFileUpload
ist aus dem Apache Commons Fileupload - Paket.
quelle
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();
Hat für mich gearbeitet. Und VIEL einfacher als die anderen Antworten hier.
Warnung Diese Lösung liefert keine zuverlässigen Ergebnisse hinsichtlich der Gesamtgröße eines Streams. Außer aus dem JavaDoc:
quelle
available()
Methode "Beachten Sie, dass einige Implementierungen von InputStream zwar die Gesamtzahl der Bytes im Stream zurückgeben, viele jedoch nicht. Es ist niemals korrekt, den Rückgabewert dieser Methode zum Zuweisen eines Puffers zu verwenden, der alle enthalten soll Daten in diesem Stream. "Ich würde in einen ByteArrayOutputStream einlesen und dann toByteArray () aufrufen , um das resultierende Byte-Array zu erhalten. Sie müssen die Größe nicht im Voraus definieren (obwohl dies möglicherweise eine Optimierung ist, wenn Sie sie kennen . In vielen Fällen werden Sie dies nicht tun ).
quelle
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 aus dem Eingabestream gelesenen Bytes in einen ByteArrayOutputStream schreiben, der nach Bedarf wächst.
quelle
Für InputStream
Für optionales <MultipartFile>
quelle
Sie können die Größe von InputStream mit getBytes (inputStream) von Utils.java ermitteln. Überprüfen Sie diesen folgenden Link
Holen Sie sich Bytes von Inputstream
quelle
Wenn Sie sich explizit mit einem
ByteArrayInputStream
dann entgegen einigen Kommentaren auf dieser Seite befassen , können Sie die.available()
Funktion verwenden, um die Größe zu ermitteln. Sie müssen es nur tun, bevor Sie anfangen, daraus zu lesen.Aus den JavaDocs:
https://docs.oracle.com/javase/7/docs/api/java/io/ByteArrayInputStream.html#available ()
quelle
Wenn Sie wissen, dass
InputStream
es sich um einFileInputStream
oder ein handeltByteArrayInputStream
, können Sie eine kleine Reflexion verwenden, um die Stream-Größe zu 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; }
Ich bin mir sicher, dass dies erweitert werden könnte, um zusätzliche Eingabestreams zu unterstützen.
quelle
Verwenden Sie diese Methode, Sie müssen nur den InputStream übergeben
public String readIt(InputStream is) { if (is != null) { BufferedReader reader = new BufferedReader(new InputStreamReader(is, "utf-8"), 8); StringBuilder sb = new StringBuilder(); String line; while ((line = reader.readLine()) != null) { sb.append(line).append("\n"); } is.close(); return sb.toString(); } return "error: "; }
quelle
InputStream
es sich immer um einen String handelt (nicht erforderlich, da es sich möglicherweise um Binärdaten handelt), und in jedem Fall wird nicht die Größe des Streams zurückgegeben, nach der die Frage gestellt wurde. Darüber hinaus werden\n
den Daten zusätzliche Bytes ( ) hinzugefügt, sodasssb.length()
auch die Daten ungenau sind.String
Stream erwarten .\n
wird wirklich benötigt, weil Sie der empfangenen Eingabe ein Format geben müssen. Ich möchte keine lange ChorizoString
, also zählt auch diese\n
.try { InputStream connInputStream = connection.getInputStream(); } catch (IOException e) { e.printStackTrace(); } int size = connInputStream.available();
int available () Gibt eine Schätzung der Anzahl der Bytes zurück, die aus diesem Eingabestream gelesen (oder übersprungen) werden können, ohne beim nächsten Aufruf einer Methode für diesen Eingabestream blockiert zu werden. Der nächste Aufruf kann der gleiche Thread oder ein anderer Thread sein. Ein einzelnes Lesen oder Überspringen dieser vielen Bytes blockiert nicht, kann jedoch weniger Bytes lesen oder überspringen.
InputStream - Android SDK | Android-Entwickler
quelle