Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.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

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中的objectinputstream从服务器多次读取文件_Java_Sockets_Networking_File Io - Fatal编程技术网

如何使用Java中的objectinputstream从服务器多次读取文件

如何使用Java中的objectinputstream从服务器多次读取文件,java,sockets,networking,file-io,Java,Sockets,Networking,File Io,如何在服务器上多次读取文件?这个代码应该工作吗?它不会在第一次循环检查中卡住吗 服务器正在像这样将其写入客户端 ObjectOutputStream oos = new ObjectOutputStream(c.getOutputStream()); ObjectInputStream ois = new ObjectInputStream(c.getInputStream()); File

如何在服务器上多次读取文件?这个代码应该工作吗?它不会在第一次循环检查中卡住吗

服务器正在像这样将其写入客户端

            ObjectOutputStream oos = new ObjectOutputStream(c.getOutputStream());
            ObjectInputStream ois = new ObjectInputStream(c.getInputStream());                

            File file = new File("lol.txt");
            if(!file.exists()){
                file.createNewFile();
            }                

            byte[] textBytes;
            while((textBytes = (byte[])ois.readObject()) != null){                  
                Files.write(file.toPath(), textBytes);                  
            }
            //do stuff...
            byte[] textBytes;
            while((textBytes = (byte[])ois.readObject()) != null){                  
                Files.write(file.toPath(), textBytes);                  
            }

不可能对套接字的
InputStream
进行可重复读取,因为它是基于缓冲区的阻塞实现,使用
描述符来指示缓冲区中的当前位置

当您从
InputStream
读取时,
描述符将移动您已读取的字节数。无法将
描述符
倒回上一个位置,因为读取的字节可能已被新接收的字节覆盖

服务器-客户端通信必须以这种方式进行 (我使用以下缩写:S->a Server,C->a Client):


不可能对套接字的
InputStream
进行可重复读取,因为它是基于缓冲区的阻塞实现,使用
描述符来指示缓冲区中的当前位置

当您从
InputStream
读取时,
描述符将移动您已读取的字节数。无法将
描述符
倒回上一个位置,因为读取的字节可能已被新接收的字节覆盖

服务器-客户端通信必须以这种方式进行 (我使用以下缩写:S->a Server,C->a Client):


c是
java.net.Socket
的实例吗?并且oos是连接到服务器套接字的
ObjectOutputStream
吗?是的,c是java.net.socket的实例,oos是连接到服务器的。注意,您的读取循环无效
readObject()
在流的末尾不返回null。它可以在任何时候编写null。您需要捕获
EOFEException
。c是
java.net.Socket
的实例吗?并且oos是连接到服务器套接字的
ObjectOutputStream
吗?是的,c是java.net.socket的实例,oos是连接到服务器的。注意,您的读取循环无效
readObject()
在流的末尾不返回null。它可以在任何时候编写null。您需要捕获
EOFEException
                byte[] fileBytes = Files.readAllBytes(fp.toPath());
                oos.writeObject(fileBytes);
                oos.flush();
C: Request file from S
S: Send file to C
C: Request file from S
S: Send file to C
(and so on)