文件未完全传输(Android)

时间:2013-06-16 03:16:51

标签: java android bluetooth file-transfer

我正在开发一个Android应用程序,使用基于BlueCove library version 2.1.0this snippet通过蓝牙将文件发送到java服务器。一开始一切都很好,但文件不会完全转移。只有大约7KB的35KB。

的Android

private void sendFileViaBluetooth(byte[] data){
    OutputStream outStream = null;
    BluetoothDevice device = btAdapter.getRemoteDevice(address);
    btSocket = device.createRfcommSocketToServiceRecord(MY_UUID);
    btSocket.connect();
    try {
        outStream = btSocket.getOutputStream();
        outStream.write( data );
        outStream.write("end of file".getBytes());
        outStream.flush();
    } catch (IOException e) {
    } finally{
            try {
            outStream.close();
            btSocket.close();
            device = null;
    } catch (IOException e) {
    }
    }
}

PC服务器

InputStream inStream = connection.openInputStream();

byte[] buffer = new byte[1024];

File f = new File("d:\\temp.jpg");
FileOutputStream fos = new FileOutputStream (f);

InputStream bis = new BufferedInputStream(inStream);

int bytes = 0;
boolean eof = false;

while (!eof) {
    bytes = bis.read(buffer);
    if (bytes > 0){
        int offset = bytes - 11;
        byte[] eofByte = new byte[11];
        eofByte = Arrays.copyOfRange(buffer, offset, bytes);
        String message = new String(eofByte, 0, 11);

        if(message.equals("end of file")) {
            eof = true;
        } else {
            fos.write (buffer, 0, bytes);
        }
    }
}

fos.close();
connection.close();

我在编写之前已尝试拆分字节数组:

public static byte[][] divideArray(byte[] source, int chunksize) {
    byte[][] ret = new byte[(int)Math.ceil(source.length / (double)chunksize)][chunksize];

    int start = 0;

    for(int i = 0; i < ret.length; i++) {
        ret[i] = Arrays.copyOfRange(source,start, start + chunksize);
        start += chunksize ;
    }

    return ret;
}

private void sendFileViaBluetooth(byte[] data){

    [...]

    byte[][] chunks = divideArray(data, 1024);

    for (int i = 0; i < (int)Math.ceil(data.length / 1024.0); i += 1) {
        outStream.write( chunks[i][1024] );
    }

    outStream.write("end of file".getBytes());
    outStream.flush();

    [...]

}

感谢每一个帮助或想法。

1 个答案:

答案 0 :(得分:2)

你不需要这些。在Java中复制流的规范方法是:

while ((count = in.read(buffer)) > 0)
{
    out.write(buffer, 0, count);
}
out.close();

两端相同。 TCP / IP将为您完成所有分块。您需要做的就是正确处理不同大小的读取,这是代码所做的。