当前位置: 首页 > news >正文

JAVA读取/解析 指定文件内容

一、读取resources资源目录下的指定文件内容

读取文件可以分为两步:

第一步,找到指定文件,并将其转换成输入流

第二步,读取流的信息

二、getResouce 和  getResourceAsStream 区别

共同点:这两个方法都必须传入资源路径,可以是绝对路径,也可以是相对路径。

绝对路径  就是编译生成的classes目录作为根路径,以 " / " 开头就表示从根路径开始。

相对路径  就是从当前类所在的路径开始。

getResouce方法 返回一个URL,它用来标记这个资源地址。如果是URL为null,就说明资源路径写错了,资源不存在。

getResourceAsStream 返回 一个inputStream输入流,如果输入流为null,就说明资源路径写错了,资源不存在。当你只需要拿到输入流,不需要知道资源具体位置,就可以使用getResourceAsStream方法。

方式一:使用第三方工具类IOUtils,读取输入流

Apache Commons IO 是一个Apache基金会维护的JAVA库,提供了一些工具类对文件进行操作。需要注意的是,Commons IO 要避免使用 2.7 之前的版本,低版本存在安全漏洞 ,且可能出现不会主动释放流的问题,可以去Maven仓库查看最新的版本。

<dependency>
      <groupId>commons-io</groupId>
      <artifactId>commons-io</artifactId>
      <version>2.7</version>
</dependency>

以 绝对路径 的方式获取输入流

使用Apache Commons IO 提供的IOUtils工具类,读取文件内容

import org.apache.commons.io.IOUtils;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.nio.charset.StandardCharsets;

@Component
public class APayClient {

    public APayClient() {
        //当前类所在路径
        System.out.println("当前类所在路径:" + APayClient.class.getResource("").getPath());

        //绝对路径
        System.out.println("指定绝对路径:" + APayClient.class.getResource("/importFile").getPath());

        //如果文件路径指定错误,获取到的就是空
        URL absolutePath = APayClient.class.getResource("/noPath");
        if (absolutePath == null) {
            System.out.println("不存在指定路径的资源");
        }

        InputStream inputStream = APayClient.class.getResourceAsStream("/importFile/UMR.sql");
        if (inputStream == null) {
            System.out.println("inputStream流不存在");
        }

        String querysql = null;
        try {
            //使用IOUtils工具类,读取文件内容
            querysql = IOUtils.toString(
                    APayClient.class.getResourceAsStream("/importFile/query.sql"), StandardCharsets.UTF_8
            );

        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        System.out.println("读取到的SQL语句为:" + querysql);
    }
}

控制台打印结果如下,可以看见正常读取到文件的信息

方式二:自定义工具类,读取输入流

 在web包下新增一个子包ddl,并在子包存放【1.sql】资源文件

sql包含以下内容 

因为资源文件(1.sql)没有直接放在resouces资源目录下,导致maven在编译的时候,是不会自动将除了class文件以外的资源放到classes目录下,所以,需要我们在pom文件配置以下信息。

<build>
    <resources>
       <resource>
          <directory>src/main/java</directory>
              <includes>
                  <include>**/*.sql</include>
              </includes>
        </resource>
     </resources>
</build>

自定义工具类FileUtils,读取文件内容

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;

public class FileUtils {
    /**
     * 将文件流转为字符串
     *
     * @param inputStream
     * @return
     */
    public static String getStringByInputStream(InputStream inputStream) {
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        try {
            byte[] b = new byte[10240];
            int n;
            while ((n = inputStream.read(b)) != -1) {
                outputStream.write(b, 0, n);
            }
            return outputStream.toString();
        } catch (Exception e) {
            throw new RuntimeException("解析文件失败");
        } finally {
            try {
                outputStream.close();
                if (inputStream != null) {
                    inputStream.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

以 相对路径 的方式获取输入流

ADemo类所在的位置作为起始位置

import java.io.InputStream;

public class ADemo {
    public static void main(String[] args) throws Exception {
        //使用相对路径的方式:以ADemo作为起始路径,找到文件流
        InputStream inputStream = ADemo.class.getResourceAsStream("ddl/1.sql");
        String sql = FileUtils.getStringByInputStream(inputStream);
        System.out.println("获取到的SQL语句 " + sql);
    }
}

控制台打印结果如下

相关文章:

  • 使用 Spring Security的一些常用功能
  • 众乐影音-安卓NAS-Player的安装和设置说明
  • Beyond Compare 4注册激活方法
  • 农用车一键启动工作原理
  • docker简单使用
  • 如何使用jenv工具管理多个JDK版本
  • 4、匿名函数lambda的使用
  • 从碎片化到标准化:案例详解 MCP 如何重塑 AI Agent 开发生态?
  • 嵌入式基础知识学习:UART是什么?
  • Elasticsearch:可配置的推理 API 端点分块设置
  • 并查集——108. 冗余连接
  • Fourier-Lerobot——把斯坦福人形动作策略iDP3封装进了Lerobot(含我司七月人形研发落地实践)
  • HCL—我与虚拟机的爱恨情仇[特殊字符][特殊字符]‍[特殊字符]️
  • C++ --- 多态
  • 破解PDF转Word难题:如何选择高效、安全的转换工具?
  • C++核心语法快速整理
  • 【redis】事务详解,相关命令multi、exec、discard 与 watch 的原理
  • 操作系统核心问题解析(目的/定位、管理思想:先描述,再组织、 库函数与系统调用的关系)
  • 使用 ncurses 库创建文本用户界面:基础函数详解
  • RK3588开发笔记-DDR4降频实战与系统稳定性优化
  • 伊朗外长:伊美第四轮间接谈判将于5月3日举行
  • 国铁集团去年收入12830亿元增3%,全年铁路运输利润总额创新高
  • 经营业绩持续稳中向好,国铁集团2024年度和2025年一季度财务决算公布
  • 吴志朴当选福建德化县人民政府县长
  • 徐徕任上海浦东新区副区长,此前已任区委常委
  • 美国通过《删除法案》:打击未经同意发布他人私密图像,包括“深度伪造”