Java android中通过TCP发送时文件损坏

Java android中通过TCP发送时文件损坏,java,android,file-io,tcp,Java,Android,File Io,Tcp,我正在通过TCP将文件从一个android设备发送到另一个设备。当我试图发送mp3文件时。 它成功地收到了邮件。但是文件被破坏了。(我在目标设备中获得了完全相同大小的文件)。 我的听筒是 input = new DataInputStream( clientSocket.getInputStream()); output =new DataOutputStream( clientSocket.getOutputStream()); int fileLength = input.readInt

我正在通过TCP将文件从一个android设备发送到另一个设备。当我试图发送mp3文件时。 它成功地收到了邮件。但是文件被破坏了。(我在目标设备中获得了完全相同大小的文件)。
我的听筒是

input = new DataInputStream( clientSocket.getInputStream());
output =new DataOutputStream( clientSocket.getOutputStream()); 

int fileLength = input.readInt();
System.out.println("test integer recived"+fileLength);
String actualFileName = "";
    for(int i=0;i<fileLength;i++){
    actualFileName =actualFileName+input.readChar(); 
    }
Log.d(loggerTag,"file is going to be recieved"+actualFileName  );

File file =new File("/*my file location*/"+actualFileName); 
Log.d(loggerTag,"file is going to be saved at"+file.getAbsolutePath()  );
long temp = input.readLong();
byte[] rFile = new byte[ (int) temp ];
input.read( rFile );
FileProcess.makeFile(, rFile);          
FileOutputStream outStream = new FileOutputStream(file.getAbsolutePath());
outStream.write( rFile);
Log.d(loggerTag, "file success fully recived");
outStream.close();
input=newdatainputstream(clientSocket.getInputStream());
output=newdataoutputstream(clientSocket.getOutputStream());
int fileLength=input.readInt();
System.out.println(“接收的测试整数”+文件长度);
字符串actualFileName=“”;

对于(int i=0;i,您的接收器中有:

byte[] rFile = new byte[ (int) temp ];
input.read( rFile );
无法保证您将一次性获得所有这些字节。事实上,如果通过网络发送大量字节,则不太可能。状态:

从包含的输入流中读取一定数量的字节,并将它们存储到缓冲区数组b中。实际读取的字节数作为整数返回

您想改用
readFully()
方法

byte[] rFile = new byte[ (int) temp ];
input.readFully(rFile);
这保证了字节数组被完全填满,或者如果套接字在收到那么多字节之前关闭,则会出现异常


编辑完整性:但是,请注意,如果长度超过
Integer.MAX\u VALUE
你真的被套住了。在这种情况下不太可能,但需要记住一些事情。你可以在没有
准备就绪的情况下完成()
但您需要在循环中执行此操作,并使用返回的字节数作为后续调用的偏移量。这意味着使用
int read(byte[]b,int off,int len)
循环中的读取方法。这很有用,例如,如果您想监视从套接字读取数据的进度。

它是如何损坏的?发生了什么变化?文件大小完全相同。但是md5不同。如果我发送Mp3歌曲,我将无法播放。音乐播放器显示。它已损坏。pdf也一样。但是收到了一个文本文件成功地打开了声音,就像二进制与ascii之间可能存在问题。你探索过这种可能性吗?ohhh mann…你说得对..input.readFully(rFile);完成了trickI想通过传递long来创建一个大字节数组。但是它只需要int。我们如何发送大文件?它会不会产生内存问题bcs,将整个数据作为字节保存在内存中?这是一个更长的问题:)请理解,当从套接字读取时,您只会得到总数据的一大块。。。这是网络上的一条流。您可能希望为可以添加到的缓冲区使用动态结构。例如,
列表
。将
字节[]
读到最大值,然后附加到动态结构中。然而,您不太可能希望所有的大文件都存储在内存中。在接收数据时写入磁盘更为常见,每次读取时都会附加到文件中。
byte[] rFile = new byte[ (int) temp ];
input.read( rFile );
byte[] rFile = new byte[ (int) temp ];
input.readFully(rFile);