gpt4 book ai didi

java - 将文件从服务器发送到客户端而不逐行发送

转载 作者:行者123 更新时间:2023-12-02 06:55:54 26 4
gpt4 key购买 nike

如何从服务器向客户端发送文件?

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

客户:

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);

根据您的网络条件调整缓冲区大小。

现在,恕我直言,不要浪费时间做这一切。捕获优秀的、优化的,apache commons-io并做IOUtils.copy(in, out)

(编辑)顺便说一句,在不指定编码的情况下操作行/字符串是非 ascii 文件错误的接收方。

关于java - 将文件从服务器发送到客户端而不逐行发送,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17364658/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com