Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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_Multithreading - Fatal编程技术网

java从更多线程接收并连接文件

java从更多线程接收并连接文件,java,multithreading,Java,Multithreading,我有个问题。我想在4个套接字中发送文件,其中每个套接字都与1个线程连接。我使用的协议是TCP。我认为当我发送文件时,我会以良好的顺序在套接字上发送它。但我在接收字节并尝试将其连接到文件的一侧遇到了问题。 这是我从套接字接收字节的线程代码 long i = fromIdx; //file.seek(fromIdx); while (i < fromIdx+partLen) { int arrSize = ((i + 1000 >

我有个问题。我想在4个套接字中发送文件,其中每个套接字都与1个线程连接。我使用的协议是TCP。我认为当我发送文件时,我会以良好的顺序在套接字上发送它。但我在接收字节并尝试将其连接到文件的一侧遇到了问题。 这是我从套接字接收字节的线程代码

long i = fromIdx;
         //file.seek(fromIdx);
         while (i < fromIdx+partLen) {
            int arrSize = ((i + 1000 > fromIdx+partLen) ? (int)(fromIdx+partLen-i) : 1000);
            byte[] data = new byte[arrSize];
            input.read(data);

            synchronized(file) {
                System.out.println(i);
                file.seek(i);
                file.write(data);
                //fromIdx = file.getFilePointer();
                i += arrSize;
            }

        }
long i=fromIdx;
//seek文件(fromIdx);
而(ifromIdx+partLen)?(int)(fromIdx+partLen-i):1000);
字节[]数据=新字节[arrSize];
输入、读取(数据);
已同步(文件){
系统输出打印LN(i);
文件.seek(i);
文件写入(数据);
//fromIdx=file.getFilePointer();
i+=面积;
}
}
文件的类型为RandomAccessFile。主要问题是结果中的某些字节是零。我认为其他的都很好。我真的不知道问题出在哪里。当seek将文件指针设置在不应该的位置时,可能会出现一些同步问题,但我真的不知道

非常感谢您从以下文档中提供的答案:

从输入流读取多达len字节的数据到 字节。尝试读取多达len字节的数据,但读取的字节数较小 数字可以读取。实际读取的字节数返回为 整数


您应该始终选择chceck返回值
read
,因为不能保证(对于TCP套接字,甚至不是典型的)读取预期的字节数。

您确定每次读取都返回预期的字节数吗?在TCP的情况下,这是不保证的(甚至是典型的)。始终检查
read
的返回值。工作正常!谢谢,我也有同样的问题,伙计,使用
DataInputStream#readFully(byte[]arr)
确保它填充数组并返回,或者在EOS时出现异常,或者没有足够的数据可用。我将我的评论转化为答案。