【问题标题】:Saving BufferedImages saves images to Java Eclipse workspace instead of saving to C drive保存 BufferedImages 将图像保存到 Java Eclipse 工作区而不是保存到 C 驱动器
【发布时间】:2013-06-05 01:16:27
【问题描述】:

我在使用简单的绘图程序保存 BufferedImage 时遇到了问题。当我从绘画中保存图像时,例如我之前绘制的蛇的图片,它可以很好地保存图像,但它并没有像您想象的那样保存它。它不是将图像保存到 C:\ 驱动器(或用户可能使用的任何驱动器),而是将图像保存到 eclipse 工作区。这当然是不可接受的,因为这需要直接提供给用户的主要访问位置。这是用于保存缓冲图像的方法。

static void saveImage() {
        try {
            ImageIO.write(background, "png",
                    new File(fileName + ".png"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

所以在这里,背景显然是正在保存的图像,png 是扩展名,而 fileName 是一个字符串,它是使用先前的方法保存的,在这里并不重要。此方法将图像保存到 eclipse 工作区。这很糟糕。我们需要将其保存到默认驱动器。我该如何做到这一点?如果您需要其他任何东西来帮助您回答问题,请告诉我。

编辑:因此,根据要求,这里是更改文件名的代码。它在一个完全不同的 UI 中,因为我不确定要发布多少,所以我将发布 actionListener 和 getName() 方法。这里发生的是有一个JTextField,一旦按下JButton,就会从中提取字符串并将其用作fileName。代码如下:

`finishButton.addActionListener(new ActionListener() {
               public void actionPerformed(ActionEvent e) {
                   ProgramUI.fileName = getName();
                   ProgramUI.fileHasName = true;
                   ProgramUI.saveImage();
                   frame.dispose();
               }
        });
    }

    public String getName() {
        return nameField.getText();
    }
`

【问题讨论】:

  • 这很糟糕。问题出在fileName 值中,您说之前使用此处不重要的先前方法保存。嗯,帮助您回答这个问题很重要。请提供您如何保存此变量。
  • @LuiggiMendoza 根据要求,问题已编辑。
  • 工作区是在您的 c: 驱动器上。您需要了解启动配置中设置的绝对路径名和相对路径名的概念以及当前工作目录的概念。

标签: java save bufferedimage javax.imageio


【解决方案1】:

如果该代码保存到 Eclipse 工作区,那是因为:

  1. 您在 filename 中提供相对路径名,并且
  2. 当您在 Eclipse 中运行应用程序时,当前目录是 Eclipse 工作区目录。

尝试从命令提示符运行命令。使用相同的输入(即与您当前使用的文件名相同),它应该保存到当前目录。


不可能为您提供解决此问题的简单方法。正确的解决方案取决于您希望程序如何实际工作:

  • 您希望将文件保存在何处(即在哪个目录中)。
  • 您是否(以及如何)希望用户能够说出文件的保存位置。
  • 此应用程序是否需要可移植;即在 Windows 以外的其他东西上工作。

我建议您从阅读“当前目录”的概念开始,然后阅读 java.io.File 类的 javadoc ... 这将解释 Java 如何决定您在尝试访问时“意味着”什么文件打开一个。

【讨论】:

  • ^感谢您的建议。当我有机会时,我会阅读 IO 的 Javadoc。感谢您的帮助:D
【解决方案2】:

您在创建 File 对象时没有给出保存文件的路径。默认情况下,它会将文件保存在当前工作目录中。

试试这个:

static void saveImage() {
        try {
            ImageIO.write(background, "png",
                    new File("C:\\" + fileName + ".png"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

或者最好在方法中添加一个路径参数:

static void saveImage(String filePath) {
        try {
            ImageIO.write(background, "png",
                    new File(filePath + fileName + ".png"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

但请确保您使用正确的斜杠 (//) 获取路径

【讨论】:

  • 抛出此异常:java.io.FileNotFoundException: C:\sad_face12.png (Access is denied)
  • 正如异常所说,您的程序没有直接保存在 c 驱动器中的写入操作。最简单的检查方法是使用 File.canWrite()。尝试将文件保存到 tempdir
  • 有没有办法直接保存到用户的图片中?谢谢。
  • @user2398233 尝试使用目录路径“C:\\Users\username\My Pictures”
【解决方案3】:

为用户提供JFileChooser(如this answer 所示),以允许他们导航到路径并选择名称。

使用FileSystemView 限制路径,如here 所示。

【讨论】:

  • ^我不知道有这样的东西存在。谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-26
  • 1970-01-01
  • 1970-01-01
  • 2019-01-30
  • 1970-01-01
相关资源
最近更新 更多