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.
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.
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.)
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.
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.
sie können die Größe von InputStream mithilfe von getBytes (inputStream) von Utils.Java ermitteln. Überprüfen Sie den folgenden Link
Für InputStream
IoUtils.toByteArray(inputStream).length
Für optionales <MultipartFile>
Stream.of(multipartFile.get()).mapToLong(file->file.getSize()).findFirst().getAsLong()
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.
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 ()