如何在Windows的同一目录中复制具有不同名称的文件

时间:2019-03-14 13:37:34

标签: java java-8

我一直在尝试复制文件,但是在同一Windows目录中更改了文件名,但是我不走运。

由于Windows规则,两个文件在同一目录中不能具有相同的名称,所以我不能仅将文件复制到同一目录中。

不允许我将其复制到另一个目录,然后重命名,然后将其移回同一目录。

File.class中看不到任何有用的实现。

尝试了类似的方法,但是没有用:

File file = new File(filePath);
File copiedFile = new File(filePath);
//then rename the copiedFile and then try to copy it
Files.copy(file, copiedFile);

3 个答案:

答案 0 :(得分:2)

您可以在同一目录中创建一个新文件,然后将原始文件的内容复制到重复文件中 参见:Java read from one file and write into another file using methods 有关更多信息

您还可以使用https://www.journaldev.com/861/java-copy-file

中的此代码段
private static void copyFileUsingStream(File source, File dest) throws IOException {
    InputStream is = null;
    OutputStream os = null;
    try {
        is = new FileInputStream(source);
        os = new FileOutputStream(dest);
        byte[] buffer = new byte[1024];
        int length;
        while ((length = is.read(buffer)) > 0) {
            os.write(buffer, 0, length);
        }
    } finally {
        is.close();
        os.close();
    }
}

答案 1 :(得分:2)

最初尝试使用Path作为合适的选择:

Path file = Paths.get(filePath);
String name = file.getFileName().toString();
String copiedName = name.replaceFirst("(\\.[^\\.]*)?$", "-copy$0");
Path copiedFile = file.resolveSibling(copiedName);
try {
    Files.copy(file, copiedFile);
} catch (IOException ex) {
    Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
}

答案 2 :(得分:1)

@Pierre,他的代码很完美,但这是我使用的,因此我将无法更改扩展名:

public static void copyWithDifferentName(File sourceFile, String newFileName) {
    if (sourceFile == null || newFileName == null || newFileName.isEmpty()) {
        return;
    }
    String extension = "";
    if (sourceFile.getName().split("\\.").length > 1) {
        extension = sourceFile.getName().split("\\.")[sourceFile.getName().split("\\.").length - 1];
    }
    String path = sourceFile.getAbsolutePath();
    String newPath = path.substring(0, path.length() - sourceFile.getName().length()) + newFileName;
    if (!extension.isEmpty()) {
        newPath += "." + extension;
    }
    try (OutputStream out = new FileOutputStream(newPath)) {
        Files.copy(sourceFile.toPath(), out);
    } catch (IOException e) {
        e.printStackTrace();
    }
}