文件相对路径与绝对路径

前言:

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

相关推荐
Leaf吧2 分钟前
分布式定时任务(xxl-job)
java·分布式
纪元A梦14 分钟前
华为OD机试真题——绘图机器(2025A卷:100分)Java/python/JavaScript/C++/C/GO最佳实现
java·javascript·c++·python·华为od·go·华为od机试题
钢铁男儿17 分钟前
C# 深入理解类:面向对象编程的核心数据结构
开发语言·数据结构·c#
24k小善28 分钟前
FlinkSql入门与实践
java·大数据·flink·云计算
CodeCraft Studio42 分钟前
Excel处理控件Spire.XLS系列教程:Java设置Excel活动工作表或活动单元格
java·python·excel
Doker 多克42 分钟前
Python-Django系列—部件
开发语言·python
Felven1 小时前
A. Everybody Likes Good Arrays!
数据结构·算法
江沉晚呤时1 小时前
深入解析 ASP.NET Core 中的 ResourceFilter
开发语言·c#·.net·lucene
huangyuchi.1 小时前
【C++11】Lambda表达式
开发语言·c++·笔记·c++11·lambda·lambda表达式·捕捉列表
瓯雅爱分享1 小时前
任务管理系统,Java+Vue,含源码与文档,科学规划任务节点,全程督办保障项目落地提效
java·mysql·vue·软件工程·源代码管理