我制作了一个java程序,它将检查目录的内容并为每个文件生成一个md5校验和。程序完成后,会将其保存为CSV文件。到目前为止,文件的查找工作完全正常,除了写入CSV时我想要只添加新检测到的文件。我认为问题在于用作密钥的md5字符串未正确找到。 以下是CSV文件的摘录:
4d1954a6d4e99cacc57beef94c80f994,uiautomationcoreapi.h; E:\工具\草莓-perl的-5.24.1.1-64 \ C \ x86_64的-W64-的mingw32 \包括\ uiautomationcoreapi.h; N / A 56ab7135e96627b90afca89199f2c708,Winerror.h中; E:\工具\草莓-perl的-5.24.1.1-64 \ C \ x86_64的-W64-的mingw32 \包括\ Winerror.h中; N / A 146e5c5e51cc51ecf8d5cd5a6fbfc0a1,msimcsdk.h; E:\工具\草莓-perl的-5.24.1.1-64 \ C \ x86_64的-W64-的mingw32 \包括\ msimcsdk.h; N / A e0c43f92a1e89ddfdc2d1493fe179646,X509.pm; E:\工具\草莓-perl的-5.24.1.1-64 \ perl的\厂商\ lib中\隐窝\ OpenSSL的\ X509.pm; N / A 正如您所看到的那样,首先是MD5作为密钥,然后是一个包含名称,位置和分数的长字符串,它将与;字符。
这里的代码应该确保只添加新的代码:
private static HashMap<String, String> map = new HashMap<String,String>();
public void UpdateCSV(HashMap<String, String> filemap) {
/*Set set = filemap.entrySet();
Iterator iterator = set.iterator();
while(iterator.hasNext()) {
Map.Entry mentry = (Map.Entry) iterator.next();
String md = map.get(mentry.getKey());
System.out.println("checking key:" + md);
if (md == null) {
String[] line = mentry.getValue().toString().split(";");
System.out.println("Adding new File:" + line[0]);
map.put(mentry.getKey().toString(), mentry.getValue().toString());
}
}*/
for (final String key : filemap.keySet()) {
String md = map.get(key.toCharArray());
if (md == null) {
System.out.println("Key was not found:" + key);
String[] line = filemap.get(key).toString().split(";");
System.out.println("Adding new File:" + line[0]);
map.put(key, filemap.get(key));
}
}
}
从评论代码中我可以看到,我已经尝试过不同的方式。 hashmap filemap是文件夹结构的当前状态。
要阅读已保存的CSV文件,请使用以下代码:
private void readCSV() {
System.out.println("Reading CSV file");
BufferedReader br = new BufferedReader(filereader);
String line = null;
try {
while ((line = br.readLine()) != null) {
String str[] = line.split(",");
for (int i = 0; i < str.length; i++) {
String arr[] = str[i].split(":");
map.put(arr[0], arr[1]);
System.out.println("just added to map" + arr[0].toString() + " with value "+ arr[0].toString() );
}
}
}
catch(java.io.IOException e) {
System.out.println("Can't read file");
}
}
因此,当我运行程序时,它会说所有文件都是新的,甚至很难在CSV中已知。那么任何人都可以帮助正确检查此密钥字符串吗?
答案 0 :(得分:0)
正如@Ben指出的那样,问题在于您在投放时使用String
作为关键字,但在获取时使用char[]
。
应该是这样的:
for (final String key : filemap.keySet()) {
map.computeIfAbsent(key, k -> {
System.out.println("Key was not found:" + k);
String[] line = filemap.get(k).toString().split(";");
System.out.println("Adding new File:" + line[0]);
return filemap.get(k);
});
}
由于您需要来自filemap
的密钥和值,因此您实际上最好迭代entrySet
。这样可以节省额外的filemap.get
s:
for (final Map.Entry<String, String> entry : filemap.entrySet()) {
final String key = entry.getKey();
final String value = entry.getValue();
map.computeIfAbsent(key, k -> {
System.out.println("Key was not found:" + k);
String[] line = value.split(";");
System.out.println("Adding new File:" + line[0]);
return value;
});
}