从目录中读取文件并比较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");
}
}
答案 0 :(得分:4)
您继续添加相同的s1
和s2
,这意味着在前几个文件之后,您将始终拥有之前的文件'那里的内容。您可能希望在打开文件时清除它们。
另外,您应该在外循环中移动f
的读数。每次阅读都没有意义。
还有其他方法可以加快速度,例如散列每个文件的内容,然后在实际开始比较每对文件之前比较散列,或者更容易,首先比较文件的大小 - 两个文件具有不同的大小(例如由f.length()
和g.length()
给出)将永远不会相同。
(编辑以回答评论)
如果您要删除两个相同文件中的一个,您可能需要关注Windle的评论,以确保您永远不会将同一对文件进行两次比较,然后您可以随时删除f
f
和g
是相同的。要删除文件,请使用File.delete()
。
至于复制文件,您可以尝试查看:Standard concise way to copy a file in Java? 要创建目标文件的名称,可以使用此constructor。
答案 1 :(得分:2)
我没有在任何地方看到s1
和s2
。他们应该在内部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个文件:A
,B
,C
和D
。
您的代码尝试做的是将location
中的每个文件与同一目录中的每个文件进行比较。
这意味着A
与A
,B
,C
和D
进行比较。 B
与A
,B
,C
和D
等进行比较。
通过此示例,发现文件相同的唯一情况是A
与A
进行比较,B
与B
进行比较..
因此,在这里发生的总16
次比较中,4
将导致文件相等,其余的则标记为不相等。
因此,你应该期待更多“不同”而不是“相同”的输出。