Java 文件开头不需要的字符,通过TCP连接在Android和;个人计算机

Java 文件开头不需要的字符,通过TCP连接在Android和;个人计算机,java,android,file,tcp,Java,Android,File,Tcp,所以我想从pc(windows)向android手机发送一个简单的文本文件。 我把在Stackoverflow上找到的部分代码放在一起。 我的问题是发送此文本文件时: testing, sending this text. testing, sending this text. 我从客户端获取此文件: ¬í testing, sending this text. testing, sending this text. 我很感激你能提供的任何解决方案 我知道我可以删除第一个字符,但为什么

所以我想从pc(windows)向android手机发送一个简单的文本文件。 我把在Stackoverflow上找到的部分代码放在一起。 我的问题是发送此文本文件时:

testing, sending this text. testing, sending this text.
我从客户端获取此文件:

’ testing, sending this text. testing, sending this text.
我很感激你能提供的任何解决方案

我知道我可以删除第一个字符,但为什么会发生这种情况?我做错什么了吗

更多信息:

  • 当我发送图像时,问题仍然存在。客户端上的映像将被损坏
  • 当在客户端接收到文件时,文件总是大4字节
  • 这是我的服务器代码(java):

    这是我的客户端应用程序(在android上):


    我的猜测是,如果您在android中创建了文本文件,那么它可能是以UTF格式创建的

    但是,如果您在windows中创建它并复制到您的计算机上,那么格式可能会不同,这就是为什么需要额外的字符


    您可以尝试编写文本,并确保格式为UTF-8,然后查看是否仍然发生这种情况。

    这是由以下未使用的代码造成的:

    ObjectOutputStream put = new ObjectOutputStream(
                    client.getOutputStream());
    
    此语句写入对象流头。浪费时间和空间,并且由于您没有在对等机上使用
    ObjectInputStream
    而损坏数据。删除它

    除此之外,您的代码还显示了常见的问题

    byte [] mybytearray  = new byte [(int)myFile.length()];
    
    您不需要文件大小为8192的数组。这里还假设文件大小小于2GB

    FileInputStream fis = new FileInputStream(myFile);
    BufferedInputStream bis = new BufferedInputStream(fis);
    
    在这个应用程序中,实际上不需要BufferedInputStream

    bis.read(mybytearray,0,mybytearray.length);
    
    这里假设
    read()
    填充了缓冲区。它没有约定这样做,只传输至少一个字节,否则返回-1

    os.write(mybytearray,0,mybytearray.length);
    
    同上。Java中复制流的规范方法如下:

    int count;
    byte[] buffer = new byte[8192]; // or whatever you like, anything > 0. Heroic sizes buy you nothing
    while ((count = in.read(buffer)) > 0)
    {
        out.write(buffer, 0, count);
    }
    

    你的客户端代码更糟糕。您可以使用不同的输入和输出将其简化为上面完全相同的循环。您根本不需要使用ByteArrayOutputStream的

    检查测试文件的编码。前面的字符表示可能不是纯文本。谢谢回复。我也尝试过使用图像(png和jpg)。文件在接收后已损坏(gallery会打开黑色图像)。有趣的是,我注意到文件大小的差异总是4字节。也许这会有帮助?谢谢你的输入,但我认为情况并非如此,因为显然图片也是如此……是的,这是ObjectOutputStream。谢谢你的建议。
    os.write(mybytearray,0,mybytearray.length);
    
    int count;
    byte[] buffer = new byte[8192]; // or whatever you like, anything > 0. Heroic sizes buy you nothing
    while ((count = in.read(buffer)) > 0)
    {
        out.write(buffer, 0, count);
    }