读取文件时 ImageIO 在做什么?

What is ImageIO doing when reading a file?

我对ImageIO.read(file)有点困惑。当我尝试将 .png 文件读入 BufferedImage 时,至少在 macOS 上,焦点会移动到以我的 main class 命名的新应用程序。它出现在菜单栏中。即使我从命令行 运行 java 也是如此。

烦人的是它把焦点从我的 IDE 移开,我不得不手动 return 它。

我查看了 ImageIO.read(file) 的来源。我发现它正在调用 ImageIO.createImageInputStream(file),这就是触发此行为的原因。

我的问题是:ImageIO 实际上在做什么,为什么我的主要 class 只是在内存中加载信息时显示在菜单栏中。最重要的是,我该如何避免它?

下面的代码显示了问题。使用任何 .png 来测试它。

package misc;

import javax.imageio.ImageIO;
import javax.imageio.stream.ImageInputStream;
import java.io.File;
import java.io.IOException;

public class ReadImageTest {
    public static void main(String[] args) {
        try {
            File file = new File("out/production/resources/picture.png");
            long time = System.currentTimeMillis();
            ImageInputStream stream = ImageIO.createImageInputStream(file);
            long delay = System.currentTimeMillis() - time;
            System.out.println("stream: " + stream.length());
            System.out.println("time: " + delay/1000.0);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

Using Headless Mode in the Java SE Platform 描述什么是无头模式以及如何正确使用它。

Headless mode is a system configuration in which the display device, keyboard, or mouse is lacking. Sounds unexpected, but actually you can perform different operations in this mode, even with graphic data.

您可以通过在您的程序中添加以下选项来启用它:

-Djava.awt.headless=true

另请参阅:

  • What is the benefit of setting java.awt.headless=true?
  • How can I prevent command line java processes from stealing focus in OSX?
  • Setting java.awt.headless=true programmatically