java获取txt文件中以空格分割的字符串
需求是用java程序获取txt文件中的数据并将姓名、职称、工资添加到新txt文件中,txt文件中数据的格式是固定的,如下:
添加后的格式是这样的:
这里不考虑工资是怎么算的,只说获取数据和写入数据的方法。
教师姓名和职称之间是有空格的,而职称和下一个教师之间是有换行的。
通过查阅资料,我发现了一个特别有意思的思考方式,我写的代码如下:
public class Main {
public static void main(String[] args) throws IOException {
InputStream in = null;
InputStreamReader reader =null;
FileOutputStream fop = null;
OutputStreamWriter writer = null;
try {
//创建文件对象,路径写相对路径
File file = new File("src/teacher/teacher.txt");
//新建输入字节流
in = new FileInputStream(file);
//新建输入字符流,将字节流转为字符流
reader = new InputStreamReader(in);
//新建字符缓冲区对象,方便接收字符流数据
StringBuffer sb = new StringBuffer();
//开始循环读取字符流中的字符
while (reader.ready()) {
//往字符流对象中添加字符
sb.append((char) reader.read());
} //写入文件的文件路径,因为路径不区分大小写,所以不能和上面路径相同
File f = new File("src/Teacher.txt");
//创建FileOutputStream对象,文件不存在会自动新建
fop = new FileOutputStream(f);
//创建OutputStreamWriter对象
writer = new OutputStreamWriter(fop);
//新建scanner并规定分割条件,因为文件中是以空格分割,所以\\s*后面有空格
Scanner s = new Scanner(sb.toString()).useDelimiter("\\s* ");
//将第一个空格前字符串存起来,也就是王刚
String str = s.next();
//将王刚添加到新文件中并以空格分割
writer.append(str + " ");
//同理获取s.next()也就是助教\n李铭
Scanner s= new Scanner(s.next()).useDelimiter("\\s*");
//因为助教和下一行的李铭不是空格分割的而是换行分割的,所以用nextLine方法获取助教
String str= s1.nextLine();
//将助教加到新文件中并以空格分割
writer.append(str+ " ");
//创建助教类的对象,并将姓名和职称传入有参构造中赋值
Teacher assistant= new Assistant(str,str1);
//用对象调用类中的方法,计算助教的工资
assistant.CalcSalary();
//添加工资到新文件中并换行
writer.append(assistant.Salary + "\n");
//同理用scanner获取讲师\n张莉
Scanner s= new Scanner(s.next()).useDelimiter("\\s*");
//str是上面换行后的李铭
str = s.nextLine();
//str是讲师
str= s2.nextLine();
//将李铭和讲师传入讲师类的有参构造函数中
Teacher lecture= new Lecture(str,str1);
//用对象调用计算工资的方法
lecture.CalcSalary();
//新文件中添加教师信息
writer.append(str + " ");
writer.append(str+ " ");
writer.append(lecture.Salary + "\n");
//同理获取副教授\n赵蒙
Scanner s= new Scanner(s.next()).useDelimiter("\\s*");
//str是上面换行后的张莉
str = s.nextLine();
//str是副教授
str= s3.nextLine();
//将张莉和副教授添加到副教授类的有参构造方法
Teacher associateProfessor= new AssociateProfessor(str,str1);
//用副教授类的对象调用工资计算方法
associateProfessor.CalcSalary();
//新文件中添加教师信息
writer.append(str + " ");
writer.append(str+ " ");
writer.append(associateProfessor.Salary + "\n");
//同理获取
Scanner s= new Scanner(s.next()).useDelimiter("\\s*");
//str是赵蒙
str = s.nextLine();
//str是教授
str= s4.nextLine();
Teacher professor= new Professor(str,str1);
//同理调用工资计算方法
professor.CalcSalary();
//将教师信息添加进新文件中
writer.append(str + " ");
writer.append(str+ " ");
//因为append不能添加int型,所以后面加""转换为字符串
writer.append(professor.Salary + "");
}catch (Exception e) {
e.printStackTrace();
}finally {
//依次关闭
writer.close();
fop.close();
reader.close();
in.close();
}
}
}
这个方法将文件中获取的stringbuffer分割开,分割的方法就是用scanner这个类,其中的useDelimiter这个方法就利用参数的正则表达式去匹配符合要求的数据,然后通过next()和nextLine()方法获取空格之后和换行前的数据,然后利用append添加到新文件中,最后依次关闭流。
每一句的注释都很清楚,配合图片可以清楚的知道每行都读取了什么数据,当然,我这里数据少,所以并没有进行优化,明白这个方法的意思后就可以灵活运用提取txt文件中的数据了。
还有需要注意的就是文件路径,eclipse中teacher.txt和Teacher.txt如果在同一路径下,即使首字母大小写不同,在Teacher.txt文件不存在的情况下,也不会创建新文件而是会覆盖teacher.txt文件,所以我这里的路径有所不同。
正文到此结束
相关文章
热门推荐
评论插件初始化中...