私の現在の状況は次のとおりです。ファイルを読み取り、その内容をInputStream
に入れる必要があります。その後、InputStream
のサイズを(私の知る限り)必要とするバイト配列にInputStream
のコンテンツを配置する必要があります。何か案は?
要求に応じて、アップロードしたファイルから作成している入力ストリームを表示します
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()
}
}
リクエストはHttpServletRequest
オブジェクトであり、FileItemFactory
に似ており、ServletFileUpload
はApache Commons FileUploadパッケージからのものです。
これは本当に古いスレッドですが、私がこの問題をグーグルで検索したとき、それはまだ最初にポップアップするものでした。だから私はこれを追加したかっただけです:
InputStream inputStream = conn.getInputStream();
int length = inputStream.available();
私のために働いた。そして、他の答えよりもはるかに簡単です。
ByteArrayOutputStream を読み込んでから toByteArray() を呼び出して、結果のバイト配列を取得します。事前にサイズを定義する必要はありません(ただし、知っている場合は最適化になる可能性があります。多くの場合はそうしません)
ストリーム内のデータの量は、読み取ることなく判断できません。ただし、ファイルのサイズを尋ねることができます。
http://Java.Sun.com/javase/6/docs/api/Java/io/File.html#length()
それが不可能な場合は、入力ストリームから読み取ったバイトを ByteArrayOutputStream に書き込むことができます。これは必要に応じて大きくなります。
utils.JavaのgetBytes(inputStream)を使用してInputStreamのサイズを取得できます。次のリンクを確認してください。
InputStreamの場合
org.Apache.commons.io.IoUtils.toByteArray(inputStream).length
オプションの<MultipartFile>の場合
Stream.of(multipartFile.get()).mapToLong(file->file.getSize()).findFirst().getAsLong()
InputStream
がFileInputStream
またはByteArrayInputStream
であることがわかっている場合は、少しのリフレクションを使用してストリームサイズを取得できますコンテンツ全体を読み取らずに。メソッドの例を次に示します。
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;
}
これは、追加の入力ストリームをサポートするように拡張できると確信しています。
ByteArrayInputStream
を明示的に扱う場合、このページのコメントの一部とは反対に、.available()
関数を使用してサイズを取得できます。読み始める前にやらなければなりません。
JavaDocsから:
この入力ストリームから読み取ることができる(またはスキップできる)残りのバイト数を返します。返される値はcount-posです。これは、入力バッファーから読み取られる残りのバイト数です。
https://docs.Oracle.com/javase/7/docs/api/Java/io/ByteArrayInputStream.html#available()