Java 文件开头不需要的字符,通过TCP连接在Android和;个人计算机
所以我想从pc(windows)向android手机发送一个简单的文本文件。 我把在Stackoverflow上找到的部分代码放在一起。 我的问题是发送此文本文件时: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. 我很感激你能提供的任何解决方案 我知道我可以删除第一个字符,但为什么
testing, sending this text. testing, sending this text.
我从客户端获取此文件:
’ testing, sending this text. testing, sending this text.
我很感激你能提供的任何解决方案
我知道我可以删除第一个字符,但为什么会发生这种情况?我做错什么了吗
更多信息:
我的猜测是,如果您在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);
}