文件相对路径与绝对路径

前言:

在写代码绘制图像的过程中,发现出现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集成为文件名中相同的部分,这样加载不同图片只需加上不同的文件名即可),在解决问题的过程中我学习了文件的相对路径和绝对路径,顺便了解了编码乱码怎么解决,收获颇丰。

相关推荐
gadiaola38 分钟前
【JVM】Java虚拟机(二)——垃圾回收
java·jvm
眼镜哥(with glasses)40 分钟前
蓝桥杯 国赛2024python(b组)题目(1-3)
数据结构·算法·蓝桥杯
крон3 小时前
【Auto.js例程】华为备忘录导出到其他手机
开发语言·javascript·智能手机
zh_xuan3 小时前
c++ 单例模式
开发语言·c++·单例模式
coderSong25683 小时前
Java高级 |【实验八】springboot 使用Websocket
java·spring boot·后端·websocket
老胖闲聊4 小时前
Python Copilot【代码辅助工具】 简介
开发语言·python·copilot
Blossom.1184 小时前
使用Python和Scikit-Learn实现机器学习模型调优
开发语言·人工智能·python·深度学习·目标检测·机器学习·scikit-learn
Mr_Air_Boy4 小时前
SpringBoot使用dynamic配置多数据源时使用@Transactional事务在非primary的数据源上遇到的问题
java·spring boot·后端
曹勖之4 小时前
基于ROS2,撰写python脚本,根据给定的舵-桨动力学模型实现动力学更新
开发语言·python·机器人·ros2
豆沙沙包?5 小时前
2025年- H77-Lc185--45.跳跃游戏II(贪心)--Java版
java·开发语言·游戏