使用 Java InputStream 复制文件时如何创建不存在的 folders/subdirectories?
How do you create non-existing folders/subdirectories when copying a file with Java InputStream?
我已经使用 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");
这 returns 一个 NullPointerException 错误。通过输出流执行复制过程时如何创建所有丢失的目录?
您可以使用 Files.createDirectories:
Files.createDirectories(Paths.get("C:\javatest\javanewfolder"));
此外,您可以使用 Files.copy
复制文件)
首先,如果可能,我建议您使用 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);
如果需要,您可以在 File 和 Path 之间转换。但是,您将丢失文件系统信息:
final Path path1 = file1.toPath();
final File file2 = path2.toFile();
我已经使用 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");
这 returns 一个 NullPointerException 错误。通过输出流执行复制过程时如何创建所有丢失的目录?
您可以使用 Files.createDirectories:
Files.createDirectories(Paths.get("C:\javatest\javanewfolder"));
此外,您可以使用 Files.copy
复制文件)
首先,如果可能,我建议您使用 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);
如果需要,您可以在 File 和 Path 之间转换。但是,您将丢失文件系统信息:
final Path path1 = file1.toPath();
final File file2 = path2.toFile();