2013-02-13 16 views
0

我想通过使用jsch库的sftp下载文件。我成功地做到了这一点,但我只想下载文件,如果它尚未下载。我正在收集条目列表,并尝试实施哈希集以检查它们是否已被下载。问题是,它将重复项添加到哈希集并重新下载所有文件。以下是我写的代码(以及重要部分)。HashSet正在添加重复ChannelSftp.LsEntry

Vector<ChannelSftp.LsEntry> list = sftpChannel.ls("*.gz"); 

for (ChannelSftp.LsEntry entry : list) { 
    if (set.add(entry)) { 
     sftpChannel.get(entry.getFilename(), fileDestination); 
    } 
} 

这是所有的方法。所以,当我再次调用该方法时,它应该只下载我以前没有下载过的文件。但是,这不是那样做的。有什么建议么?请让我知道是否需要澄清任何事情。

+0

这一切都取决于“等于”为“用GetFileName()” – bmargulies 2013-02-13 12:12:59

+0

1的结果值的定义)检查如何ChannelSftp .LsEntry.hashCode()和equals()方法被实现。也许这个类不适合作为散列结构键。 2)检查设定变量的范围。它真的记得以前的电话吗? – 2013-02-13 12:14:08

回答

1

而不是entry添加entry.getFilename()set

if (set.add(entry.getFilename())) { 
    sftpChannel.get(entry.getFilename(), fileDestination); 
} 

我在这里假设是什么getFilename返回String和您的应用程序允许这样的set来定义。

的原因,这个工程(如果该假设是正确的),是因为equals很好的String定义,这会不会让两人相同的名字(字符相同序列)在同一set结束。

但是,如果您不能修改set你是否应该优先于ChannelSftp.LsEntryhashCodeequals反映你的想法提出了两个LsEntry对象等于

+0

我发现这是最简单的解决方案。我只是将集合改为定义为一组字符串。谢谢。 – kaptaincooke 2013-02-13 12:47:11

1

请重写的hashCode()和equals()的重复问题方法上的HashSet