需求是用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 s1 = new Scanner(s.next()).useDelimiter(\"\\\\s*\"); //因为助教和下一行的李铭不是空格分割的而是换行分割的,所以用nextLine方法获取助教 String str1 = s1.nextLine(); //将助教加到新文件中并以空格分割 writer.append(str1 + \" \"); //创建助教类的对象,并将姓名和职称传入有参构造中赋值 Teacher assistant1 = new Assistant(str,str1); //用对象调用类中的方法,计算助教的工资 assistant1.CalcSalary(); //添加工资到新文件中并换行 writer.append(assistant1.Salary + \"\\n\"); //同理用scanner获取讲师\\n张莉 Scanner s2 = new Scanner(s.next()).useDelimiter(\"\\\\s*\"); //str是上面换行后的李铭 str = s1.nextLine(); //str1是讲师 str1 = s2.nextLine(); //将李铭和讲师传入讲师类的有参构造函数中 Teacher lecture1 = new Lecture(str,str1); //用对象调用计算工资的方法 lecture1.CalcSalary(); //新文件中添加教师信息 writer.append(str + \" \"); writer.append(str1 + \" \"); writer.append(lecture1.Salary + \"\\n\"); //同理获取副教授\\n赵蒙 Scanner s3 = new Scanner(s.next()).useDelimiter(\"\\\\s*\"); //str是上面换行后的张莉 str = s2.nextLine(); //str1是副教授 str1 = s3.nextLine(); //将张莉和副教授添加到副教授类的有参构造方法 Teacher associateProfessor1 = new AssociateProfessor(str,str1); //用副教授类的对象调用工资计算方法 associateProfessor1.CalcSalary(); //新文件中添加教师信息 writer.append(str + \" \"); writer.append(str1 + \" \"); writer.append(associateProfessor1.Salary + \"\\n\"); //同理获取 Scanner s4 = new Scanner(s.next()).useDelimiter(\"\\\\s*\"); //str是赵蒙 str = s3.nextLine(); //str1是教授 str1 = s4.nextLine(); Teacher professor1 = new Professor(str,str1); //同理调用工资计算方法 professor1.CalcSalary(); //将教师信息添加进新文件中 writer.append(str + \" \"); writer.append(str1 + \" \"); //因为append不能添加int型,所以后面加\"\"转换为字符串 writer.append(professor1.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文件,所以我这里的路径有所不同。
来源:https://www.cnblogs.com/jingran/p/16303424.html
本站部分图文来源于网络,如有侵权请联系删除。