我有一个处理文件内容的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())。
答案 0 :(得分:1)
我发现我的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
直接在renameTo()
对象上使用foundFiles[i]
就可以使其正常工作了。
希望这会有所帮助,但我不知道为什么第一个版本可以在Windows下运行而不是在unix下运行。
答案 1 :(得分:0)
让我们分析一下上述观察结果......
I can read foundFiles[i]: True
I can write foundFiles[i]: True
I can read file: False
I can write file: False
结果是正常的,因为 文件 对象是通过 新文件(foundFiles [i] .getName())生成的 ,但方法 getName 仅提供文件名,不包含文件路径!
通过 新文件(foundFiles [i] .getParent()+ File.separator + foundFiles [i] .getName()) 创建文件,结果那就是:
I can read foundFiles[i]: True
I can write foundFiles[i]: True
I can read file: True
I can write file: True