文件相对路径与绝对路径

前言:

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

相关推荐
XUE_DING_E几秒前
Educational Codeforces Round 171
算法
wwangxu几秒前
Java 面向对象基础
java·开发语言
Patience to do10 分钟前
Android Studio项目(算法计算器)
android·算法·android studio
wdxylb16 分钟前
Linux下编写第一个bash脚本
开发语言·chrome·bash
uzong18 分钟前
JDK高性能套路: 自旋(for(;;)) + CAS
java·后端
幽兰的天空19 分钟前
Python实现的简单时钟
开发语言·python
这题怎么做?!?26 分钟前
模板方法模式
开发语言·c++·算法
幽兰的天空1 小时前
简单的Python爬虫实例
开发语言·爬虫·python
带刺的坐椅1 小时前
Spring SPI、Solon SPI 有点儿像(Maven 与 Gradle)
java·spring·solon·spi