- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) >
- 教你用Java GUI實(shí)現文本文件的讀寫(xiě)
實(shí)驗要求為:
簡(jiǎn)單分析一下,可以看出這樣的要求奧,包含的要考察知識點(diǎn)主要有兩個(gè)方向:
好的小伙伴們,廢話(huà)不多說(shuō),下面就來(lái)的實(shí)現它。
首先,讓我們創(chuàng )建一個(gè)GUI界面,先秉持著(zhù)一切從簡(jiǎn)的設計思想,預計它長(cháng)這樣:
這樣的布局方式,我們可以選擇采用流布局實(shí)現,在容器中直接放入文本顯示區和兩個(gè)按鈕,適當調整窗口大小即可實(shí)現:
import java.awt.Container; import java.awt.FlowLayout; import java.awt.TextArea; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; public class GUIDemo extends JFrame{ //三個(gè)組件 private JButton saveButton; private JButton loadButton; private TextArea textArea; //容器 private Container container; public GUIDemo() { //設置title super("File Demo"); //設置流布局 setLayout(new FlowLayout()); //獲取容器 container = getContentPane(); //三個(gè)組件 textArea = new TextArea(); saveButton = new JButton("save"); loadButton = new JButton("load"); //保存文件按鈕點(diǎn)擊事件 saveButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { System.out.println("存檔成功"); } }); //讀入文件按鈕點(diǎn)擊事件 loadButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { System.out.println("讀檔成功"); } }); //裝填三個(gè)組件 container.add(textArea); container.add(loadButton); container.add(saveButton); //調整大小 setSize(500, 300); //顯示 setVisible(true); } public static void main(String[] args) { GUIDemo demo = new GUIDemo(); demo.setDefaultCloseOperation(EXIT_ON_CLOSE); } }
代碼的含義都在注釋里面,就不啰嗦講解了。
跑起來(lái)是這個(gè)樣子:
點(diǎn)擊兩下按鈕測試點(diǎn)擊事件,控制臺輸出:
好的,GUI界面設計完畢,下面來(lái)為兩個(gè)按鈕編寫(xiě)點(diǎn)擊事件。
首先要解決的一個(gè)問(wèn)題是“目標文件”。由于題目中沒(méi)有提到目標文件是否需要從文件系統中選取產(chǎn)生,那么我們不妨暫時(shí)將目標文件地址直接在代碼中,令private static final String TARGET_FILE= "./temp.txt";
那么在初始化頁(yè)面時(shí)就應該先創(chuàng )建這個(gè)文件路徑對應的file對象:
//目標文件 private File targetFile; ... //創(chuàng )建目標文件對象 targetFile = new File(TARGET_FILE); if(targetFile.createNewFile()) { System.out.println("文件不存在,創(chuàng )建成功"); }else { System.out.println("文件存在"); }
這里需要注意幾個(gè)問(wèn)題:
1.創(chuàng )建目標文件需要使用createNewFile()
方法,而非mkdir()
方法。否則會(huì )創(chuàng )建成為文件夾而非文件
2.createNewFile()方法會(huì )拋出一個(gè)IOException,為了便于處理,這里直接選擇將異常從構造方法和主方法中拋出;
處理好目標文件問(wèn)題,兩次啟動(dòng)程序,可以看到控制臺輸出:
哦吼,文件處理成功。
接著(zhù),就是在為兩個(gè)按鈕添加點(diǎn)擊事件。在下面的處理中,對于IO流的選擇,我們統一選擇字符流.
首先是讀檔按鈕,它的點(diǎn)擊事件邏輯大致為:
1.創(chuàng )建目標文件的輸入字符流
2.從輸入流中讀取文件中的內容并形成結果
3.關(guān)閉輸入流
4.將讀入的結果顯示在文本顯示區中
實(shí)現成為代碼:
//讀入文件按鈕點(diǎn)擊事件 loadButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { try { //字符讀入流 FileReader reader = new FileReader(targetFile); //讀入緩沖區 char[] buffer = new char[1024]; //讀入結果 StringBuffer result = new StringBuffer(); //每次讀入緩沖區的長(cháng)度 int len; //從讀入流中讀取文件內容并形成結果 while((len = reader.read(buffer)) != -1) { result.append(buffer,0,len); } //關(guān)閉讀入流 reader.close(); //更新文本顯示區內容 textArea.setText(result.toString()); System.out.println("讀檔成功"); } catch (FileNotFoundException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } });
在目標文件中寫(xiě)下Hello World!!
,運行程序,點(diǎn)擊load
:
nice~~
好的,接下來(lái)就剩下最后一項任務(wù)了,完成存檔!
存檔按鈕的點(diǎn)擊事件應該為:
1.打開(kāi)目標文件字符輸出流
2.獲取當前文本顯示區的內容
3.將文本顯示區的內容通過(guò)輸出流寫(xiě)入文件
4.關(guān)閉輸出流
5.清空文本顯示區
哦吼,最后一條是我加上去的,其實(shí)不清空也可以。
代碼實(shí)現如下:
//保存文件按鈕點(diǎn)擊事件 saveButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { try { //打開(kāi)文件字符輸出流 FileWriter writer = new FileWriter(targetFile); //獲取文本顯示區文本 String result = textArea.getText(); //寫(xiě)入文件 writer.write(result); //關(guān)閉輸出流 writer.close(); //清空文本顯示區內容 textArea.setText(""); System.out.println("存檔成功"); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } });
在文本顯示區中輸入Hello Java!!
,點(diǎn)擊save
:
啥?你說(shuō)文本框里面啥也沒(méi)有?對,因為最后把內容清空了!
好了,實(shí)現了上面的全部功能,最后把代碼匯總在這里:
(謹慎抄襲哦)
import java.awt.Container; import java.awt.FlowLayout; import java.awt.TextArea; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.io.File; import java.io.FileNotFoundException; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import javax.swing.JButton; import javax.swing.JFrame; public class GUIDemo extends JFrame{ private static final String TARGET_FILE = "./temp.txt"; //三個(gè)組件 private JButton saveButton; private JButton loadButton; private TextArea textArea; //容器 private Container container; //目標文件 private File targetFile; public GUIDemo() throws IOException { //設置title super("File Demo"); //設置流布局 setLayout(new FlowLayout()); //獲取容器 container = getContentPane(); //創(chuàng )建目標文件對象 targetFile = new File(TARGET_FILE); if(targetFile.createNewFile()) { System.out.println("文件不存在,創(chuàng )建成功"); }else { System.out.println("文件存在"); } //三個(gè)組件 textArea = new TextArea(); saveButton = new JButton("save"); loadButton = new JButton("load"); //保存文件按鈕點(diǎn)擊事件 saveButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { try { //打開(kāi)文件字符輸出流 FileWriter writer = new FileWriter(targetFile); //獲取文本顯示區文本 String result = textArea.getText(); //寫(xiě)入文件 writer.write(result); //關(guān)閉輸出流 writer.close(); //清空文本顯示區內容 textArea.setText(""); System.out.println("存檔成功"); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } }); //讀入文件按鈕點(diǎn)擊事件 loadButton.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent e) { try { //字符讀入流 FileReader reader = new FileReader(targetFile); //讀入緩沖區 char[] buffer = new char[1024]; //讀入結果 StringBuffer result = new StringBuffer(); //每次讀入緩沖區的長(cháng)度 int len; //從讀入流中讀取文件內容并形成結果 while((len = reader.read(buffer)) != -1) { result.append(buffer,0,len); } //關(guān)閉讀入流 reader.close(); //更新文本顯示區內容 textArea.setText(result.toString()); System.out.println("讀檔成功"); } catch (FileNotFoundException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } catch (IOException e1) { // TODO Auto-generated catch block e1.printStackTrace(); } } }); //裝填三個(gè)組件 container.add(textArea); container.add(loadButton); container.add(saveButton); //調整大小 setSize(500, 300); //顯示 setVisible(true); } public static void main(String[] args) throws IOException { GUIDemo demo = new GUIDemo(); demo.setDefaultCloseOperation(EXIT_ON_CLOSE); } }
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自互聯(lián)網(wǎng)轉載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權請聯(lián)系QQ:712375056 進(jìn)行舉報,并提供相關(guān)證據,一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容。
Copyright ? 2009-2021 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 珠海市特網(wǎng)科技有限公司 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站