Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/351.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,如何将文件从服务器发送到客户端 我有一个服务器和一个客户端,两者都可以互相发送消息。 当我在我的客户机上发送一个请求时,它会向我的服务器发送一条消息,我的服务器会在它的文件系统上创建一个文件,并每行将它发送到我的客户机 客户: socket = new Socket(InetAddress.getByName(address), Integer.parseInt(port)); writer = new PrintWriter(new OutputStreamWriter(socket.getO

如何将文件从服务器发送到客户端

我有一个服务器和一个客户端,两者都可以互相发送消息。 当我在我的客户机上发送一个请求时,它会向我的服务器发送一条消息,我的服务器会在它的文件系统上创建一个文件,并每行将它发送到我的客户机

客户:

socket = new Socket(InetAddress.getByName(address), Integer.parseInt(port));
writer = new PrintWriter(new OutputStreamWriter(socket.getOutputStream()), true);
writer.println("GD"); // GD stands for get data
服务器:

ServerSocket serverSocket = new ServerSocket(Integer.parseInt(port), 0, InetAddress.getByName(address));
socket = serverSocket.accept();
OutputStream writer = socket.getOutputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));

// SNIP - readline happens in a thread etc. Not important

String line = reader.readLine();

if("GD".equals(line)) {
    File dataFile = getDataFile();

    BufferedReader br = new BufferedReader(new FileReader(dataFile));
    String line;

    while(null != (line = br.readLine())) {
        writer.send("FD;" + line);
        // FD stands for file data so my client knows that it's a line from the requested file
    }
}
如果我的文件很大(比如说几十万行),这意味着我的服务器需要每行发送数据。更不用说它必须在发送字符串之前读取文件并使用其内存存储字符串。感觉效率很低

我想知道是否有一种方法可以在不浪费这么多资源的情况下将文件从服务器发送到客户端。有人能帮我吗


简而言之:我可以从服务器向客户端发送文件,而不必流式传输文件并每行发送。

除非您需要操作行(您似乎插入了字符“FD;”),否则为什么不将字节缓冲区从一个流复制到另一个流

类似于

byte[] buffer = new byte[8*1024]
int len;
while ( (len= in.read(buffer)) > 0 ) out.write(buffer, 0, len);
根据您的网络条件调整缓冲区大小

现在,伊姆霍,不要浪费你的时间做这些。抓取优秀的、经过优化的,然后执行
IOUtils.copy(in,out)


(编辑)顺便说一下,在不指定编码方式的情况下操作行/字符串是对非ascii文件错误的重新处理。

资源浪费在哪里?有5k行的文件并不少见。另外,您的代码似乎还不错。好吧,让我们假设我的文件要大得多。如果我将来收到一个不寻常的文件,我不想遇到任何问题。我看不到打乒乓球、请求-响应消息的理由。它对这个问题重要吗?@Val不,不重要,它是更大应用程序的一部分。我真正要问的唯一一件事是,是否有一种方法可以将我的数据从我的服务器发送到我的客户机,而不必通过我的文件并逐行发送它的内容。所以,你基本上要求一个函数副本(stream1,stream2)?如果它存在,我不认为泛型函数会在每一行前面加上“FD”前缀。