0

USB から Mp3 ファイルを読み込んで、データを別のバッファに書き込もうとしています。これを行う良い方法があれば、私を助けてください。

データ全体をバイト配列に読み込むことができました。しかし、最初の 8 バイトを最初のバイト配列に書き込み、次の 8 バイトを 2 番目のバイト配列に書き込むなど、データの終わりまで何かをしたいと考えています。可能であれば、サンプルコードを提供してください。目の前に例があれば、すぐに把握できます。

以下は、データを読み取る必要がある私のコードです。

public class ReadFileInByteArrayWithFileInputStream {
    static byte[] buffer1 ;

    @SuppressWarnings("null")

    public static void main() {
        File file = new File("/mnt/media/wayfaring_stranger.mp3");
        FileInputStream fin = null;
        FileOutputStream fout=null;


        try 
        {
            // create FileInputStream object
            fin = new FileInputStream(file);
            byte fileContent[] = new byte[(int) file.length()];
            // Reads up to certain bytes of data from this input stream into an
            // array of bytes.
            fin.read(fileContent);
            // create string from byte array
            String s = new String(fileContent);
            System.out.println("File content: " + s);

            buffer1 = new byte[8];



        }

        catch (FileNotFoundException e) 
        {
            System.out.println("File not found" + e);
        }
        catch (IOException ioe) {
            System.out.println("Exception while reading file " + ioe);
        }
        finally {

            // close the streams using close method
            try 
            {
                if (fin != null) {
                    fin.close();
                }
            }
            catch (IOException ioe) 
            {
                System.out.println("Error while closing stream: " + ioe);
            }
        }
    }
}
4

2 に答える 2

0
buffer = new byte[8];
                  input.read(buffer);
           //     input.read(buffer, offset, length);
                  Log.i("TvPlayerFunctionalTestApp", "buffer: "+ Arrays.toString(buffer));
                  buffer1 = new byte[8];
                  input.read(buffer1);
于 2013-10-24T06:52:14.033 に答える
0

まず、大きなファイルを小さなバッファに分割すると、メモリが非常に無駄になります。各オブジェクトのオーバーヘッドは、データ自体とほぼ同じ (またはそれ以上) になります。ただし、入力ストリームを複数のチャンクに分割するという考え方には、本質的に問題はありません。

あなたが見逃している概念は、バッファごとに個別の変数を持つのではなく、バッファのコレクションを使用していると思います。したがって、それぞれが変数である、などを使用する代わりにbuffer1、(または何でも)と呼ばれる単一の変数を使用します。buffer2buffer3byte[]List<byte[]>buffers

読み取りを行うコードは次のとおりです。

public static List<byte[]> readBuffers(InputStream input, int maxBufferSize)
        throws IOException {
    List<byte[]> ret = new ArrayList<byte[]>();

    while (true) { 
        byte[] buffer = new byte[maxBufferSize];          
        int bufferRead = 0;
        while (bufferRead < buffer.length) {
            int chunk = input.read(buffer, bufferRead, buffer.length - bufferRead);
            if (chunk == -1) {
                // End of data.

                // If there's no data in this buffer, our list is fine. Otherwise
                // we need to create a smaller buffer and add that.
                if (bufferRead != 0) {
                    byte[] finalBuffer = new byte[bufferRead];
                    System.arraycopy(buffer, 0, finalBuffer, 0, bufferRead);
                    ret.add(finalBuffer);
                }
                return ret;
            }
        }
        // Full buffer. Add it to the list, and start again.
        ret.add(buffer);
    }
}

方法に注意してください:

  • の戻り値を常にInputStream.read使用します。1 回の呼び出しで要求した量のデータを読み取ることが保証されていないため、決して無視しないでください。
  • データを文字列に変換しようとはしません。もともとテキスト データだったバイトを本当に読み取っている場合を除き、コンストラクタを使用しないでくださいStringまた、元がテキスト データだったバイトを読み取っている場合は、エンコーディングを指定する必要があります。

あるいは、実際にファイルの各チャンクを他の関数 (ハッシュなど) に渡そうとしているだけの場合は、ファイル全体をメモリに格納する必要はまったくありません。代わりに、「チャンク プロセッサ」の概念をカプセル化し、それをメソッドに渡します。上記のメソッドのリストに追加する場所では、代わりにチャンク プロセッサを呼び出します。

于 2013-10-24T06:20:37.493 に答える