web-dev-qa-db-ja.com

InputStreamのサイズを決定する

私の現在の状況は次のとおりです。ファイルを読み取り、その内容を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パッケージからのものです。

60
ChronoXIII

追加したいのは、Apache Commons IOにはコピーを実行するためのストリームサポートユーティリティがあります(ところで、ファイルを入力ストリームに配置するとはどういう意味ですか?

編集:

さて、アイテムの内容をどうしますか? item.get()これが返す バイト配列内のすべてがあります。

Edit2

item.getSize()は、アップロードされた ファイルサイズ を返します。

12
akarnokd

これは本当に古いスレッドですが、私がこの問題をグーグルで検索したとき、それはまだ最初にポップアップするものでした。だから私はこれを追加したかっただけです:

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

私のために働いた。そして、他の答えよりもはるかに簡単です。

39
W. B. Reed

ByteArrayOutputStream を読み込んでから toByteArray() を呼び出して、結果のバイト配列を取得します。事前にサイズを定義する必要はありません(ただし、知っている場合は最適化になる可能性があります。多くの場合はそうしません)

34
Brian Agnew

ストリーム内のデータの量は、読み取ることなく判断できません。ただし、ファイルのサイズを尋ねることができます。

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

それが不可能な場合は、入力ストリームから読み取ったバイトを ByteArrayOutputStream に書き込むことができます。これは必要に応じて大きくなります。

17
Andrew Duffy

utils.JavaのgetBytes(inputStream)を使用してInputStreamのサイズを取得できます。次のリンクを確認してください。

入力ストリームからバイトを取得

4
Gnanam R

InputStreamの場合

org.Apache.commons.io.IoUtils.toByteArray(inputStream).length

オプションの<MultipartFile>の場合

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

InputStreamFileInputStreamまたは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;
}

これは、追加の入力ストリームをサポートするように拡張できると確信しています。

0
Travis Parks

ByteArrayInputStreamを明示的に扱う場合、このページのコメントの一部とは反対に、.available()関数を使用してサイズを取得できます。読み始める前にやらなければなりません。

JavaDocsから:

この入力ストリームから読み取ることができる(またはスキップできる)残りのバイト数を返します。返される値はcount-posです。これは、入力バッファーから読み取られる残りのバイト数です。

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