gpt4 book ai didi

java - 从远程 EJB 调用返回大文件

转载 作者:搜寻专家 更新时间:2023-10-31 08:17:42 26 4
gpt4 key购买 nike

我有一个 EJB 客户端需要从 EJB 服务器 (JBoss) 检索一个大文件。

实现这一点的明显方法是服务器提供一个 EJB 门面,方法如下:

public byte[] getFile(String fileName);

这意味着,将整个文件加载到内存中,以一个字节数组的形式,然后在线路上发送这个字节数组。

问题是这种方法将整个文件加载到内存中,并且由于文件很大,它会溢出。

有什么办法可以解决这个问题吗?

最佳答案

HTTP 会是更好的选择,但话虽如此,请尝试这个序列化技巧:

import java.io.*;

public class FileContent implements Serializable {

private transient File file;

public FileContent() {
}

public FileContent(File file) {
this.file = file;
}

private void writeObject(ObjectOutputStream out) throws IOException {
// 1. write the file name
out.writeUTF(file.getAbsolutePath());

// 2. write the length
out.writeLong(file.length());

// 3. write the content
final InputStream in = new BufferedInputStream(new FileInputStream(file));
final byte[] buffer = new byte[1024];

int length;
while ((length = in.read(buffer)) != -1) {
out.write(buffer, 0, length);
}
out.flush();
in.close();
}

private void readObject(ObjectInputStream in) throws IOException, ClassNotFoundException {
// 1. read the file name
final String path = in.readUTF();

// 2. read the length
long remaining = in.readLong();

// 3. read the content
file = new File(path);
final OutputStream out = new BufferedOutputStream(new FileOutputStream(file));

final byte[] buffer = new byte[1024];

while (true) {
int length = in.read(buffer, 0, (int) Math.min(remaining, buffer.length));
if (length == -1) break;

out.write(buffer, 0, length);

remaining -= length;
if (remaining <= 0) break;
}
out.flush();
out.close();
}
}

关于java - 从远程 EJB 调用返回大文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10734229/

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