通过百度和结合实际情况而写的读取TXT文本数据方法。其实读取TXT文本还有很多方法,这里只使用BufferedReader和Scanner进行读取数据。
首先,通过前台上传TXT文件,后台获取文件并且进行数据读取。前台代码使用form表单提交方式就不多说了,主要给后台的代码。
获取上传文件数据
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
MultipartFile file = entity.getValue();// 获取上传文件对象
//获取TXT文本数据
List<String> listContent = FilesUtils.scanReadFileContent(file.getInputStream());
List<Entity> entitys = new ArrayList<Entity>();
for(int i=0;i<listContent.size();i++){
String lineStr = listContent.get(i);
String [] strs = lineStr.split("\\s+");//分割字符串
//这里可能需要判断数组长度是否和字段数一致
Entityt = new Entity();
//每个字段数据都可以进行相应的判断,如长度、限制规则等
t.setName(strs[0]);
t.setLength(strs[1]);
entitys.add(t);
}
//批量插入数据库
...
}
工具类方法
/**
* 使用Scanner以行为单位读取文件,读取到最后一行
* 初步适用于文件上传读取文件数据
* @param is 文件IO流
* @author Cai_YF
* @return 最后返回一行行数据的list集合
*/
public static List<String> scanReadFileContent(InputStream is) {
Scanner scan = null;
List<String> listContent = new ArrayList<>();
try {
scan = new Scanner(is, "utf-8");//读取
String tempString = null;
while (scan.hasNextLine()) {//判断是否有数据
tempString = scan.nextLine(); // 一次读入一行
listContent.add(tempString);
}
is.close();
scan.close();
} catch (IOException e) {
e.printStackTrace();
}
return listContent;
}
/**
* 使用BufferedReader以行为单位读取文件,读取到最后一行
* 初步适用于文件上传读取文件数据
* @param is 文件IO流
* @param c 缓存 使用BufferedReader,默认每次读入(5 * 1024 * 1024)5M数据.减少IO
* @author Cai_YF
* @return 最后返回一行行数据的list集合
*/
public static List<String> readFileContent(InputStream is,int c) {
BufferedReader reader = null;
List<String> listContent = new ArrayList<>();
try {
BufferedInputStream bis = new BufferedInputStream(is);
reader = new BufferedReader(new InputStreamReader(bis, "utf-8"), c==0?5 * 1024 * 1024:c);//缓存
String tempString = null;
// 一次读入一行,直到读入null为文件结束
while ((tempString = reader.readLine()) != null) {
listContent.add(tempString);
}
is.close();
reader.close();
} catch (IOException e) {
e.printStackTrace();
}
return listContent;
}