使用Java InputStream复制文件时,如何创建不存在的文件夹/子目录?

时间:2019-03-27 11:54:50

标签: java nullpointerexception fileinputstream fileoutputstream

我已经使用InputStream成功地将文件从一个位置复制到另一个位置:

 public static void copy(File src, File dest) throws IOException { 
       InputStream is = null;
       OutputStream os = null; 

       try { 
           is = new FileInputStream("C:\\test.txt");
           os = new FileOutputStream("C:\\javatest\\test.txt"); 

           byte[] buf = new byte[1024]; 
           int bytesRead; 
        while ((bytesRead = is.read(buf)) > 0) { 
            os.write(buf, 0, bytesRead); 
        } 
       } finally { 
           is.close(); 
           os.close(); 
       } 
   }

当我将不存在的文件夹添加到路径中时,出现问题,例如:

os = new FileOutputStream("C:\\javatest\\javanewfolder\\test.txt"); 

这将返回NullPointerException错误。通过Output Stream执行复制过程时,如何创建所有丢失的目录?

2 个答案:

答案 0 :(得分:2)

您可以使用Files.createDirectories

Files.createDirectories(Paths.get("C:\\javatest\\javanewfolder"));

此外,您可以使用Files.copy复制文件)

答案 1 :(得分:2)

首先,如果可能的话,我建议您使用 java.nio.file 类(例如 Path ),而不是 File 基于方法。您将使用文件系统创建Path对象。如果不需要灵活性,则可以使用默认文件系统:

final String folder = ...
final String filename = ...
final FileSystem fs = FileSystems.getDefault(); 
final Path myFile fs.getPath(folder, filename);

然后通过非常方便的API轻松解决您的问题:

final Path destinationFolder = dest.getParent();
Files.createDirectories(myPath.getParent());
try (final OutputStream os = Files.newOutputStream(myFile)) {
  ...
}

如果目录已经存在,Files.createDirectories()方法将不会失败,但是由于其他原因它可能会失败。例如,如果文件“ foo / bar”存在,则Files.createDirectories(“ foo / bar / folder”)很可能 not 成功。 ;)

请仔细阅读Javadoc!

要检查路径是否指向现有目录,只需用户:

Files.isDirectory(somePath);

如果需要,可以在文件路径之间进行转换。但是,您将丢失文件系统信息:

final Path path1 = file1.toPath();
final File file2 = path2.toFile();