1

Javaのディレクトリ内のファイルの移動に問題があります。問題は、プログラムがなぜそのように動作するのか理解できないことです。以下は私の実際のプログラムの(わずかな)変更です。

ディレクトリのディレクトリをトラバースします。これらのトラバースされたディレクトリのそれぞれに、トラバースされたディレクトリの2つのサブディレクトリに移動したいテキストファイルがあります。これらの2つのディレクトリ(trainingDataおよびtestData)を作成します。testData30個のファイルをディレクトリに移動し、60個をディレクトリに移動したいと思いますtrainingData。この目的のために、2つのforループを作成します。

以下のコードでは、最初にファイルをに移動するループを配置しましたtrainingData。そして良いニュースは、これらの60個のファイルすべてが実際にに移動されることtrainingDataです。ただし、2番目のループは何も作成しないようです。残りの30個のファイルのいずれのファイルも移動されません。これらの30個のファイルは、引き続き元の(トラバースされた)ディレクトリに残ります。

さらに、非常に奇妙なことに、2つのループを交換すると、1つは最初に30個のファイルを移動し、もう1つはその後に移動しますが、30個のファイルは正しく移動されますがtestData、他の60個のファイルのうち30個は正しく移動されます。はディレクトリに移動されtrainingData、残りの30個のファイルは元の(トラバースされた)ディレクトリに残ります。

プログラムはまだ(部分的に)私が望むことをしません、しかし、私が2つのループの場所を交換するとき、なぜこの違い(??)がなぜなのか理解できないのが気になります。コードは同じで、同じように機能するはずですよね?

コードを調べてくれてありがとう。必要に応じて、さらにコードと説明を提供したいと思います。

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

次のように2番目のループを実行します。

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

問題は、両方のループで、同じsarrayにインデックスを付けることです。Fileファイルを物理的に移動しても、アレイから削除されることはありません。それは単にそこにとどまります。2番目のループでは、すでに移動されたファイルを移動しようとします。そのため、2番目のループでは、インデックス変数は最初のループの最終値から継続する必要があります。

また、両方のループを交換するときに、元のディレクトリから30個のファイルのみがコピーされる理由についても説明します。最初の30個はすでにコピーされているため、無視されます。残りの30は意図したとおりにコピーされます。

または、2つのループ間で別のループを実行reviews = sortedRevDir.listFiles();してループを単純にすることもできますが、これは実際には必要のない別のIO操作であるため、パフォーマンスの面で少し無駄になります。

于 2009-07-18T21:11:52.687 に答える