目录
一、需求:
二、实现:
1、完成创建文件,写入文件
2、读取文件
3、删除文件
测试:
注意:
java的split方法分割字符串(分隔符如* | . ^ )及注意点
一、需求:
1、创建文件夹,以规定格式保存信息到指定文件,并存放在相应目录下
2、在保存的目录下读取拿到的文件内容
3、读取文件完毕后将文件删除
二、实现:
1、完成创建文件,写入文件
package com.cn.utils;
import com.cn.Mybatis.pojo.Student;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
/**
* @ClassName CreateFileUtils
* @Description TODO 在指定目录下存入文件
* @Author WYD
* @Date 2022/9/21 22:45
* @Version 1.0
*/
public class CreateFileUtils {
/*
* @Author WYD
* @Description //TODO 在指定路径下创建文件夹及文件
* @Date 2022/9/21
* @Param []
* @Version 1.0
* @return void
**/
public static void createFile() throws Exception {
try {
//当前系统时间
String workDateStr = formatDateToString(new Date(), "yyyyMMdd");
//本地文件地址
String loaclAddress = "E:\\file";
//文件存放路径
String realAddr = loaclAddress + File.separator + workDateStr + File.separator + "createFile";
File file = new File(realAddr);
//判断文件路径是否存在
if (!file.exists()) {
//如果不存在,则创建
file.mkdirs();
}
String fileFlagName = "FacAcceptDuebill" + workDateStr + ".FLG";
String fileDataName = "FacAcceptDuebill" + workDateStr + ".dat";
//标记文件
File fileFlag = new File(realAddr + File.separator + fileFlagName);
fileFlag.createNewFile();
//数据文件
File fileData = new File(realAddr + File.separator + fileDataName);
fileData.createNewFile();
//初始化文件信息 --》》》业务操作
List<Student> list = new ArrayList<>();
//实例化对象
Student s1 = new Student();
s1.setName("张三");
s1.setAge(19);
s1.setType("A");
Student s2 = new Student();
s2.setName("李四");
s2.setAge(12);
s2.setType("A");
list.add(s1);
list.add(s2);
//文件内容
String strFileContent = buildFileStr(list);
System.out.println("组装后的文件信息:" + strFileContent);
//新建文件
newFile(realAddr + File.separator + fileDataName, strFileContent, true);
//****写到 本地文件
Writer writer = new OutputStreamWriter(new FileOutputStream(fileData), "UTF-8");
writer.write(strFileContent);
writer.close();
} catch (Exception e) {
throw new Exception("文件写入异常");
}
}
/**
* 方法说明: 新建文件
*
* @param filePathAndName 文件路径及名称 如c:/abc/a.txt
* @param fileContent 文件内容
* @return
* @author E-mail: pengdaochang@mrhc.com.cn
* @date 2008-9-17 下午03:09:09
*/
public static void newFile(String filePathAndName, String fileContent, boolean isAppend) {
try {
String filePath = filePathAndName;
filePath = filePath.toString();
File myFilePath = new File(filePath);
if (!myFilePath.exists()) {
myFilePath.createNewFile();
}
FileWriter resultFile = new FileWriter(myFilePath, isAppend);
PrintWriter myFile = new PrintWriter(resultFile);
String strContent = fileContent;
myFile.println(strContent);
resultFile.close();
} catch (Exception e) {
System.out.println("新建目录操作出错");
e.printStackTrace();
}
}
/**
* 格式化文件 拼接文件 "|"分割开(需求)
*
* @return void
* @Author WYD
* @Description //TODO 拼接文件 "|"分割开
* @Date 2022/9/21
* @Param [resut, workDateStr]
* @Version 1.0
**/
public static String buildFileStr(List<Student> studentList) {
StringBuffer fileStr = new StringBuffer();
/************************************组装文件*****************************/
for (int i = 0; i < studentList.size(); i++) {
Student student = studentList.get(i);
String separator = "|";
fileStr.append(student.getName()).append(separator);
fileStr.append(student.getType()).append(separator);
if (i == studentList.size() - 1) {
fileStr.append(student.getAge()).append(separator);
} else {
//换行
fileStr.append(student.getAge()).append(separator).append("\r\n");
}
}
return fileStr.toString();
}
/**
* @return java.lang.String
* @Author WYD
* @Description //TODO date---> String
* @Date 2022/9/21
* @Param [date类型的日期, 格式化类型]
* @Version 1.0
**/
public static String formatDateToString(Date date, String format) {
SimpleDateFormat sdf = new SimpleDateFormat(format);
return sdf.format(date);
}
}
2、读取文件
package com.cn.utils;
import com.cn.Mybatis.pojo.Student;
import lombok.extern.log4j.Log4j2;
import java.io.*;
import java.util.*;
/**
* @ClassName ReadFileUtils
* @Description TODO 读取项目下某文件夹下的文件
* @Author WYD
* @Date 2022/9/21 23:35
* @Version 1.0
*/
@Log4j2
public class ReadFileUtils {
/**
* 读取文佳佳下的某个文件
* 1、可重新写入指定文件
* 2、可作为对象继续传递
* E:\file\20220924\createFile\FacAcceptDuebill20220924.txt
*
* @param fileData
* @throws Exception
*/
public static void readFileAndUpdateCustRisk(String fileData) throws Exception {
//TODO
// JAVA中 “|“和“.“作为分隔符分割字符串无法拆分的问题 --> "|" 和 "."在Java中有特殊的意义(这种是拆分不了的,需要转义)
String separator = "\\|";
BufferedReader reader = null;
try {
//读取文件路径
InputStream inputStream = new FileInputStream(fileData);
//设置防止乱码格式
InputStreamReader inputStreamReader = new InputStreamReader(inputStream, "utf8");
//读取文件
reader = new BufferedReader(inputStreamReader);
//创建学生集合
List<Student> list = new ArrayList<Student>();
String riskStr = "";
//标题行
String title = null;
//行数
int in = 0;
//学生对象
Student student = null;
while ((riskStr = reader.readLine()) != null) {
//每次循环创建新的学生对象
student = new Student();
//获取标题行
if (in == 0) {
title = riskStr;
System.out.println(title);
/*
* 123|sadasd|wangyandeng|lilullu|
*/
in = 1;
} else {
System.out.println(riskStr);
/*
* 张三|A|19|
* 李四|A|12|
* 王五|B|21|
*/
String[] split = riskStr.split(separator);
//设置属性
student.setName(split[0]);
student.setType(split[1]);
student.setAge(Integer.parseInt(split[2]));
list.add(student);
}
}
System.out.println(list);
/*
* [Student(name=张三, age=19, type=A), Student(name=李四, age=12, type=A), Student(name=王五, age=21, type=B)]
*/
//遍历
for (Student s : list){
System.out.println(s.getName()+"..."+s.getAge()+"..."+s.getType());
/*
* 张三...19...A
* 李四...12...A
* 王五...21...B
*/
}
//集合排序使用匿名内部类Collections
Collections.sort(list, new Comparator<Student>() {
@Override
public int compare(Student o1, Student o2) {
// TODO Auto-generated method stub
// 排序主要条件:按成绩排序
int num = o1.getAge() - o1.getAge();
return num;
}
});
//写入指定文件夹
BufferedWriter bw = new BufferedWriter(new FileWriter("E:\\file\\20220924\\createFile\\测试.txt"));
// 写入标题行
bw.write(title + "\n");
for (Student s : list) {
bw.write(s.getName()+"|"+s.getAge()+"|"+s.getType()+"|");
bw.newLine();
}
bw.close();
} catch (Exception e) {
log.error("读取失败", e);
throw new Exception("读取失败" + e.getMessage());
} finally {
if (reader != null) {
reader.close();
}
}
}
public static void main(String[] args) {
String s = "asdas|sadasd|546";
String[] split = s.split("\\|");
System.out.println(split[0]);
}
}
3、删除文件
package com.cn.utils;
import java.io.File;
/*
* @ClassName DeleteFileUtils
* @Description TODO 删除指定目录下所有的文件
* @Author WYD
* @Date 2022/9/21 22:33
* @Version 1.0
*/
public class DeleteFileUtils {
// 删除文件夹
// param folderPath 文件夹完整绝对路径
public static void delFolder(String folderPath) {
try {
// 删除完里面所有内容
delAllFile(folderPath);
String filePath = folderPath;
filePath = filePath.toString();
File myFilePath = new java.io.File(filePath);
//删除空文件夹
myFilePath.delete();
} catch (Exception e) {
e.printStackTrace();
}
}
// 删除指定文件夹下所有文件
// param path 文件夹完整绝对路径
public static boolean delAllFile(String path) {
boolean flag = false;
File file = new File(path);
if (!file.exists()) {
return flag;
}
if (!file.isDirectory()) {
return flag;
}
String[] tempList = file.list();
File temp = null;
for (int i = 0; i < tempList.length; i++) {
if (path.endsWith(File.separator)) {
temp = new File(path + tempList[i]);
} else {
temp = new File(path + File.separator + tempList[i]);
}
if (temp.isFile()) {
temp.delete();
}
if (temp.isDirectory()) {
delAllFile(path + "/" + tempList[i]);// 先删除文件夹里面的文件
delFolder(path + "/" + tempList[i]);// 再删除空文件夹
flag = true;
}
}
return flag;
}
}
测试:
import com.cn.utils.CreateFileUtils;
import com.cn.utils.DeleteFileUtils;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import java.io.IOException;
/**
* @ClassName FileTest
* @Description TODO
* @Author WYD
* @Date 2022/9/21 22:39
* @Version 1.0
*/
public class FileTest {
@Autowired
DeleteFileUtils deleteFileUtils;
@Autowired
CreateFileUtils createFileUtils;
//删除本地指定目录下的文件
@Test
public void deleteTest(){
//文件绝对路径
deleteFileUtils.delFolder("E:\\file");
System.out.println("OK");
}
//写入文件
@Test
public void createFile() throws IOException {
createFileUtils.createFile();
System.out.println("ok");
}
//读取文件
@Test
public void readHile() throws Exception{
String fileData = "E:\\file\\20220924\\createFile\\FacAcceptDuebill20220924.txt";
readFileUtils.readFileAndUpdateCustRisk(fileData);
System.out.println("ok");
}
}
注意:
java的split方法分割字符串(分隔符如* | . ^ )及注意点
1、split表达式,其实就是一个正则表达式。* | . ^ 等符号在正则表达式中属于一种有特殊含义的字符,如果使用此种字符作为分隔符,必须使用转义符即\加以转义。
String add1="南京*建邺区";
String[] splitAdd1=add1.split("\\*");
System.out.println(splitAdd1[0]+splitAdd1[1]);
String add2="南京|建邺区";
String[] splitAdd2=add2.split("\\|");
System.out.println(splitAdd2[0]+splitAdd2[1]);
String add3="南京.建邺区";
String[] splitAdd3=add3.split("\\.");
System.out.println(splitAdd3[0]+splitAdd3[1]);
String add4="南京^建邺区";
String[] splitAdd4=add4.split("\\^");
System.out.println(splitAdd4[0]+splitAdd4[1]);
2、如果使用多个分隔符则需要借助 | 符号。
String address="南京1^南京2*南京3#南京4|南京5";
String[] splitAddress=address.split("\\^|\\*|#|\\|");
System.out.println(splitAddress[0]+splitAddress[1]+splitAddress[2]+splitAddress[3]+splitAddress[4]);