Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用套接字接收和存储文件_Java_Sockets - Fatal编程技术网

Java 如何使用套接字接收和存储文件

Java 如何使用套接字接收和存储文件,java,sockets,Java,Sockets,我正在尝试使用套接字发送文件,但当我收到文件时,我无法存储它。 调试器显示,该代码在 拜读= is.read(mybytearray,current,(mybytearray.length-current)) 什么也没发生 bytesRead=is.read(mybytearray,0,mybytearray.length); -等于17 您可以尝试直接写入OutputStream,例如将while循环更改为 while ((bytesRead = in.read(mybytearray)) &

我正在尝试使用套接字发送文件,但当我收到文件时,我无法存储它。 调试器显示,该代码在

拜读= is.read(mybytearray,current,(mybytearray.length-current))

什么也没发生

bytesRead=is.read(mybytearray,0,mybytearray.length); -等于17


您可以尝试直接写入OutputStream,例如将while循环更改为

while ((bytesRead = in.read(mybytearray)) > 0) {
    fileOutputStream.write(mybytearray, 0, bytesRead);
}
根据菜鸟回答中的描述-

您可以尝试直接写入OutputStream,例如将while循环更改为

while ((bytesRead = in.read(mybytearray)) > 0) {
    fileOutputStream.write(mybytearray, 0, bytesRead);
}
根据菜鸟回答中的描述-

因为您有一个名为FILE\u SIZE的变量,所以我假设您知道文件的大小


不要在停止获取数据之前一直从流中读取:
while(bytesRead>-1)
,您可能希望在不需要更多数据时尝试停止:
while(bytesRead>-1&¤t由于您有一个名为FILE\u SIZE的变量,我假设您知道文件的大小


不要在停止获取数据之前一直从流中读取:
while(bytesRead>-1)
,您可能希望在不需要更多数据时尝试停止:
while(bytesRead>-1&¤t正如用户Thijs Steel所暗示的,问题在于这两行:

bytesRead = is.read(mybytearray, current, (mybytearray.length - current));
if (bytesRead >= 0) current += bytesRead;
读取最后一个字节后,current就等于
mybytearray.length
(假设文件大小确实是以字节为单位的文件大小)。从那时起,您就有了一个无限循环,请求读取零字节,该循环尽职尽责地读取并返回零

将循环停止条件设置为在接收文件结尾(EOF)或读取文件大小字节后停止,但不能同时设置这两个条件

若要将EOF用作停止条件,需要修改读取循环,以便在读取中使用固定长度的字节缓冲区。若要将文件大小用作停止条件,则要简单得多。只需将inputstream包装为并使用方法,如中所示

DataInputStream dis =  new DataInputStream(is);
dis.readFully(mybytearray);

正如用户Thijs Steel所暗示的,问题在于这两行:

bytesRead = is.read(mybytearray, current, (mybytearray.length - current));
if (bytesRead >= 0) current += bytesRead;
读取最后一个字节后,current就等于
mybytearray.length
(假设文件大小确实是以字节为单位的文件大小)。从那时起,您就有了一个无限循环,请求读取零字节,该循环尽职尽责地读取并返回零

将循环停止条件设置为在接收文件结尾(EOF)或读取文件大小字节后停止,但不能同时设置这两个条件

若要将EOF用作停止条件,需要修改读取循环,以便在读取中使用固定长度的字节缓冲区。若要将文件大小用作停止条件,则要简单得多。只需将inputstream包装为并使用方法,如中所示

DataInputStream dis =  new DataInputStream(is);
dis.readFully(mybytearray);

在没有读取字节的情况下停止可能是速度非常慢时的问题connections@ThijsSteel:read永远不会返回零,除非要求它读取零字节,无论连接有多慢。如果连接速度非常慢,则在未读取字节时停止可能是一个问题connections@ThijsSteel:read从不返回零,除非要求它读取零字节,无蒙版r连接速度有多慢。这可以工作,但我写了一个稍微不同的答案。这可以工作,但我写了一个稍微不同的答案。为什么两者都不可以?如果循环停止条件是EOF(我们现在的情况)我们得到无限循环。如果循环停止条件是读取文件大小字节,那么它将无法在网络情况下停止condition@ThijsSteel:我需要澄清我的回答。我认为
文件大小
是一个常数。代码中没有提到它,从大写字母可以推断它是一个常数。为什么不两者都是?如果op停止条件为EOF(我们现在拥有的)我们得到无限循环。如果循环停止条件是读取文件大小字节,那么它将无法在网络情况下停止condition@ThijsSteel当前位置我需要澄清我的回答我认为
文件大小
是一个常量。代码中没有提到它,从大写字母可以假设它是一个常量。