Как вы создаете несуществующие папки / подкаталоги при копировании файла с помощью Java InputStream? - PullRequest
0 голосов
/ 27 марта 2019

Я использовал 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 ]

2 голосов
/ 27 марта 2019

Во-первых, если возможно, я бы рекомендовал вам использовать классы 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"), скорее всего, не будет успешным. ;)

Пожалуйста, внимательно прочитайте Javadoc!

Чтобы проверить, указывает ли путь на существующий каталог, просто пользователь:

Files.isDirectory(somePath);

При необходимости вы можете конвертировать между Файл и Путь . Однако вы потеряете информацию о файловой системе:

final Path path1 = file1.toPath();
final File file2 = path2.toFile();
2 голосов
/ 27 марта 2019

Вы можете использовать Files.createDirectories :

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

Также вы можете использовать Files.copy для копирования файла)

...