如何在内存中保存文件并读取文件输出流?

时间:2016-05-23 08:15:45

标签: java file vaadin java-io

当我保存文件时,我使用:

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
    }

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

  1. 请避免使用ByteArrayOutputStream / ByteArrayInputStream,因为它们没有分块并在内部创建大型数组
  2. 请避免使用方法.toByteArray(),因为它们需要额外的数组分配
  3. 大型分配不如几个较小的对象分配那么优化,因为将使用最老的一代。 See details in this answer
  4. 我的建议是什么:

    1. 使用okio库中的Buffer课程。它在内存中分块并支持InputStream / OutputStream绑定
    2. 使用异步数据读取方式来提高性能。但是,我会以同步方式显示。
    3. 所以,短代码将是:

      Buffer buffer = new Buffer();
      buffer.readFrom(previouslyCreatedFileStream); // of course, it is better to use    
      buffer.writeTo(someOutputStream);