1

我在 Java 目录中移动文件时遇到问题。问题是我无法理解为什么程序的行为方式如此。下面是对我的真实程序的(轻微)修改。

我遍历目录的目录。在每个遍历的目录中都有文本文件,我想将它们移动到遍历目录的两个子目录中。我创建了这两个目录(trainingDatatestData)。我希望将 30 个文件移动到testData目录中,并将其中的 60 个文件移动到trainingData目录中。为此,我制作了两个 for 循环。

在下面的代码中,我首先将循环移动文件放入trainingData. 好消息是所有这 60 个文件都真正移入了trainingData. 然而,第二个循环似乎没有做任何事情——这 30 个剩余文件中的任何一个都没有被移动。这 30 个文件继续保留在原始(遍历)目录中。

此外,非常奇怪的是,当我交换两个循环时 - 将一个移动 30 个文件的第一个放在第一个位置,另一个放在它后面,然后 30 个文件正确移动到testData其他 60 个文件中的 30 个被移动到trainingData目录中,其余 30 个文件保留在原始(遍历)目录中。

该程序仍然没有做我想要的(只是部分),但是,让我困扰的是,当我交换两个循环的位置时,我不明白为什么会有这种差异(??)。代码是相同的,应该工作相同,不是吗?

感谢您花时间研究代码,如有必要,我愿意提供更多代码和解释。

File[] reviews = null;
for(File sortedRevDir : sortedRevDirs) {
     reviews = sortedRevDir.listFiles();
     int numFiles = 90;
     int numTwoThirds = 60;
     int numOneThirds = numFiles - numTwoThirds;     

     String trainingDir = sortedRevDir.getAbsolutePath() + "/trainingData";
     File trDir = new File(trainingDir);
     trDir.mkdir();
     String testDir = sortedRevDir.getAbsolutePath() + "/testData";
     File tsDir = new File(testDir);
     tsDir.mkdir();

     for(int i = 0; i < numTwoThirds; i++) {
         File review = reviews[i];
         if(!review.isDirectory()) {
              File reviewCopied = new File(trDir + "/" + review.getName());
              review.renameTo(reviewCopied);
         } 
     }
     for(int j = 0; j < numOneThird; j++) {
         File review = reviews[j];
         if(!review.isDirectory()) {
          File reviewCopied = new File(tsDir + "/" + review.getName());
          review.renameTo(reviewCopied);
         }
     }
 }
4

2 回答 2

2

请记住,如果您的目标目录不在同一个文件系统上,则 File.renameTo(dest) 可能(可能会)失败。

在这种情况下,您需要实现复制和删除语义;

于 2009-07-18T22:07:09.050 回答
1

执行第二个循环,如下所示:

for(int j = numTwoThirds; j < numTwoThirds + numOneThird; j++) {

问题是,在这两个循环中,您索引相同arrayFiles。当您物理移动文件时,它不会从阵列中删除。它只是停留在那里。在第二个循环中,它尝试移动已经移动的文件。这就是为什么在第二个循环中,您的索引变量必须从第一个循环中的最终值继续。

它还解释了为什么当你交换两个循环时,只从原始目录复制了 30 个文件:前 30 个被忽略,因为它们已经被复制;其余 30 个按预期复制。

或者,您可以在两个循环之间再做一次reviews = sortedRevDir.listFiles();以使循环更简单,但这在性能方面有点浪费,因为它是另一个并非真正必要的 IO 操作。

于 2009-07-18T21:11:52.687 回答