在平時的開發(fā)中陕靠,為了測試方便蛉艾,經(jīng)常會用到從文件中讀取數(shù)據(jù)作為字符串的操作,這里主要記錄Java讀取文件的幾種方法胧卤。
注意:以下方法主要是為了在debug的時候mock數(shù)據(jù)使用绍昂,如果文件過大啦粹,可能會導(dǎo)致OOM,慎用
1. 通過 BufferedReader 方式讀取
通過BufferedReader
的readLine
方法逐行讀取
/**
* 通過BufferedReader讀取
* @param path 文件的本地絕對路徑
* @return
*/
public static String readAsString(String path) {
try {
BufferedReader reader = new BufferedReader(new FileReader(path));
StringBuilder stringBuilder = new StringBuilder();
String line = null;
String ls = System.getProperty("line.separator");
while ((line = reader.readLine()) != null) {
stringBuilder.append(line);
stringBuilder.append(ls);
}
// 刪除最后一個新行分隔符
stringBuilder.delete(stringBuilder.length() - ls.length(), stringBuilder.length());
reader.close();
String content = stringBuilder.toString();
return content;
}catch (Exception exception){
logger.error("readAsString error,path={},exception={}", path, ExceptionUtils.getStackTrace(exception));
return null;
}
}
2. 通過BufferedReader和char數(shù)組的方式
/**
* 通過BufferedReader和char數(shù)組的方式
* @param path 文件的本地絕對路徑
* @return
*/
public static String readAsString2(String path) {
try {
BufferedReader reader = new BufferedReader(new FileReader(path));
StringBuilder stringBuilder = new StringBuilder();
char[] buffer = new char[1024];
int len = -1;
while ((len = reader.read(buffer)) != -1) {
stringBuilder.append(new String(buffer, 0, len));
buffer = new char[1024];
}
reader.close();
String content = stringBuilder.toString();
return content;
}catch (Exception exception){
logger.error("readAsString2 error,path={},exception={}", path, ExceptionUtils.getStackTrace(exception));
return null;
}
}
3. 通過FileInputStream和byte數(shù)組
/**
* 通過FileInputStream和byte數(shù)組
* @param path 文件的本地絕對路徑
* @return
*/
public static String readAsString3(String path) {
try {
FileInputStream fis = new FileInputStream(path);
byte[] buffer = new byte[1024];
StringBuilder sb = new StringBuilder();
int len = -1;
while ((len = fis.read(buffer)) != -1) {
sb.append(new String(buffer, 0, len));
buffer = new byte[1024];
}
fis.close();
String content = sb.toString();
return content;
}catch (Exception exception){
logger.error("readAsString3 error,path={},exception={}", path, ExceptionUtils.getStackTrace(exception));
return null;
}
}
4. 通過Files的readAllBytes方法
/**
* 通過Files的readAllBytes方法
* @param path 文件的本地絕對路徑
* @return
*/
public static String readAsString4(String path) {
try {
String content = new String(Files.readAllBytes(Paths.get(path)));
return content;
}catch (Exception exception){
logger.error("readAsString4 error,path={},exception={}", path, ExceptionUtils.getStackTrace(exception));
return null;
}
}
5. 通過Scanner類讀取
/**
* 通過Scanner類讀取
* @param path
* @return
*/
public static String readAsString5(String path) {
try {
Scanner scanner = new Scanner(Paths.get(path), StandardCharsets.UTF_8.name());
String content = scanner.useDelimiter("\\A").next();
scanner.close();
return content;
} catch (Exception exception) {
logger.error("readAsString5 error,path={},exception={}", path, ExceptionUtils.getStackTrace(exception));
return null;
}
}
6.通過Apache Commons IO FileUtils讀取
需要先添加maven依賴
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.11.0</version>
</dependency>
/**
* 通過Apache Commons IO FileUtils類讀取
* 需要依賴commons-io包
*
* @param path 文件的本地絕對路徑
* @return
*/
public static String readAsString6(String path) {
try {
String content = FileUtils.readFileToString(new File(path), StandardCharsets.UTF_8);
return content;
} catch (Exception exception) {
logger.error("readAsString6 error,path={},exception={}", path, ExceptionUtils.getStackTrace(exception));
return null;
}
}
7. git倉庫
倉庫地址:
https://gitee.com/huangchunhua13/hch-tools/blob/master/src/main/java/org/example/util/FileUtil.java