3

我有一个处理文件内容的 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())。

4

2 回答 2

2

我发现我的 java 应用程序有什么问题。

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

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 下运行。

于 2013-04-09T16:55:55.393 回答
0

让我们分析一下上面的观察......

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

结果是正常的,因为文件对象是通过new File(foundFiles[i].getName()) 生成的,但是getName方法只提供了文件名,没有文件路径!

通过new File(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
于 2017-04-21T10:10:54.760 回答