成都公司建设网站/哪家公司做seo
一、读取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);}
}
控制台打印结果如下