如果文件大小小于阈值大小限制,则DeferredFileOutputStream不会创建文件

时间:2015-09-17 19:20:44

标签: java fileoutputstream

我正在使用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();
   }

2 个答案:

答案 0 :(得分:3)

来自documentation

  

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

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

  

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

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

答案 1 :(得分:0)

多数民众赞成。我找到的解决方案是,在我找到所有文件之后,检查是否达到阈值,如果否,则将文件显式写入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();
      }

   }