从目录中读取文件并比较java中嵌套for循环中的文件

时间:2013-02-28 14:12:08

标签: java file file-io

从目录中读取文件并比较java中嵌套for循环中的文件。第一个文件比较,但其余的说“不一样”,即使它是相同的。我知道我必须在循环中调整一些东西以防止它发送空值,任何指针

  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"); 
     }

     }

5 个答案:

答案 0 :(得分:4)

您继续添加相同的s1s2,这意味着在前几个文件之后,您将始终拥有之前的文件'那里的内容。您可能希望在打开文件时清除它们。

另外,您应该在外循环中移动f的读数。每次阅读都没有意义。

还有其他方法可以加快速度,例如散列每个文件的内容,然后在实际开始比较每对文件之前比较散列,或者更容易,首先比较文件的大小 - 两个文件具有不同的大小(例如由f.length()g.length()给出)将永远不会相同。

(编辑以回答评论)

如果您要删除两个相同文件中的一个,您可能需要关注Windle的评论,以确保您永远不会将同一对文件进行两次比较,然后您可以随时删除f fg是相同的。要删除文件,请使用File.delete()

至于复制文件,您可以尝试查看:Standard concise way to copy a file in Java? 要创建目标文件的名称,可以使用此constructor

答案 1 :(得分:2)

我没有在任何地方看到s1s2。他们应该在内部foreach循环中声明。否则,您将把每个文件的内容连接到ses字符串。

你的算法效率非常低,并没有考虑到新的行,但这是另一个故事。

答案 2 :(得分: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();
}

答案 3 :(得分:1)

一旦你点击了不同s1的第一个文件并且s2将永远不再相同,你继续向s1和s2添加行。 另外,没有真正需要这种连接,为什么不一次只比较两行而中断并在不相等的第一行返回false?

答案 4 :(得分:0)

让我们举个例子。假设您在目录中有4个文件:ABCD

您的代码尝试做的是将location中的每个文件与同一目录中的每个文件进行比较。

这意味着AABCD进行比较。 BABCD等进行比较。

通过此示例,发现文件相同的唯一情况是AA进行比较,BB进行比较..

因此,在这里发生的总16次比较中,4将导致文件相等,其余的则标记为不相等。

因此,你应该期待更多“不同”而不是“相同”的输出。