分享一个单纯通过java代码,无任何第三方依赖。读取文件和写入文件的工具类。
对java IO流的构建和资源的关闭已经默认实现,只需直接调用就可以对文件进行读写操作,方便你我他。
只需要引入 import java.io、 import java.util 这两个包即可。
1、读取文件
1.1、直接读取本地文件
使用 BufferedReader 进行读取,将读取数据的每一行保存到List中,最后返回List<String>对象。
/**
* 返回文件每一行组成的list
*
* @param file 文件路径
*/
public static List<String> loadFileLine(File file) {
ArrayList<String> list = new ArrayList<>();
try (BufferedReader reader =
new BufferedReader(new InputStreamReader(new FileInputStream(file)))) {
String line;
while ((line = reader.readLine()) != null) {
list.add(line);
}
} catch (IOException e) {
throw new RuntimeException("Error parsing file.", e);
}
return list;
}
也可以重写上述方法,直接传入文件路径
/**
* 返回文件每一行组成的list
*
* @param path 文件路径
*/
public static List<String> loadFileLine(String path) {
return loadFileLine(new File(path));
}
1.2、读取代码的resource目录下文件,打成jar包后方便直接加载resource的资源
利用java的类加载器 ClassLoader 读取相对目录resource中的文件数据,而不需要指定固定的绝对路径。
/**
* 加载resource目录中的文件
*
* @param name 文件名
* @return 按行封装成list
*/
public static List<String> loadResourceLine(String name) {
InputStream inputStream = ClassLoader.getSystemResourceAsStream(name);
Objects.requireNonNull(inputStream);
ArrayList<String> list = new ArrayList<>();
try (BufferedReader reader =
new BufferedReader(new InputStreamReader(inputStream))) {
String line;
while ((line = reader.readLine()) != null) {
list.add(line);
}
} catch (IOException e) {
throw new RuntimeException("Error parsing file.", e);
}
return list;
}
1.3、读取指定文件夹下固定后缀的文件数据
首先获取指定文件夹下固定后缀的文件File对象。
/**
* 遍历获取文件路径下所有指定名字结尾的文件
*
* @param file 文件夹路径
* @param suffix 结尾名
* @return 文件集合
*/
public static List<File> loadEndWithFileList(File file, String suffix) {
List<File> list = new ArrayList<>();
if (file.isFile()) {
if (file.getAbsolutePath().endsWith(suffix)) {
list.add(file);
return list;
}
}
File[] listFiles = file.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
return pathname.isDirectory() || pathname.getAbsolutePath().endsWith(suffix);
}
});
for (File f : Objects.requireNonNull(listFiles)) {
if (f.isFile()) {
list.add(f);
} else {
list.addAll(loadEndWithFileList(f, suffix));
}
}
return list;
}
/**
* 遍历获取文件路径下所有指定名字结尾的文件
*
* @param path 文件夹路径
* @param suffix 结尾名
* @return 文件集合
*/
public static List<File> loadEndWithFileList(String path, String suffix) {
return loadEndWithFileList(new File(path), suffix);
}
然后获取每一个文件的数据,返回文件路径下所有指定名字结尾的文件MAP集合,K为文件名,V为文件内容
/**
* 遍历获取文件路径下所有指定名字结尾的文件MAP集合,K为文件名,V为文件内容
*
* @param file 文件夹
* @param suffix 结尾名
* @return 文件名和内容对应Map
*/
public static Map<String, List<String>> loadEndWithFileContentMap(File file, String suffix) {
HashMap<String, List<String>> map = new HashMap<>();
List<File> fileList = loadEndWithFileList(file, suffix);
for (File f : fileList) {
map.put(getFileSimpleName(f), loadFileLine(f));
}
return map;
}
2、写入数据到文件
使用 BufferedWriter 写入数据到指定的文件中,没有则创建文件。
/**
* 写数据到文件,没有则创建
* @param file 目标文件
* @param data 数据
*/
public static void writeFile(File file, String data) {
try (BufferedWriter writer =
new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file)))) {
writer.write(data);
} catch (IOException e) {
e.printStackTrace();
}
}
3、判断文件是否存在
传入路径或者File对象,判断文件是否存在。
public static boolean exists(File file) {
return file.exists();
}
public static boolean exists(String path) {
return exists(new File(path));
}
4、工具类所有代码合集
附所有操作的工具类代码,可以直接拷贝到idea中运行。
import java.io.*;
import java.util.*;
/**
* 一个本地文件系统读写操作的工具类
* @author ket
* @since 2021-11-24
*/
public final class FileUtils {
/**
* 获取文件名的简单名字,去掉后缀
*/
public static String getFileSimpleName(File file) {
return file.getName().split("\\.")[0];
}
public static boolean exists(String path) {
return exists(new File(path));
}
public static boolean exists(File file) {
return file.exists();
}
//----------------------------------------------------------------------------------------------
// Read File
//----------------------------------------------------------------------------------------------
/**
* 加载resource目录中的文件
*
* @param name 文件名
* @return 按行封装成list
*/
public static List<String> loadResourceLine(String name) {
InputStream inputStream = ClassLoader.getSystemResourceAsStream(name);
Objects.requireNonNull(inputStream);
ArrayList<String> list = new ArrayList<>();
try (BufferedReader reader =
new BufferedReader(new InputStreamReader(inputStream))) {
String line;
while ((line = reader.readLine()) != null) {
list.add(line);
}
} catch (IOException e) {
throw new RuntimeException("Error parsing file.", e);
}
return list;
}
/**
* 返回文件每一行组成的list
*
* @param file 文件路径
*/
public static List<String> loadFileLine(File file) {
ArrayList<String> list = new ArrayList<>();
try (BufferedReader reader =
new BufferedReader(new InputStreamReader(new FileInputStream(file)))) {
String line;
while ((line = reader.readLine()) != null) {
list.add(line);
}
} catch (IOException e) {
throw new RuntimeException("Error parsing file.", e);
}
return list;
}
/**
* 返回文件每一行组成的list
*
* @param path 文件路径
*/
public static List<String> loadFileLine(String path) {
return loadFileLine(new File(path));
}
/**
* 遍历获取文件路径下所有指定名字结尾的文件
*
* @param file 文件夹路径
* @param suffix 结尾名
* @return 文件集合
*/
public static List<File> loadEndWithFileList(File file, String suffix) {
List<File> list = new ArrayList<>();
if (file.isFile()) {
if (file.getAbsolutePath().endsWith(suffix)) {
list.add(file);
return list;
}
}
File[] listFiles = file.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
return pathname.isDirectory() || pathname.getAbsolutePath().endsWith(suffix);
}
});
for (File f : Objects.requireNonNull(listFiles)) {
if (f.isFile()) {
list.add(f);
} else {
list.addAll(loadEndWithFileList(f, suffix));
}
}
return list;
}
/**
* 遍历获取文件路径下所有指定名字结尾的文件
*
* @param path 文件夹路径
* @param suffix 结尾名
* @return 文件集合
*/
public static List<File> loadEndWithFileList(String path, String suffix) {
return loadEndWithFileList(new File(path), suffix);
}
/**
* 遍历获取文件路径下所有指定名字结尾的文件内容集合
*
* @param file 文件夹
* @param suffix 结尾名
* @return 文件内容集合
*/
public static List<List<String>> loadEndWithFileContentList(File file, String suffix) {
List<List<String>> list = new ArrayList<>();
List<File> fileList = loadEndWithFileList(file, suffix);
for (File f : fileList) {
list.add(loadFileLine(f));
}
return list;
}
/**
* 遍历获取文件路径下所有指定名字结尾的文件内容集合
*
* @param path 文件夹路径
* @param suffix 结尾名
* @return 文件内容集合
*/
public static List<List<String>> loadEndWithFileContentList(String path, String suffix) {
return loadEndWithFileContentList(new File(path), suffix);
}
/**
* 将文件名和对应的文件内容写入给定的MAP中
*
* @param file 文件路径
* @param map 给定的map集合
*/
public static Map<String, List<String>> loadFileNameAndContentMap(File file, Map<String, List<String>> map) {
map.put(getFileSimpleName(file), loadFileLine(file));
return map;
}
/**
* 将文件名和对应的文件内容写入给定的MAP中
*
* @param path 文件路径
* @param map 给定的map集合
*/
public static Map<String, List<String>> loadFileNameAndContentMap(String path, Map<String, List<String>> map) {
return loadFileNameAndContentMap(new File(path), map);
}
/**
* 将文件名和对应的文件内容写入一个新的MAP中
*
* @param file 文件路径
*/
public static Map<String, List<String>> loadFileNameAndContentMap(File file) {
return loadFileNameAndContentMap(file, new HashMap<>());
}
/**
* 将文件名和对应的文件内容写入一个新的MAP中
*
* @param path 文件路径
*/
public static Map<String, List<String>> loadFileNameAndContentMap(String path) {
return loadFileNameAndContentMap(new File(path));
}
/**
* 遍历获取文件路径下所有指定名字结尾的文件MAP集合,K为文件名,V为文件内容
*
* @param file 文件夹
* @param suffix 结尾名
* @return 文件名和内容对应Map
*/
public static Map<String, List<String>> loadEndWithFileContentMap(File file, String suffix) {
HashMap<String, List<String>> map = new HashMap<>();
List<File> fileList = loadEndWithFileList(file, suffix);
for (File f : fileList) {
map.put(getFileSimpleName(f), loadFileLine(f));
}
return map;
}
/**
* 遍历获取文件路径下所有指定名字结尾的文件MAP集合,K为文件名,V为文件内容
*
* @param path 文件夹路径
* @param suffix 结尾名
* @return 文件名和内容对应Map
*/
public static Map<String, List<String>> loadEndWithFileContentMap(String path, String suffix) {
return loadEndWithFileContentMap(new File(path), suffix);
}
//----------------------------------------------------------------------------------------------
// Write File
//----------------------------------------------------------------------------------------------
/**
* 写数据到文件,没有则创建
* @param file 目标文件
* @param data 数据
*/
public static void writeFile(File file, String data) {
try (BufferedWriter writer =
new BufferedWriter(new OutputStreamWriter(new FileOutputStream(file)))) {
writer.write(data);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 写数据到文件,没有则创建
* @param file 目标文件
* @param data 数据集合
*/
public static void writeFile(File file, List<String> data) {
writeFile(file,String.join("\n",data));
}
/**
* 写数据到文件,没有则创建
* @param path 路径
* @param data 数据
*/
public static void writeFile(String path, String data) {
writeFile(new File(path), data);
}
/**
* 写数据到文件,没有则创建
* @param path 路径
* @param data 数据
*/
public static void writeFile(String path, List<String> data){
writeFile(new File(path),data);
}
private FileUtils() {
}
}