Java - 处理大文件
Java - processing large files
我正在开发 spring mvc 应用程序。在这个时候我需要有文件下载的动作。由于 this post 我的控制器现在的操作是这样的:
@RequestMapping(value = "/file/{id}", method = RequestMethod.GET, produces=MediaType.APPLICATION_OCTET_STREAM_VALUE)
public void getFile(@PathVariable("id") int id, HttpServletResponse response) throws FileNotFoundException {
//fetch file record from database
Files file = orchService.fileFind(id);
//directory of the file is based on file ID(this is not important in this question)
InputStream inputStream = new FileInputStream(myFileDirectory);
response.setHeader("Content-Disposition", "attachment; filename=\"filename " + file.getId() + "."+file.getExtension()+"\"");
int read=0;
byte[] bytes = new byte[];
//remaining of code
}
我的问题出在 bytes
声明上。 file
有一个 long getSize()
方法可以 return 文件的大小。但我不能使用 byte[] bytes = new byte[file.getSize()];
,因为数组大小必须是整数值。我该如何解决这个问题?
我不想将整个文件复制到内存中。
使用字节缓冲区循环读取数据。读取大字节数组可能是一个性能问题。
如果您需要保存数据,请使用文件或流。
Reading a binary input stream into a single byte array in Java
使用IOUtils并只复制流(文件流到响应流)
copy(InputStream input, OutputStream output)
将字节从 InputStream 复制到 OutputStream。
copy(InputStream input, OutputStream output, int bufferSize)
使用给定大小的内部缓冲区将字节从 InputStream 复制到 OutputStream。
我正在开发 spring mvc 应用程序。在这个时候我需要有文件下载的动作。由于 this post 我的控制器现在的操作是这样的:
@RequestMapping(value = "/file/{id}", method = RequestMethod.GET, produces=MediaType.APPLICATION_OCTET_STREAM_VALUE)
public void getFile(@PathVariable("id") int id, HttpServletResponse response) throws FileNotFoundException {
//fetch file record from database
Files file = orchService.fileFind(id);
//directory of the file is based on file ID(this is not important in this question)
InputStream inputStream = new FileInputStream(myFileDirectory);
response.setHeader("Content-Disposition", "attachment; filename=\"filename " + file.getId() + "."+file.getExtension()+"\"");
int read=0;
byte[] bytes = new byte[];
//remaining of code
}
我的问题出在 bytes
声明上。 file
有一个 long getSize()
方法可以 return 文件的大小。但我不能使用 byte[] bytes = new byte[file.getSize()];
,因为数组大小必须是整数值。我该如何解决这个问题?
我不想将整个文件复制到内存中。
使用字节缓冲区循环读取数据。读取大字节数组可能是一个性能问题。
如果您需要保存数据,请使用文件或流。
Reading a binary input stream into a single byte array in Java
使用IOUtils并只复制流(文件流到响应流)
copy(InputStream input, OutputStream output)
将字节从 InputStream 复制到 OutputStream。
copy(InputStream input, OutputStream output, int bufferSize)
使用给定大小的内部缓冲区将字节从 InputStream 复制到 OutputStream。