文件相对路径与绝对路径

前言:

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

相关推荐
wapicn99几秒前
手机归属地查询Api接口,数据准确可靠
java·python·智能手机·php
好好学习^按时吃饭7 分钟前
蓝桥杯2024年第十五届省赛真题-R 格式
算法·蓝桥杯
旧识君22 分钟前
移动端1px终极解决方案:Sass混合宏工程化实践
开发语言·前端·javascript·前端框架·less·sass·scss
hycccccch27 分钟前
Springcache+xxljob实现定时刷新缓存
java·后端·spring·缓存
手握风云-28 分钟前
优选算法的妙思之流:分治——快排专题
数据结构·算法
熬夜苦读学习36 分钟前
Linux进程信号
linux·c++·算法
郝YH是人间理想38 分钟前
OpenCV基础——傅里叶变换、角点检测
开发语言·图像处理·人工智能·python·opencv·计算机视觉
白白糖39 分钟前
二叉树 递归
python·算法·力扣
wisdom_zhe41 分钟前
Spring Boot 日志 配置 SLF4J 和 Logback
java·spring boot·logback
Tiger Z41 分钟前
R 语言科研绘图第 36 期 --- 饼状图-基础
开发语言·程序人生·r语言·贴图