在Java中无需迭代即可将字节从一个数组复制到另一个数组

3

有没有一种更快的方法将一个数组中的字节复制到另一个数组中,而无需迭代?

我通过蓝牙从输入流中读取字节。

public void run() {
        byte[] buffer = new byte[100];  // buffer store for the stream
        int bytes; // bytes returned from read()
        // Keep listening to the InputStream until an exception occurs
        while (true) {
            try {
                // Read from the InputStream
                bytes = mmInStream.read(buffer); // Get number of bytes and message in "buffer"
                h.obtainMessage(RECIEVE_MESSAGE, bytes, -1, buffer).sendToTarget();     // Send to message queue Handler
            } catch (IOException e) {
                break;
            }
        }
    }

这个功能会向处理程序发送随机数量的字节。我会将它们读取并放入数组中,以便在下载完成后处理数据。从 PIC 微控制器发送的数据长度为 6055 字节。

h = new Handler() {
            public void handleMessage(android.os.Message msg) {
                switch (msg.what) {
                    case SUCCESS_CONNECT:
                        // Connected so start connected thread
                        btSocket = (BluetoothSocket) msg.obj;
                        byteCount = 0;
                        arrayCount = 0;
                        mConnectedThread = new FullDataActivity.ConnectedThread(btSocket);
                        mConnectedThread.start();
                        mConnectedThread.write(getFullDataConByte); // Send 255 to start
                        break;
                    case RECIEVE_MESSAGE:  // if receive massage
                        byte[] readBuf = (byte[]) msg.obj;
                        // iterate through obj and copy bytes to fullDataChunk array
                        for (int a = 0; a < msg.arg1; a++) {
                            fullDataChunk[byteCount] = readBuf[a];
                            Log.d("readBuf[a] = ",Integer.toString(readBuf[a] & 0xFF));
                            byteCount++;
                        }
                        // if all bytes done process
                        if (byteCount == 6055) {// process data when complete.

我的处理程序在复制数据时出现了缺失字节的问题,导致数据破坏。我不知道在for循环中处理剩余数据之前,run方法是否会向处理程序发送新的字节。 我已经记录了运行时发送的字节,它们是正确的,但在处理程序处理时就出了问题。
我需要确保在发送新数据之前先处理已发送的数据,或者更快地将数据复制到数组中。 有任何想法吗?

1
每次都需要创建新的数组或者同步访问它。 - talex
1
在发送消息之前,创建一个新的buffer,目前你正在覆盖传入消息的现有缓冲区。此外,你可以使用System.arraycopy(Object, Object, int, int)更快地复制数组。它比你的循环更快。参考链接:https://developer.android.com/reference/java/lang/System.html - ug_
你能展示中间步骤吗?obtainMessage是如何实现的,或者至少它接受哪些参数类型,然后你是如何调用handleMessage的。因为handleMessage接收的是android.os.Message,你在中间进行了一些转换,而且大部分问题都出在这个部分。 - Hani
谢谢大家。我在我的程序中使用了arraycopy,但是构建了完整的数组并发送了整个数组,而不是发送部分。现在运行得很好。 - fatmanming
2个回答

4

2
在运行中进行此操作,然后处理程序将收到完整的数组而没有错误。
  public void run() {
            byte[] fullBuffer = new byte[6055];
            byte[] buffer = new byte[100];  // buffer store for the stream
            int bytes; // bytes returned from read()
            int bytesCount = 0;
            // Keep listening to the InputStream until an exception occurs
            while (true) {
                try {
                    // Read from the InputStream
                    bytes = mmInStream.read(buffer);        // Get number of bytes and message in "buffer"
                    System.arraycopy(buffer,0,fullBuffer,bytesCount,bytes);
                    bytesCount = bytesCount + bytes;
                    Log.d("FD Read - ", Integer.toString(bytesCount));
                    if(bytesCount >= 6055){
                        h.obtainMessage(RECIEVE_MESSAGE, bytesCount, -1, fullBuffer).sendToTarget();     // Send to message queue Handler
                        Log.d("FD Read - ", "Message sent");
                        bytesCount = 0;
                        Log.d("FD Read - ", "bytesCount re-set");
                    }
                    //h.obtainMessage(RECIEVE_MESSAGE, bytes, -1, buffer).sendToTarget();     // Send to message queue Handler
                } catch (IOException e) {
                    break;
                }
            }
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接