1. 程式人生 > 其它 >java獲取txt檔案中以空格分割的字串

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 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檔案,所以我這裡的路徑有所不同。