【问题标题】:How to save file in memory and read file output stream?如何将文件保存在内存中并读取文件输出流?
【发布时间】:2016-05-23 08:15:45
【问题描述】:

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

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
    }

【问题讨论】:

  • 为什么需要将其“保存”到内存中?内容在“上传完成后”内存中(可能为byte[]String
  • “整个代码是什么样子的?” 试一试,如果您有具体的问题,请回来。
  • sharobn.. 我怎样才能收集这些内容?我的代码显示为 T.J.Crowder。问题是如何在不写入磁盘的情况下收集数据并获取 FileOutputStream 数据
  • 你可以改变这个方法返回return new ByteArrayOutputStream();。您可以像使用任何其他 OutputStream 一样使用 ByteArrayOutputStream

标签: java file vaadin java-io


【解决方案1】:
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);

【讨论】:

  • 不是我需要的。我没有将文件保存到光盘。
  • 你需要什么?您如何接收数据?
  • 我不确定,这就是我想要弄清楚的 - 是否可以在不将文件保存到光盘的情况下完成。代码在示例中
  • 看起来不错,似乎我需要在没有 File 的情况下重写我的代码,因为 File 在我的其他代码段中明确需要,这种方法告诉我必须避免它
  • @DavidSN 我们如何将byteArrayOutputStream 写入记录器?任何帮助
【解决方案2】:
  1. 请避免使用 ByteArrayOutputStream/ByteArrayInputStream,因为它们不会分块并在内部创建巨大的数组
  2. 请避免使用方法.toByteArray(),因为它们需要额外的数组分配
  3. 大型分配不如几个较小的对象分配那么优化,因为将使用最旧的一代。 See details in this answer

我的建议是什么:

  1. 使用来自okio 库的Buffer 类。它在内存中分块并支持 InputStream/OutputStream 绑定
  2. 使用异步方式读取数据以提高性能。不过,我会展示同步方式。

所以,短代码将是:

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

【讨论】:

    猜你喜欢
    • 2016-07-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-16
    • 2019-03-13
    • 1970-01-01
    • 2020-11-12
    • 2020-01-05
    相关资源
    最近更新 更多