0

ディレクトリからファイルを読み取り、Javaのネストされたforループ内のファイルを比較します。最初のファイルは比較されますが、残りは同じでも「同じではない」と表示されます。ループ内で何かを調整して、null値やポインターが送信されないようにする必要があることはわかっています。

  File Directory = new File (location);
  File files[] = Directory.listFiles();

  for (File f : files)
  {   

     for (File g : files) 
     {
         br = new BufferedReader (new FileReader (f));
         while(( z = br.readLine()) != null)  s1+= z;

         br2 = new BufferedReader (new FileReader (g));   
         while ((y = br2.readLine()) != null) s2 += y;

         System.out.println();

      //     System.out.println(s1);   

      //   System.out.println(f.getName() + "=" + g.getName());

          if (s1.equals(s2)) {
         System.out.println(f.getName() + "=" + g.getName());
         System.out.println( "Content of both files are same");

     }
    else {
         System.out.println(f.getName() + "!=" + g.getName());
         System.out.println("Content of both files are not same"); 
     }

     }
4

5 に答える 5

4

s1同じandに追加し続けますs2。つまり、最初のいくつかのファイルの後、常に前のファイルの内容がそこにあります。ファイルを開くときに、おそらくそれらをクリアしたいと思うでしょう。

fまた、おそらく外側のループでの読み取りを移動する必要があります。毎回読んでも意味がありません。

これを高速化する方法は他にもあります。たとえば、各ファイルの内容をハッシュしてから、実際にファイルの各ペアの比較を開始する前にハッシュを比較するか、より簡単に、最初にファイルのサイズを比較します (サイズが異なる 2 つのファイル)。 (egf.length()と で与えられるg.length()) は同じになることはありません。

(コメントに答えるために編集)

2 つの同一ファイルのいずれかを削除する場合は、Windle のコメントに従って、同じファイルのペアを 2 回比較しないようにすることをお勧めします。そうすれば、 とが同じf場合はいつでも削除できます。ファイルを削除するには、 を使用します。fgFile.delete()

ファイルのコピーに関しては、これを見てみることができます: Javaでファイルをコピーする標準的な簡潔な方法? 宛先ファイルの名前を作成するには、このコンストラクター を使用できます。

于 2013-02-28T14:14:25.760 に答える
2

s1どこにも表示されず、s2宣言されていません。内側の foreach ループ内で宣言する必要があります。それ以外の場合は、すべてのファイルの内容を ses 文字列に連結します。

あなたのアルゴリズムは非常に非効率的で、新しい行を考慮していませんが、それは別の話です。

于 2013-02-28T14:16:22.620 に答える
1

ソリューションを修正して、正しく高速に保つようにしました。これを試して。

StringBuffer s1 = new StringBuffer();
StringBuffer s2 = new StringBuffer();
for (int i = 0 ; i < files.length ; i++ )
 {   
     File f = files[i];
     s1 = new StringBuffer();
     br = new BufferedReader (new FileReader (f));
     while(( z = br.readLine()) != null)  s1.append(z);


  for (int j = i+1 ; j < files.length ; j++ )
    {
File g = files[j]  ;         
     s2 = new StringBuffer();
     br2 = new BufferedReader (new FileReader (g));   
     while ((y = br2.readLine()) != null) s2.append(y);

     System.out.println(" ");

     if (s1.equals(s2)) {
        System.out.println(f.getName() + "=" + g.getName());
        System.out.println( "Content of both files are same");

        // To write file to a new directory pass the new path and the file as String to the method as given below.
        writeToFile(newPath, s2);

        // To delete the file use the below statement.
        g.delete();
                 }
    else {
        System.out.println(f.getName() + "!=" + g.getName());
       System.out.println("Content of both files are not same"); 
     }

 }



 private void writeToFile(String fileName, String data) throws IOException{
     FileWriter fstream = new FileWriter(fileName);
      BufferedWriter out = new BufferedWriter(fstream);
      out.write(data);
      out.flush();
      out.close();
}
于 2013-02-28T14:19:58.900 に答える
1

s1 と s2 に行を追加し続けると、同じでない最初のファイルにヒットすると、s1 と s2 は二度と同じにはなりません。さらに、この連結は実際には必要ありません。一度に 2 つの行を比較して、等しくない最初の行でブレークして false を返さないのはなぜですか?

于 2013-02-28T14:32:02.067 に答える
0

この例を見てみましょう。ディレクトリAに 、BCおよびの 4 つのファイルがあるとしますD

あなたのコードがしようとしているlocationのは、同じディレクトリ内のすべてのファイルとすべてのファイルを比較することです。

つまり、 、、および とA比較されます。、などと比較されます。ABCDBABCD

この例では、ファイルが等しいと判断される唯一のケースは、Aを と比較した場合A、を .Bと比較した場合Bです。

16したがって、ここで行われる比較の合計4のうち、それらのファイルは等しいという結果になり、残りは等しくないとマークされます。

結果として、「同じ」出力よりも「同じではない」出力の方が期待できるはずです。

于 2013-02-28T14:27:55.273 に答える