相关疑难解决方法(0)

使用Java重命名文件

我们可以重命名文件说test.txttest1.txt

如果test1.txt存在,它会重命名吗?

如何将其重命名为现有的test1.txt文件,以便将test.txt的新内容添加到其中以供以后使用?

java rename file file-rename

163
推荐指数
10
解决办法
39万
查看次数

Windows上是否可以重命名原子文件(带覆盖)?

在POSIX系统上,rename(2)提供原子重命名操作,包括覆盖目标文件(如果存在)以及权限是否允许.

有没有办法在Windows上获得相同的语义?我知道Vista和Server 2008上的MoveFileTransacted(),但我需要它来支持Win2k及更高版本.

这里的关键词是原子 ......解决方案不能以任何方式使操作失败,使操作处于不一致状态.

我见过很多人说在win32上这是不可能的,但我问你,是不是真的?

如果可能,请提供可靠的引用.

windows winapi posix

62
推荐指数
6
解决办法
2万
查看次数

如何在Windows上用Java创建 - 然后 - 原子重命名文件?

我正在尝试在Windows上使用Java 正确实现"写临时文件并重命名" .

如何在Java中以原子方式重命名文件,即使dest文件已存在?建议重命名文件是"原子操作"(无论"原子"实际上是什么意思). /sf/answers/1439967791/建议编写tmp文件并重命名是跨平台的,并确保最终文件不存在或可由其他进程处理.

所以我试着实际实现这种方法.以下是我的尝试摘要.对于实际问题 - 跳到底部.

写方法

我试着写和重命名文件的各种方法(contentcharsetStringCharset分别对应).

使用java.nio.file.Files:

Files.copy(new ByteArrayInputStream(content.getBytes(charset)), tmpFile);
Files.move(tmpFile, finalFile, StandardCopyOption.ATOMIC_MOVE);
Run Code Online (Sandbox Code Playgroud)

使用番石榴(14)和java.io.File:

com.google.common.io.Files.write(content, tmpFile, charset);
tmpFile.renameTo(finalFile);
Run Code Online (Sandbox Code Playgroud)

或者甚至更模糊的方法:

try (OutputStream os = new FileOutputStream(tmpFile);
        Writer writer = new OutputStreamWriter(os, charset)) {
    writer.write(content);
}
Runtime.getRuntime().exec(
        new String[] { "cmd.exe", "/C", "move " + tmpFile + " " + finalFile }).waitFor();
Run Code Online (Sandbox Code Playgroud)

阅读方法

现在假设另一个线程(线程因为我在测试中,在现实生活中它可能是另一个进程)正在执行以下版本的代码之一:

具有共同功能:

void waitUntilExists() throws InterruptedException {
    while (!java.nio.file.Files.exists(finalFile)) { …
Run Code Online (Sandbox Code Playgroud)

java windows file-io atomicity

7
推荐指数
1
解决办法
1504
查看次数

标签 统计

java ×2

windows ×2

atomicity ×1

file ×1

file-io ×1

file-rename ×1

posix ×1

rename ×1

winapi ×1