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文件,所以我这里的路径有所不同。

正文到此结束
评论插件初始化中...
Loading...