0

我正在尝试从 USB 读取 Mp3 文件并将数据写入不同的缓冲区。如果有任何好的方法可以做到这一点,请帮助我。

我可以将整个数据读入一个字节数组。但我想做一些事情,比如将前 8 个字节写入第一个字节数组,然后将下一个 8 个字节写入第二个字节数组,依此类推,直到数据结束。如果可能,请提供示例代码。如果我面前有任何例子,我可以很快掌握。

下面是我必须读取数据的代码。

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

首先,将大文件分割成很小的缓冲区非常浪费内存。每个对象的开销将与数据本身的大小大致相同(或更大)。然而,将输入流分成多个块的想法本质上没有问题。

我认为您缺少的概念是使用一缓冲区,而不是为每个缓冲区设置一个单独的变量。因此,您将拥有一个名为(或其他)的单个变量,而不是拥有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。永远不要忽略它,因为不能保证它会在一次调用中读取您要求的尽可能多的数据。
  • 我们不会尝试将数据转换为字符串。除非您真正读取最初是文本数据的字节,否则不应使用String构造函数 - 如果您正在读取最初是文本数据的字节,则应指定编码。

或者,如果您实际上只是尝试将文件的每个块传递给其他函数(例如用于散列),则根本不需要将整个文件放在内存中。相反,您将封装“块处理器”的概念并将其传递给方法。如果我在上面的方法中添加到列表中,您将改为调用块处理器。

于 2013-10-24T06:20:37.493 回答
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 回答