java - 找不到java中存在的图像文件

标签 java image file debugging

我编写了一个函数,它接受 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";

路径中似乎有一些看不见的字符。但我还是不明白这是什么意思。

最佳答案

通常此类问题是由于访问问题或文件名中的拼写错误造成的。

在这种情况下,有一些不可见的 unicode 字符 x202A在文件名中。 Windows 对话框(从中复制文件路径)使用它们作为写入方向(从左到右)。

显示它们的一种方法是这个循环,它在字符串的开头有 4 个不可见的字符。您还会在调试器中看到它们。

    String x = "‪‪‪‪C:\\Users\\Chandrachur\\Desktop\\Home.jpg";
    for(char c : x.toCharArray()) {
        System.out.println( c + " " + (int) c);
    }

关于java - 找不到java中存在的图像文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51731117/

相关文章:

java - 如何使用java停止正在运行的批处理文件

java - 当应用程序没有 web.xml 时如何强制重定向到 HTTPS

javascript - jQuery 获取高度和宽度

C#文件写入-插入随机字符

java - 如何处理打开程序的文件

python - 遍历目录并打印每个文件的内容 [PYTHON]

java - 清理浏览器缓存

Java Jnlp CodeSigner 错误

javascript - 在浏览器中识别图像绘制完成

image - Azure:从 VM 创建镜像时 blob uri null