【问题标题】:DeferredFileOutputStream not creating the file if the file size is lesser than threshold size limit如果文件大小小于阈值大小限制,则 DeferredFileOutputStream 不创建文件
【发布时间】:2015-09-17 19:20:43
【问题描述】:

我正在使用 DeferredFileOutputStream 将文件写入磁盘。我已将大小阈值指定为 10K,有时如果文件大小小于阈值,则文件不会进入物理位置。我认为它保留在内存中。 在这种情况下,我需要显式写入磁盘吗?

public static void main(String[] args) {
      try {
         FileOutputStream fos = new FileOutputStream(new File(
               "atest.zip"));
         DeferredFileOutputStream differedFileOutputStream = new DeferredFileOutputStream(1, new File(
               "atest.zip"));
         ZipOutputStream zos = new ZipOutputStream(differedFileOutputStream);
         String file5Name = "folder/android.pdf";
         String file1Name = "file1.txt";
         String file2Name = "file2.txt";
         String file3Name = "folder/file3.txt";
         String file4Name = "folder/file4.txt";

         addToZipFile(file1Name, zos);
         addToZipFile(file2Name, zos);
         addToZipFile(file3Name, zos);
         addToZipFile(file4Name, zos);
         zos.close();
         differedFileOutputStream.close();
      } catch (FileNotFoundException e) {
         e.printStackTrace();
      } catch (IOException e) {
         e.printStackTrace();
      }

   }
public static void addToZipFile(String fileName, ZipOutputStream zos) throws FileNotFoundException, IOException {
      System.out.println("Writing '" + fileName + "' to zip file");
      File file = new File(fileName);
      FileInputStream fis = new FileInputStream(file);
      ZipEntry zipEntry = new ZipEntry(fileName);
      zos.putNextEntry(zipEntry);

      byte[] bytes = new byte[1024];
      int length;
      while ((length = fis.read(bytes)) >= 0) {
         zos.write(bytes, 0, length);
      }

      zos.closeEntry();
      fis.close();
   }

【问题讨论】:

    标签: java fileoutputstream


    【解决方案1】:

    来自documentation

    将数据保留在内存中直到达到指定阈值的输出流,然后才将其提交到磁盘。如果在达到阈值之前关闭流,则数据根本不会写入磁盘

    然后它解释了这个类的用例:

    这个类起源于 FileUpload 处理。在这个用例中,您事先不知道要上传的文件的大小。如果文件很小,您希望将其存储在内存中(以提高速度),但如果文件很大,您希望将其存储到文件中(以避免内存问题)。

    所以答案是否定的,文件没有被写入。如果您在每种情况下都尝试写入磁盘,听起来您根本不应该使用它。您应该直接使用 FileOutputStream。

    【讨论】:

      【解决方案2】:

      没错。我找到的解决方案是,在我对所有文件进行正确处理后,检查是否达到阈值,如果没有,则将文件显式写入 OutputStream。

      public static void main(String[] args) {
            try {
               FileOutputStream fos = new FileOutputStream(new File(
                     "atest.zip"));
               DeferredFileOutputStream differedFileOutputStream = new DeferredFileOutputStream(1, new File(
                     "atest.zip"));
               ZipOutputStream zos = new ZipOutputStream(differedFileOutputStream);
               String file5Name = "folder/android.pdf";
               String file1Name = "file1.txt";
               String file2Name = "file2.txt";
               String file3Name = "folder/file3.txt";
               String file4Name = "folder/file4.txt";
      
               addToZipFile(file1Name, zos);
               addToZipFile(file2Name, zos);
               addToZipFile(file3Name, zos);
               addToZipFile(file4Name, zos);
      
      
      
        FileOutputStream fos = new FileOutputStream(new File(
                         "atest.zip"));
          if(differedFileOutputStream.isInMemory()) {
                      differedFileOutputStream.writeTo(fos);
                   }
               zos.close();
               differedFileOutputStream.close();
            } catch (FileNotFoundException e) {
               e.printStackTrace();
            } catch (IOException e) {
               e.printStackTrace();
            }
      
         }
      

      【讨论】:

        猜你喜欢
        • 2014-07-27
        • 1970-01-01
        • 2011-04-05
        • 2010-10-26
        • 2019-01-18
        • 1970-01-01
        • 1970-01-01
        • 2023-03-18
        • 1970-01-01
        相关资源
        最近更新 更多