gpt4 book ai didi

java file.renameTo() 在 unix 中失败

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:09:31 26 4
gpt4 key购买 nike

我有一个处理文件内容的 java 应用程序,然后我需要将它移动到另一个位置。

这是我读取文件的方式:

    String filePath = new String("foo.bar");
String fileContents = new String("");
char[] myBuffer = new char[chunkSize];
int bytesRead = 0;
BufferedReader in;
try {
FileReader fr = new FileReader(filePath);
in = new BufferedReader(fr);
try {
while ((bytesRead = in.read(myBuffer,0,chunkSize)) != -1)
{
//System.out.println("Read " + bytesRead + " bytes. They were: " + new String(myBuffer));
fileContents+= new String(myBuffer).substring(0, bytesRead);
}
// close the stream as I don't need it anymore. (If I don't close it, then java would hold the file open thus preventing the subsequent move of the file)
in.close();
fr.close();
} catch (IOException e) {
e.printStackTrace();
return null;
}
} catch (FileNotFoundException e) {
e.printStackTrace();
return null;
}

当我关闭输入流和文件阅读器时,文件应该被关闭。

然后我尝试使用 File.renameTo(newFileName); 将文件移动到另一个目录,但这失败了(在 unix 下!,在 windows 下它工作正常)

移动失败后,我立即测试是否可以创建名为 newFileName 的文件以及是否可以删除原始文件。新文件创建成功,原文件删除失败。有趣的是,我可以在应用程序运行时(在失败后立即)从命令行删除原始文件。

知道为什么会这样吗?

更多细节:我在 unix 下工作,出于遗留原因我必须使用 java 1.6(因此我无法恢复到从 java 1.7 开始支持的 Files.move())。

最佳答案

我发现了我的 java 应用程序中的问题。

基本上,我使用自定义 FileFilter 从目录中提取文件列表。这给了我一个数组 File[] foundFiles。之后我所做的是使用问题中的代码片段在 while 循环中读取每个文件。在出于某种原因读取文件后,我立即使用数组中的第 i 个文件作为构造函数的参数创建了一个新的 File 对象

File file = new File(foundFiles[i].getName()); // File to be moved

然后我尝试重命名这个。

现在出于某种原因,这在 windows 下有效,但在 unix 下无效(我认为该文件以某种方式被 foundFiles[i] 对象锁定)。

事实上,如果我打印这些行的结果

System.out.println("I can read foundFiles[i]: " +foundFiles[i].canRead());// DEBUG
System.out.println("I can write foundFiles[i]: " +foundFiles[i].canWrite());// DEBUG
System.out.println("I can read file : " +file.canRead());// DEBUG
System.out.println("I can write file : " +file.canWrite());// DEBUG

我明白了

I can read foundFiles[i]: True
I can write foundFiles[i]: True
I can read file: False
I can write file: False

直接在 foundFiles[i] 对象上使用 renameTo() 就足以使其正常工作。

希望这有帮助,但我不知道为什么第一个版本可以在 windows 而不是 unix 下运行。

关于java file.renameTo() 在 unix 中失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15906629/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com