【问题标题】:how to copy one byte array into another byte array?如何将一个字节数组复制到另一个字节数组中?
【发布时间】:2015-06-09 01:43:52
【问题描述】:

我正在开发一个简单的应用程序来演示 P2P 文件传输。应用程序获取一个文件,并发送数据包大小的数据块。接收者等待这些块到达。它假设不断地将传入的字节数组添加到一个更大的字节数组中,一旦所有字节都到达,该数组稍后将成为完整的文件。这是假设没有丢包。为了调试,我一直在尝试传输一个小的 txt 文件。我尝试使用 for 循环,现在使用 System.arraycopy,但 packetData 的字节数组似乎没有正确复制到 completeFile 数组。

public void run() {
    try {
        byte[] completeFile = new byte[fileSize];//will become the complete file when all bytes have arrived

        receivingSocket = new DatagramSocket(49000);
        while (bytesReceived<fileSize) {
            System.out.println("@@@ Receiver waiting for packet");
            byte[] buf = new byte[1500]; // Actual Ethernet packet size is 1500 bytes
            // receive request
            DatagramPacket packet = new DatagramPacket(buf, buf.length);
            receivingSocket.receive(packet);
            byte[] packetData = Arrays.copyOf(packet.getData(), packet.getLength());
            deliverData(packetData);
            if(headerReceived && packetsReceived>1)
            {
                //add incoming bytes to the completeFile
                System.arraycopy(packetData, 0, completeFile, bytesReceived, packetData.length);
                bytesReceived = bytesReceived + packetData.length;
            }
        }
        FileOutputStream fops = new FileOutputStream("D:\\Desktop\\testing2"+fileExtension);
        System.out.println("@@@ BUILDING FILE"); 
        fops.write(completeFile);
        fops.close(); 
    } catch (Exception e) {
        System.out.println("@@@ SOMETHING WENT WRONG!!!!!!!!!!!!!!");
        stopListening();
    }
}

【问题讨论】:

  • “似乎没有正确复制到 completeFile 数组”它在做什么呢?
  • 好吧,当我使用 for 循环并使用打印语句打印出索引时,它只会打印出第一个索引然后崩溃。使用 system.arraycopy 它只是在那一行崩溃。
  • 我通常建议为此使用 NIO 缓冲区,因为它们是专门为这种数据操作而设计的。

标签: java udp bytearray p2p fileoutputstream


【解决方案1】:

你不需要复制任何东西。您可以在每次循环时直接从用于构造DatagramPacket, 的字节数组写入文件,并且可以将该字节数组直接传递给其他方法,当然还有数据包的长度。

【讨论】:

  • 我不确定我是否遵循。对不起
  • 你不需要构建一个包含整个文件数据的巨大数组并在最后写入。可以在循环前打开文件,每次循环将接收到的数据写入文件,循环后关闭文件。基本上fops.write(packet.getData(), packet.getOffset(), packet.getLength());
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-15
  • 2019-05-13
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
相关资源
最近更新 更多