前言:
在写代码绘制图像的过程中,发现出现can't read input file的异常,而且输出框没有绘制图片,所以寻找解决方案。先贴上之前写的简洁版绘制图像代码
1.BackGround类
java
import java.awt.image.BufferedImage;
public class BackGround {
private BufferedImage bgImage=null;
private int sort;
private boolean flag;
public BackGround(){
}
public BackGround(int sort,boolean flag) {
this.sort = sort;
this.flag = flag;
bgImage = StaticValue.bg;
}
public BufferedImage getBgImage() {
return bgImage;
}
public int getSort() {
return sort;
}
public boolean isFlag() {
return flag;
}
}
2.MyFrame类
java
import javax.swing.*;
import java.awt.*;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.io.IOException;
public class MyFrame extends JFrame implements KeyListener {
private BackGround nowBg = new BackGround();
private Image offScreenImage = null;
public MyFrame() throws IOException {
//设置窗口的大小为800 * 600
this.setSize(800,600);
//设置窗口居中显示
this.setLocationRelativeTo(null);
//设置窗口的可见性
this.setVisible(true);
//设置点击窗口上的关闭键,结束程序
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//设置窗口大小不可变
this.setResizable(false);
//向窗口对象添加键盘监听器
this.addKeyListener(this);
//设置窗口名称
this.setTitle("超级玛丽");
/*
String userDir = System.getProperty("user.dir");
System.out.println("当前工作目录: " + userDir);
*/
StaticValue.init();
nowBg=new BackGround(1,true);
repaint();
}
public void paint(Graphics g){
if (offScreenImage == null) {
offScreenImage = createImage(800,600);
}
Graphics graphics = offScreenImage.getGraphics();
graphics.fillRect(0,0,800,600);
//绘制背景
graphics.drawImage(nowBg.getBgImage(),0,0,this);
//将图像绘制到窗口中
g.drawImage(offScreenImage,0,0,this);
}
public static void main(String[] args) throws IOException {
MyFrame myFrame = new MyFrame();
}
@Override
public void keyTyped(KeyEvent e) {
}
@Override
public void keyPressed(KeyEvent e) {
}
@Override
public void keyReleased(KeyEvent e) {
}
}
3.StaticValue类
java
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class StaticValue {
public static BufferedImage bg=null;
public static String path=System.getProperty("user.dir")+"/src/bg.png";
//public static String path=System.getProperty("user.dir")+"/src/";
//public static String path="D:/BaiduNetdiskDownload/test/src/";//这里一定要用绝对路径 "/test/src/bg.png";
public static void init() {
try {
bg= ImageIO.read(new File(path+"bg.png"));
} catch (IOException e) {
e.printStackTrace();
}
}
}
4.文件组织情况如下图,其中图片png文件直接拖到src包那里就可以自动创建了。
如果先按照源代码错误的路径寻找,会出现无法读取图片资源的错误
解决:
经过查阅资料,我了解到:
1.System.getProperty("user.dir")
是 Java 中用于获取当前用户工作目录的一个方法。这个方法返回一个字符串,表示当前 Java 程序运行时的工作目录路径。我的代码出现问题的逻辑是没有处理好文件的绝对路径,代码这里System.getProperty("user.dir")+"/src/bg.png"的形式(注意只是形式,但是实际上这个代码的路径不正确)是采用工作路径加上绝对路径来读取。读取到的应该是路径而不应该是具体的文件名??
但是!改成这样就正确了:
java
public static String path="./src/";//相对路径,对
public static String path=System.getProperty("user.dir")+"/src/";//绝对路径,对
疑惑:
1.但是这些代码是错误的路径:为什么!!!!!
java
public static String path="/bg.png/";
public static String path=System.getProperty("user.dir")+"/src/bg.png";
public static String path="D:/BaiduNetdiskDownload/test/src/bg.png";
附上检查文件工作目录的方法:
java
String userDir = System.getProperty("user.dir");
System.out.println("当前工作目录: " + userDir);
2.输出是乱码形式怎么解决
已经改成utf8还是乱码
解决:
1.关于字符编码乱码,可能是因为jdk版本过高,使用的是gbk编码,只需手动把utf8改成gbk就可以了。更多修改方式如下面的连接(转载)
https://blog.csdn.net/JasonXu94/article/details/132871422
2.错误路径:
其实,IDEA中可以直接打开所在的文件路径
错因解析:注意,在ImageIO.read中,已经使用了path+bg.png,所以文件路径不需要再写bg.png这个文件名了,写了会造成重复,才会失败
或者改成这样:
心得:
从一个偶然的错误:忽略了ImageIO.read已经加上了文件名(为了省略加载多张图片要重复写路径中相同的部分,把path集成为文件名中相同的部分,这样加载不同图片只需加上不同的文件名即可),在解决问题的过程中我学习了文件的相对路径和绝对路径,顺便了解了编码乱码怎么解决,收获颇丰。