se8 - java inputstream read length




InputStreamのサイズを決定する (6)

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



ByteArrayInputStream明示的に処理する場合、このページのコメントの一部に反して、 .available()関数を使用してサイズを取得できます。 あなたがそれから読むのを始める前にそれをしなければなりません。

JavaDocsから:

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

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


これは本当に古いスレッドですが、私がその問題を見つけたときにはまだポップアップしていませんでした。 だから私はこれを追加したかった:

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

私のために働いた。 そして他の答えよりもずっと簡単です。


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

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

それが不可能な場合は、読み込んだバイトを入力ストリームからByteArrayOutputStream書き出すことができます。これは必要に応じて増加します。


私はApache Commons IOにコピーを実行するためのストリームサポートユーティリティを追加したかっただけです。 (Btw、ファイルを入力ストリームに置くことはどういう意味ですか?あなたのコードを表示できますか?)

編集:

さて、アイテムの内容で何をしたいですか? item.get()は、バイト配列内のすべてを返すものです。

Edit2

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


    try {
        InputStream connInputStream = connection.getInputStream();
    } catch (IOException e) {
        e.printStackTrace();
    }

    int size = connInputStream.available();

int available()この入力ストリームのメソッドの次の呼び出しによってブロックされることなく、この入力ストリームから読み込まれる(またはスキップされる)バイト数の見積もりを返します。 次の呼び出しは、同じスレッドまたは別のスレッドである可能性があります。 この多くのバイトの単一の読み取りまたはスキップはブロックされませんが、より少ないバイトを読み取ったりスキップしたりすることがあります。

InputStream - Android SDK | Androidデベロッパー





inputstream