JAVA IO流對檔案內容的修改(以BufferedReader&Writer為例)

馬思科發表於2020-12-05

# 常見問題如下


xxx.txt檔案中有100個學生,每個學生有3個資訊,分別是姓名、密碼、學院,如下:
張三
123456
計算機工程學院
李四
123123
計算機工程學院
王五
654321
......
......
......
馬六十
123321
計算機工程學院
......
......
......
高一百
321321
計算機工程學學院

此時如果要將馬六十同學的密碼123321更改為123456應該怎麼做呢?

我的方法大致如下:

第一步,找到檔案中馬六十的位置nameAddress

定義查詢方法BufferedReader findNameAddress(String name)
 

public static BufferedReader findNameAddress(String name)
	{
	    try 
	    {
		//定義檔案所處位置
		File file = new File("E:\\javadata\\xxx.txt");
		
		//Reader流分配
		FileReader fileReader = null;
		fileReader = new FileReader(file);
		BufferedReader bufferedReader = new BufferedReader(fileReader);
		
		//定義s接收檔案中每一行的內容
		String s = null;

		//返回該名字所處位置
		while((s = bufferedReader.readLine())!=null)
	  	{
		      if(name.equals(s))
		      {
		       return bufferedReader;
		      }
		}
	    }
	    catch (Exception e) 
	    {
	       // TODO: handle exception
	    }
	    return null;
	}

第二步,對密碼123321進行修改

//    修改密碼過程整體分為四步:
//    1)將原檔案除與原始密碼不同外重新複製一份新txt檔案
//    2)引入FileWriter流將原檔案覆蓋,置空
//    3)將新txt檔案重新寫入被覆蓋的原檔案中去
//    4)刪除新txt檔案

定義方法ChangePassword(BufferedReader nameAddress,String newPassword,String txtPath)

public static void ChangePassword(BufferedReader nameAddress,String newPassword,String txtPath)
	{
	    //定義一個將要複製原檔案的檔案newxxx.txt
	    String txtPathChange = "E:\\javadata\\newxxx.txt";
	    File newxxxFile = new File(txtPathChange);

	    //定義Writer&Reader流
	    FileWriter newxxxFW = null;
	    BufferedWriter newxxxBW = null;
	    FileReader xxxFR = null;
	    BufferedReader xxxBR = null;
	    try
	    {
	        //為xxx.txt分配Reader流
	        xxxFR = new FileReader(txtPath);
	        xxxBR = new BufferedReader(xxxFR);

	        //定義everyLine用於讀取檔案中每一行的內容
	        String everyLine = null;
	        //nameAddress的下一行內容就是該學生的密碼
	        String password = nameAddress.readLine();
	        //建立要複製原檔案xxx.txt的檔案newxxx.txt
	        if(!newxxxFile.exists()){newxxxFile.createNewFile();}
	        //為newxxx.txt分配Writer流
	        newxxxFW = new FileWriter(newxxxFile);
	        newxxxBW = new BufferedWriter(newxxxFW);
	        
	        //一直複製原檔案xxx.txt的內容,當到該學生的密碼一行時,將新密碼寫入newxxx.txt檔案
	        //寫入後,繼續複製原檔案xxx.txt的內容
	        while((everyLine = xxxBR.readLine())!=null)
	        {
	            //當Reader流讀到原密碼時
	            if(everyLine.equals(password))
	            {
	                everyLine = newPassword+"\n";
	                newxxxBW.write(everyLine);/* 把新密碼寫入到newxxx.txt檔案中去 */
	                newxxxBW.flush();
	            }
	            else
	            {
	                everyLine += "\n";
	                newxxxBW.write(everyLine);
		        newxxxBW.flush();
	            }
	        }
	        
	        FileWriter cleanFileWriter = null; /* 重新定義檔案,覆蓋原來的學生資訊 */
	        cleanFileWriter = new FileWriter(txtPath);

	        //為原檔案xxx.txt分配Writer流
	        FileWriter xxxFW = new FileWriter(new File(txtPath));
	        BufferedWriter xxxBW = new BufferedWriter(xxxFW);
	        //為新檔案newxxx.txt分配Reader流
	        FileReader newxxxFR = new FileReader(txtPathChange);
	        BufferedReader newxxxBR = new BufferedReader(newxxxFR);
	        // 將複製的檔案內容寫入到被清空的原檔案中去 
	        while ((everyLine = newxxxBR.readLine()) != null) 
	        {
	        	everyLine += "\n";
	        	xxxBW.write(everyLine);
	        	xxxBW.flush();
	        }
	        xxxFR.close();
	        xxxFW.close();
	        xxxBR.close();
	        xxxBW.close();
	        newxxxFR.close();
	        newxxxFW.close();
	        newxxxBR.close();
	        newxxxBW.close();
	        cleanFileWriter.close(); 
	        
	        newxxxFile.delete();
	    }
	    catch (Exception e)
	    {
		e.printStackTrace();
	    }
	  
	}

我的操作

public static void main(String[] args) {
		
		Scanner in = new Scanner(System.in);
		System.out.println("請輸入您的名字:");
		String name = in.nextLine();
		System.out.println("請輸入您的新密碼:");
		String newPassword = in.nextLine();
		findNameAddress(name);
		String adress = "E:\\javadata\\xxx.txt";
		ChangePassword(findNameAddress(name),newPassword,adress);

	}

 

 

相關文章