0

ファイルをbase64にエンコードするために、このコードを見つけました。オフセットを使用しています。

File filePath = new File("/sdcard/videooutput.mp4");
try{
    FileInputStream fin=new FileInputStream(filePath);
    long length = filePath.length();
    // Create the byte array to hold the data
    byte[] bytes = new byte[(int)length];
    // Read in the bytes
    int offset = 0;
    int numRead = 0;
    while (offset<bytes.length && (numRead=fin.read(bytes, offset, bytes.length-offset))>=0){
        offset += numRead;
    }
    // Ensure all the bytes have been read in
    if (offset < bytes.length) {
    throw new IOException("Could not completely read file "+filePath.getName());
}


Base64.encodeToString(bytes, Base64.DEFAULT);

このコードについて私が理解していないのはwhile (offset < bytes.length && (numRead=fin.read(bytes, offset, bytes.length-offset)) >= 0).

コードが何をしようとしているのか、誰か説明できますか? オフセットがバイトの長さよりも短いかどうかを確認するだけで、残りはわかりません。

次の質問は、オフセットを使用してファイルをエンコードする理由は何ですか?

この質問に関する回答は本当に役に立ちます。この種の質問をして申し訳ありませんが、このコードを理解する必要があります。

4

1 に答える 1

1

InputStream#read()

int numRead=fin.read(bytes, offset, bytes.length-offset)

read は、指定されたバイト配列を、指定されたオフセットから開始して、指定されたバイト数だけ埋めます。ただし、100 バイトを要求しても、それが得られるという保証はありません。したがって、このコードは基本的に、read() を呼び出すたびにオフセットをインクリメントしています。

最初の呼び出しでは、byte[] を完全に埋めようとします。それが失敗した場合、正常にコピーされたバイト数だけオフセットを前方に移動し、新しいオフセットから始まる byte[] を埋めようとします。新しい試行ごとに、バッファに残っているものを満たすのに十分なだけを読み取ろうとします。

于 2012-10-08T01:03:40.203 に答える