【问题标题】:Cannot find a image file that exists in java找不到java中存在的图像文件
【发布时间】: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)下的第一件事来获取文件路径。它有完整的路径,没有任何类似的混淆。所以我很确定路径是正确的。

标签: java image file debugging


【解决方案1】:

这种问题通常出在文件名中的访问问题或拼写错误。

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

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

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

【讨论】:

  • 好的,知道了。你刚刚解决了我两天的头痛问题。再次感谢,你是个天才。
猜你喜欢
  • 2016-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-30
  • 2012-10-30
  • 1970-01-01
  • 2021-01-06
相关资源
最近更新 更多