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);
}
}
控制台打印结果如下