我编写了一个函数,该函数接受BufferedImage并将其与硬盘驱动器中预先存在的图像进行比较,以检查它们是否相同。
public boolean checkIfSimilarImages(BufferedImage imgA, File B) {
DataBuffer imgAdata = imgA.getData().getDataBuffer();
int sizeA = imgAdata.getSize();
BufferedImage imgB = null;
try {
imgB = ImageIO.read(B);
} catch (IOException ex) {
Logger.getLogger(SupportClass.class.getName()).log(Level.SEVERE, null, ex);
}
DataBuffer imgBdata = imgB.getData().getDataBuffer();
int sizeB = imgBdata.getSize();
if(sizeA == sizeB) {
for(int i = 0; i < sizeA; i++) {
if (imgAdata.getElem(i) != imgBdata.getElem(i)) {
return false;
}
}
}
return true;
}
这将引发IOException“无法读取输入文件”。知道为什么会这样。我正在这样调用函数...
while(support.checkIfSimilarImages(currentDisplay, new File(pathToOriginalImage)) == false) {
System.out.println("Executing while-loop!");
bot.delay(3000);
currentDisplay = bot.createScreenCapture(captureArea);
}
哪里
String pathToOriginalImage = "C:\\Users\\Chandrachur\\Desktop\\Home.jpg";
我可以看到该路径有效。但是,当我在checkIfSimilarImages函数中测试File.exists()或File.canRead()或File.absoluteFile()。exists()时,一切都返回false。
我研究了问题here,并尝试了以下建议:
不仅在这个位置,我尝试了许多其他位置,但徒劳无功。同样,在我具有隐藏文件扩展名的情况下也不是问题,实际文件可能是Home.jpg.jpg。
唯一的可能是权限可能不同。我真的不知道如何验证这一点,但是没有理由它应该具有一些Java无法读取的权限。这只是另一个普通的jpg文件。
可能是因为我正在将文件对象引用传递到函数中,所以在此过程中以某种方式修改了引用或其他内容。我只是不知道。我已经没有足够的能力来测试...
整个堆栈跟踪如下:
javax.imageio.IIOException: Can't read input file!
at javax.imageio.ImageIO.read(ImageIO.java:1301)
at battlesbot.SupportClass.checkIfSimilarImages(SupportClass.java:77)
at battlesbot.AutomatedActions.reachHomeScreen(AutomatedActions.java:72)
at battlesbot.BattlesBot.main(BattlesBot.java:22)
Exception in thread "main" java.lang.NullPointerException
at battlesbot.SupportClass.checkIfSimilarImages(SupportClass.java:81)
at battlesbot.AutomatedActions.reachHomeScreen(AutomatedActions.java:72)
at battlesbot.BattlesBot.main(BattlesBot.java:22)
C:\Users\Chandrachur\AppData\Local\NetBeans\Cache\8.2\executor-snippets\run.xml:53: Java returned: 1
BUILD FAILED (total time: 11 seconds)
我在Windows 10上,IDE是NetBeans。
更新: 非常感谢@ k5_。他告诉我将其粘贴到路径中,并且可以正常工作。
"C:/Users/Chandrachur/Desktop/Home.jpg";
似乎有些看不见的字符在路上。但是我还是不明白那是什么意思。
答案 0 :(得分:1)
通常,这种问题与文件名中的访问问题或错字有关。
在这种情况下,文件名中包含一些不可见的Unicode字符x202A。复制文件路径的Windows对话框将其用于书写方向(从左到右)。
显示它们的一种方式是此循环,它在String的开头具有4个不可见的字符。您还将在调试器中看到它们。
String x = "C:\\Users\\Chandrachur\\Desktop\\Home.jpg";
for(char c : x.toCharArray()) {
System.out.println( c + " " + (int) c);
}