如何将文件保存在内存中并读取文件输出流?
How to save file in memory and read file output stream?
当我保存文件时我使用:
File file = new File(filename);
但是,由于我不再具有写入文件夹的权限,我宁愿将其保存到内存中,然后将文件读取到 FileOutputStream。
我读过我可以用这种方法将文件保存到内存中:
new ByteArrayOutputStream();
整个代码会是什么样子?上传完成后,我无法弄清楚如何正确编写它。
编辑:我正在使用 Vaadins 上传插件:
public File file;
public OutputStream receiveUpload(String filename,
String mimeType) {
// Create upload stream
FileOutputStream fos = null; // Stream to write to
file = null;
if(StringUtils.containsIgnoreCase(filename, ".csv")){
try {
file = new File(filename);
fos = new FileOutputStream(file);
} catch (final java.io.FileNotFoundException e) {
new Notification("Error", e.getMessage(), Notification.Type.WARNING_MESSAGE)
.show(Page.getCurrent());
return null;
}
} else {
new Notification("Document is not .csv file", Notification.Type.WARNING_MESSAGE)
.show(Page.getCurrent());
return null;
}
return fos; // Return the output stream to write to
}
public OutputStream receiveUpload(String filename,
String mimeType) {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
return byteArrayOutputStream;
}
您可以使用以下方式获取流中写入的内容:
byte[] dataWrittenInTheOutputStream = byteArrayOutputStream.toByteArray();
或者你可以将内容写入另一个OutputStream:
byteArrayOutputStream.writeTo(System.out);
或者:
file = new File(filename);
fos = new FileOutputStream(file);
byteArrayOutputStream.writeTo(fos);
- 请避免使用 ByteArrayOutputStream/ByteArrayInputStream,因为它们不会分块并在内部创建巨大的数组
- 请避免使用方法
.toByteArray()
,因为它们需要额外的数组分配
- 大分配不如几个小对象分配好,因为最旧的一代将被使用。 See details in this answer.
我的建议是什么:
- 使用 okio 库中的
Buffer
class。它在内存中分块并支持 InputStream/OutputStream 绑定
- 使用异步方式读取数据以提高性能。但是,我将展示同步方式。
所以,短代码将是:
Buffer buffer = new Buffer();
buffer.readFrom(previouslyCreatedFileStream); // of course, it is better to use
buffer.writeTo(someOutputStream);
当我保存文件时我使用:
File file = new File(filename);
但是,由于我不再具有写入文件夹的权限,我宁愿将其保存到内存中,然后将文件读取到 FileOutputStream。
我读过我可以用这种方法将文件保存到内存中:
new ByteArrayOutputStream();
整个代码会是什么样子?上传完成后,我无法弄清楚如何正确编写它。
编辑:我正在使用 Vaadins 上传插件:
public File file;
public OutputStream receiveUpload(String filename,
String mimeType) {
// Create upload stream
FileOutputStream fos = null; // Stream to write to
file = null;
if(StringUtils.containsIgnoreCase(filename, ".csv")){
try {
file = new File(filename);
fos = new FileOutputStream(file);
} catch (final java.io.FileNotFoundException e) {
new Notification("Error", e.getMessage(), Notification.Type.WARNING_MESSAGE)
.show(Page.getCurrent());
return null;
}
} else {
new Notification("Document is not .csv file", Notification.Type.WARNING_MESSAGE)
.show(Page.getCurrent());
return null;
}
return fos; // Return the output stream to write to
}
public OutputStream receiveUpload(String filename,
String mimeType) {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
return byteArrayOutputStream;
}
您可以使用以下方式获取流中写入的内容:
byte[] dataWrittenInTheOutputStream = byteArrayOutputStream.toByteArray();
或者你可以将内容写入另一个OutputStream:
byteArrayOutputStream.writeTo(System.out);
或者:
file = new File(filename);
fos = new FileOutputStream(file);
byteArrayOutputStream.writeTo(fos);
- 请避免使用 ByteArrayOutputStream/ByteArrayInputStream,因为它们不会分块并在内部创建巨大的数组
- 请避免使用方法
.toByteArray()
,因为它们需要额外的数组分配 - 大分配不如几个小对象分配好,因为最旧的一代将被使用。 See details in this answer.
我的建议是什么:
- 使用 okio 库中的
Buffer
class。它在内存中分块并支持 InputStream/OutputStream 绑定 - 使用异步方式读取数据以提高性能。但是,我将展示同步方式。
所以,短代码将是:
Buffer buffer = new Buffer();
buffer.readFrom(previouslyCreatedFileStream); // of course, it is better to use
buffer.writeTo(someOutputStream);