广告
返回顶部
首页 > 资讯 > 精选 >Java如何实现动态获取文件的绝对路径
  • 350
分享到

Java如何实现动态获取文件的绝对路径

2023-07-05 05:07:52 350人浏览 独家记忆
摘要

本文小编为大家详细介绍“Java如何实现动态获取文件的绝对路径”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java如何实现动态获取文件的绝对路径”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。前言我们知道在 J

本文小编为大家详细介绍“Java如何实现动态获取文件的绝对路径”,内容详细,步骤清晰,细节处理妥当,希望这篇“Java如何实现动态获取文件的绝对路径”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

    前言

    我们知道在 Java 中读取一些配置文件信息,是在开发中十分常用的要求。

    例如:这里我们使用 JDBC 实例:连接MySQL 数据库,读取连接数据库的 用户名,密码 。

    如下是一个名为 jdbc.properties 的配置文件信息,以及存在目录

    Java如何实现动态获取文件的绝对路径

    Java如何实现动态获取文件的绝对路径

    package blogs.blogs8;import java.io.FileInputStream;import java.io.IOException;import java.util.Properties;public class IORead {    public static void main(String[] args) {        FileInputStream f = null;        try {            // 创建字节输入流对象            // 在idea 中的默认相对路径是在 src 同级目录下的            f = new FileInputStream("src/blogs/blogs8/jdbc.properties");            // 创建Map集合中的 Properties 对象            Properties properties = new Properties();            properties.load(f);            // 通过 key 读取对应的键值对            String user = properties.getProperty("user");            System.out.println(user);            String passWord = properties.getProperty("password");            System.out.println(password);        } catch (IOException e) {            e.printStackTrace();        } finally {            // 关闭IO资源            if(f == null) {                try {                    f.close();                } catch (IOException e) {                    e.printStackTrace();                }            }        }    }}

    Java如何实现动态获取文件的绝对路径

    说明:

    上述的读取文件的方式,我们可以看到是 “完全没有问题的” 可以读取到对应的配置信息,但是存在一个缺点:就是移除性差。src 中是在 IDEA 这个编译器中体现的,如果是在其它的编译器中运行的时候,很大的可能会报错,原因是:这里我们使用的相对路径是,在 IDEA中的,IDEA 中的默认相对路径是 在 project 下的也就是 src 的同级目录。但是其它的系统,或者编译器就可能不是这个和 IDEA 中默认相对路径了。运行程序时,就有可能会报错:如下:找不到指定的文件。

    Java如何实现动态获取文件的绝对路径

    上述这种方式:如果我们不写相对路径,而是写绝对路径的话,也是存在一个问题的。那就是因为该绝对路径是写死了的,不是动态获取的,该路径在 windows 操作系统中是存在盘符的,所以写绝对路径的时候是需要带上盘符(E盘,D盘的),但是如果该程序是运行在其他操作系统中的话,比如 linux 操作系统中是没有盘符的说法的。所以就会出问题。无法跨平台。

    1. 优化方式一:返回一个文件的绝对路径

    接下来说一种比较通用的一种路径:即使代码换位置了,这样的代码编写的方式仍然是通用的。因为该文件的路径是动态获取的。

    在Windows中的话,就以该系统的文件规则,动态获取到的绝对路径是带盘符的,而 Linux系统中就以该系统的文件规则,获取到的绝对路径是不带盘符的。 这就可以跨平台了。

    注意: 使用该方式的前提是:所读取的文件必须是在 类路径 下才行。如果不是在类路径下,运行程序时是会报错:系统找不到指定的路径

    什么是类路径 ?

    类路径也是一种特殊的相对路径,只不过它相对的是class文件。在 IDEA 中的类路径是在 src 目录下的。重点记住它

    该方式的核心代码:

            String path = Thread.currentThread().getContextClassLoader().getResource("db.properties").getPath();

    1.1 情况一

    所读取的文件是直接存放在 src 的目录下的,该文件的并没有其它的的包。如下图所示:可以直接写文件名 + 文件名的后缀即可。

    Java如何实现动态获取文件的绝对路径

    import java.io.FileInputStream;import java.io.IOException;import java.util.Properties;public class IORead {    public static void main(String[] args) {        String path = Thread.currentThread().getContextClassLoader().getResource("db.properties").getPath();        System.out.println(path);  // 返回该文件的绝对路径:    }}

    Java如何实现动态获取文件的绝对路径

    通过该方式获取到指定文件的绝对路径,再将该绝对路径,作为参数,创建FileInputStream字节输入流对象

    import java.io.FileInputStream;import java.io.IOException;import java.util.Properties;public class IORead {    public static void main(String[] args) {        FileInputStream f = null;        try {            // 获取到该配置文件的的绝对路径            String path = Thread.currentThread().getContextClassLoader().getResource("db.properties").getPath();            //  通过该获取的文件的绝对路径创建 字节输入流对象            f = new FileInputStream(path);            // 创建Map集合中的 Properties 对象            Properties properties = new Properties();            properties.load(f);            // 通过 key 读取对应的键值对            String user = properties.getProperty("user");            System.out.println(user);            String password = properties.getProperty("password");            System.out.println(password);        } catch (IOException e) {            e.printStackTrace();        } finally {            // 关闭IO资源            if (f != null) {                try {                    f.close();                } catch (IOException e) {                    e.printStackTrace();                }            }        }    }}

    Java如何实现动态获取文件的绝对路径

    也是可以读取到文件中是在 src 目录下。

    1.2 情况二

    当所读取的文件,是在 src 目录下,但是该 src 目录下还有其他的包(目录),则不可以直接写 “文件名+ 文件后缀名”了,而是需要写明该 src 包(目录)下的 相对路径:如下图所示的文件:该路径名应该是:blogs/blogs8/jdbc.properties

    Java如何实现动态获取文件的绝对路径

    举例:

    import java.io.FileInputStream;import java.io.IOException;import java.util.Properties;public class IORead {    public static void main(String[] args) {        FileInputStream f = null;        try {            // 获取到该配置文件的的绝对路径,如下src目录下还有目录(包),需要指定 src目录下/包下的哪个文件。            String path = Thread.currentThread().getContextClassLoader().getResource("blogs/blogs8/jdbc.properties").getPath();            //  通过该获取的文件的绝对路径创建 字节输入流对象            f = new FileInputStream(path);            // 创建Map集合中的 Properties 对象            Properties properties = new Properties();            properties.load(f);            // 通过 key 读取对应的键值对            String user = properties.getProperty("user");            System.out.println(user);            String password = properties.getProperty("password");            System.out.println(password);        } catch (IOException e) {            e.printStackTrace();        } finally {            // 关闭IO资源            if (f != null) {                try {                    f.close();                } catch (IOException e) {                    e.printStackTrace();                }            }        }    }

    Java如何实现动态获取文件的绝对路径

    2. 优化方式二:返回一个 InputStream 字节输入流

    上述方式一:我们需要通过 :new 一个 FileInputStream 字节输入流对象的方式,这里我们直接通过指定的文件名的,直接返回一个 InputStream 字节输入流 ,不需要 new 。

    同样的:该读取的文件必须是在类路径下才行,这里的IDEA的类路径是 src 目录下

    核心代码如下:

    // 直接以流的形式返回。        InputStream resourceAsStream = Thread.currentThread().getContextClassLoader().                getResourceAsStream("db.properties");

    举例:

    import java.io.IOException;import java.io.InputStream;import java.util.Properties;public class IORead {    public static void main(String[] args) {        // 直接在 src目录下没有包含任何子目录,可以直接写文件名+ 后缀,而如果有子目录,需要指明子目录下的文件名+后缀名        InputStream inputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("db.properties");        // 创建 Properties 集合对象,通过流获取指定配置文件中的键值对信息        Properties properties = new Properties();        try {            properties.load(inputStream);        } catch (IOException e) {            e.printStackTrace();        }        String user = properties.getProperty("user");        System.out.println(user);        String password = properties.getProperty("password");        System.out.println(password);        // 关闭IO资源        if (inputStream != null) {            try {                inputStream.close();            } catch (IOException e) {                e.printStackTrace();            }        }    }}

    Java如何实现动态获取文件的绝对路径

    3. 优化方式三:java.util 包下提供了一个资源绑定器

    上述两个方式可以获取到任意文件的信息。

    但是以下这个方式三:就只能获取到 类路径下的以 .properties 后缀的配置文件信息了。

    java.util 包下提供了一个资源绑定器,便于获取属性.properties 配置文件中的内容。

    该资源绑定器:只能绑定 xxx.properties 配置文件 ,并且这个文件必须在 类路径下,这里的 IDEA 是 src 目录下。

    并且在写路径的时候,路径后面的扩展名不能写,写了会报错: ``。因为既然只能读取 properteis 后缀的文件,那就不用再多余的写文件后缀名了。

    如果在 src 目录下的子目录中的文件,需要指明是 src 下的哪个子目录下的文件,同样不要写文件后缀名,不然报错。

    举例:

    Java如何实现动态获取文件的绝对路径

    import java.util.ResourceBundle;public class IORead {    public static void main(String[] args) {        ResourceBundle resourceBundle = ResourceBundle.getBundle("db");        String user = resourceBundle.getString("user");        System.out.println(user);        String password = resourceBundle.getString("password");        System.out.println(password);    }}

    Java如何实现动态获取文件的绝对路径

    读到这里,这篇“Java如何实现动态获取文件的绝对路径”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网精选频道。

    --结束END--

    本文标题: Java如何实现动态获取文件的绝对路径

    本文链接: https://www.lsjlt.com/news/349714.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作