Rav*_*ain 1 java properties file
我从Properties.contains()...... 获得了意想不到的输出
这是我的代码......
File file = new File("C:\\ravi\\non-existing.no");
Properties pro = System.getProperties();
pro.put("file", file);
System.out.println(pro.contains(file)); //PRINTS TRUE , AS EXPECTED
File file2 = file;
System.out.println(pro.contains(file2)); //PRINTS TRUE , AS EXPECTED
File file3 = new File("C:\\ravi\\non-existing.no");
System.out.println(pro.contains(file3)); //EXPECTED FALSE , BUT PRINTS TRUE
File file4 = new File("C:\\ravi\\non.no");
System.out.println(pro.contains(file4)); //PRINTS FALSE , AS EXPECTED
我期待Properties检查是否存在File,但这似乎不起作用.有人可以帮我解释为什么file3不能像我期望的那样工作.
这是预期的,因为Properties#contains()将调用File#equals(),而后者将按fs#compare()字典顺序委托比较两个抽象路径名.即,指向同一路径的两个文件确实相等.
我认为你的问题在于:
 pro.put("file", file);
来自Java文档:
由于Properties继承自Hashtable,因此put和putAll方法可以应用于Properties对象.强烈建议不要使用它们,因为它们允许调用者插入其键或值不是字符串的条目.应该使用setProperty方法.
contains()根据Java文档,当你调用它时:
当且仅当某个键映射到此哈希表中的value参数时,返回true,由equals方法确定; 否则是假的.
你现在看到你的问题了吗?
进一步澄清:
当你这样做:System.out.println(pro.contains(file3));你最终会做file.equals(file3),因此true.
当你这样做:System.out.println(pro.contains(file4));你最终会做file.equals(file4),因此false.