【发布时间】:2018-08-07 16:04:49
【问题描述】:
我编写了一个函数,它接收一个 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";
路径中似乎有一些不可见的字符。但我还是不明白这是什么意思。
【问题讨论】:
-
使用双斜杠而不是单斜杠
-
或使用单斜杠 (/),Java 将转换为您的操作系统。
-
我试过 /, //, \\ 但没有区别
-
I have hidden file extensions and the actual file might be Home.jpg.jpg,您是否尝试了文件名Home.jpg.jpg的路径? -
刚才试过了,还是不行。此外,我通过右键单击然后属性和安全选项卡(Windows)下的第一件事来获取文件路径。它有完整的路径,没有任何类似的混淆。所以我很确定路径是正确的。