【问题标题】:java FileNotFoundExcpetion when writing image写入图像时的java FileNotFoundExcpetion
【发布时间】:2012-06-21 15:56:55
【问题描述】:

我正在尝试使用Image.IO.Write() 保存图像;我基本上已经从here 复制了标准代码,用lwjgl 截取屏幕截图。我唯一做的就是使用现有目录作为保存路径初始化文件。

当我尝试保存图像时,FileNotFoundException 被抛出。

    glReadBuffer(GL_FRONT);
    int width  = Display.getDisplayMode().getWidth();
    int height = Display.getDisplayMode().getHeight();
    int bpp = 4; // Assuming a 32-bit display with a byte each for red, green, blue, and alpha.
    ByteBuffer buffer = BufferUtils.createByteBuffer(width * height * bpp);
    glReadPixels(0, 0, width, height, GL_RGBA, GL_UNSIGNED_BYTE, buffer);

    File file = new File("res/screenshots/ss_" + Sys.getTime() + ".png"); // The file to save to.
    String format = "PNG"; // Example: "PNG" or "JPG"
    BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

    for(int x = 0; x < width; x++)
        for(int y = 0; y < height; y++)
        {
            int i = (x + (width * y)) * bpp;
            int r = buffer.get(i) & 0xFF;
            int g = buffer.get(i + 1) & 0xFF;
            int b = buffer.get(i + 2) & 0xFF;
            image.setRGB(x, height - (y + 1), (0xFF << 24) | (r << 16) | (g << 8) | b);
        }

    try {
        ImageIO.write(image, format, file);
    } catch (IOException e) { e.printStackTrace(); }

堆栈跟踪:

java.io.FileNotFoundException: res\screenshots\ss_91733792.png (The system cannot find the path specified)
    at java.io.RandomAccessFile.open(Native Method)
    at java.io.RandomAccessFile.<init>(Unknown Source)
    at javax.imageio.stream.FileImageOutputStream.<init>(Unknown Source)
    at com.sun.imageio.spi.FileImageOutputStreamSpi.createOutputStreamInstance(Unknown Source)
    at javax.imageio.ImageIO.createImageOutputStream(Unknown Source)
    at javax.imageio.ImageIO.write(Unknown Source)
    at com.va.util.Extras.takeScreenShot(Extras.java:46)
    at com.va.core.Engine.start(Engine.java:117)
    at Main.main(Main.java:26)
Exception in thread "main" java.lang.NullPointerException
    at javax.imageio.ImageIO.write(Unknown Source)
    at com.va.util.Extras.takeScreenShot(Extras.java:46)
    at com.va.core.Engine.start(Engine.java:117)
    at Main.main(Main.java:26)

【问题讨论】:

  • 有什么问题?你的问题到底是什么?
  • 显示你的代码..文件部分
  • stacktrace 也会有所帮助。
  • 1) 验证目录是否存在,并且它是可写的。 2) 验证 Java 是否正在写入您认为的目录 - 您的程序的工作目录可能不同。 3) 尝试一个完全限定的路径名​​(调试 2),如果你有疑问) 4) 确保你指定一个 filename (以及目录路径)。 5)剪切/粘贴您正在使用的实际文件路径。 6) 剪切/粘贴您看到的确切堆栈跟踪。
  • 我在之前的 2 个项目中也有相同的代码,并且运行良好。我尝试查看我的文件夹设置,它看起来不错。我认为这可能与处理内部文件有关。

标签: java image filenotfoundexception


【解决方案1】:

我假设“/res/screenshots”存在并且是可写的,对吗?

我猜你程序的当前目录可能与你预期的不同。

出于调试目的,请添加以下两行(或等效的):

  String currentDir = new File(".").getAbsolutePath();
  System.out.println ("Current directory: " + currentDir);

如果“res/screenshots”不在“currentDirectory”下,则更改代码中的相对路径。

  // EXAMPLE:
  File file = new File("../..res/screenshots/ss_" + Sys.getTime() + ".png"); 

【讨论】:

  • 谢谢。我意识到在我之前的 2 个项目中完全相同的代码不起作用,因为我是通过一个链接的项目运行它。我有一个主要的和 api。代码在 api 中,并通过 main 运行。主要没有文件夹设置,所以这可能是它不起作用的原因。
【解决方案2】:

您链接到的代码没有显示文件是如何创建的,而是将其留给程序员。

你所做的可能只是用

创建一个新的File 对象
File img = new File("path/to/file.jpg");

你的问题是,path/to文件夹不存在,ImageIO抛出FileNotFoundException

要完成这项工作,请使用

img.getParent().mkdirs();

在将img 传递给ImageIO 之前。这样可以确保文件的完整路径是可访问的。正如本文的 cmets 所述,文件本身不必存在,但 id 的路径存在。

【讨论】:

  • 我不确定他是否需要调用 createNewFile()。 javadoc 暗示它总是丢弃路径中的任何文件内容。 docs.oracle.com/javase/1.4.2/docs/api/javax/imageio/…
  • @Colin D - 我同意。 OP 不需要“createNewFile()”。
  • 谢谢大家。现在 OP 添加了一个堆栈跟踪,更明显的是路径存在问题(文件夹不存在)。我已经编辑了原始答案。
  • @npe 完全同意。很好的答案。
  • 不——如果他在错误的地方做了一个“mkdir()”怎么办?为什么每次你想写一个新文件时都要调用“mkdir()”? “mkdir()”在这里不一定是正确的方法...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-12-06
  • 2019-07-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-13
相关资源
最近更新 更多