Java實現(xiàn)簡單記事本的完整指南
前言
有時候,靈感就像一陣風(fēng),突然間吹過,你無法預(yù)料它的到來,只能盡快抓住。這次,我突然想做一個類似 TXT 記事本的小工具。你沒聽錯,就是那個每天記錄生活瑣事、隨便寫寫的記事本。聽起來簡單對吧?“只要放個文本框,寫個菜單,怎么都能完成。”但要我說,這個簡單的“記事本”背后卻有著不為人知的思考與細(xì)節(jié)。每一行代碼,都是我多年來在開發(fā)過程中忽視的Java基礎(chǔ),甚至每一個微小的優(yōu)化,都在體現(xiàn)我對該門開發(fā)語言背后的一次重新認(rèn)識。
做一個小工具,看似不起眼,但在開發(fā)過程中,我卻時常被這些“細(xì)節(jié)”所困擾。每次碰到挑戰(zhàn),哪怕是一個看似簡單的需求,都讓我忍不住嘴角微翹:這不僅是擼代碼的挑戰(zhàn),更是對自己技術(shù)基礎(chǔ)的一次重新審視。而這個簡易的記事本,居然成了我對“編碼”這門藝術(shù)的一次深刻打磨(還好底子夠厚)。
技術(shù)點概述
- Java Swing:一開始我并沒有對 Swing 產(chǎn)生濃厚興趣,甚至認(rèn)為它是過時的技術(shù)。直到有一天,我意識到,Swing 其實是我快速構(gòu)建桌面應(yīng)用最便捷的工具。每次我需要快速搭建一個應(yīng)用,Swing 就像一把利劍,助我輕松應(yīng)對所有界面設(shè)計上的挑戰(zhàn)。從最初的迷茫,到現(xiàn)在的得心應(yīng)手,Swing 成了我構(gòu)建應(yīng)用時的“萬能的鑰匙”。
- Java IO:文件操作,對我而言,既是最簡單的任務(wù),也是最具挑戰(zhàn)的部分。初次接觸文件讀寫時,我常常為路徑、編碼和格式問題而抓狂。而隨著經(jīng)驗的積累,我漸漸學(xué)會了如何優(yōu)雅地通過 Java IO 處理這些文件。保存、打開、讀取,每個環(huán)節(jié)都變得得心應(yīng)手??梢哉f,文件處理不再是難題,反而成了我最常用的工具之一。
在這個小項目中,我結(jié)合了這兩項技術(shù),用它們來構(gòu)建這個簡易的記事本應(yīng)用。表面看,它只是一個簡單的記事本,但對我來說,它代表了我多年來對編程技術(shù)的理解與提升。
1. 項目需求分析
很多人看見記事本時,可能覺得“這不就是個簡單的文本框嗎?”的確,它是個文本框,但背后涉及到的細(xì)節(jié)可不止這些。我的目標(biāo)是做一個 簡潔、高效、易用 的記事本工具,它不只讓你“寫”字,還讓你能愉快地操作、管理文件。為此,我設(shè)計了以下幾個功能:
- 編輯文本:無論是隨手記下的想法,還是臨時需要記錄的內(nèi)容,都可以在這個文本框中自由輸入。編輯功能流暢、簡潔,用戶可以隨時進(jìn)行修改,省去了繁瑣的操作。
- 保存文件:保存功能是最基礎(chǔ)也是最重要的。每次記錄的內(nèi)容,都能通過保存功能妥善保存,避免數(shù)據(jù)丟失。
- 打開文件:不止是寫,還能隨時回看。用戶可以通過打開文件的功能,重新加載之前保存的內(nèi)容,進(jìn)行編輯或查看。
- 字體樣式和字號選擇:為了讓用戶能更舒適地編輯文本,我加入了字體和字號選擇的功能,用戶可以自由調(diào)整文本的顯示效果,給每一段文字加點“個人風(fēng)格”。
- 文件另存為:有時候,我們需要保存不同版本的文件,或者將文件保存為新的文件格式。這個功能的存在,可以避免原文件被誤修改或覆蓋。
- 彈窗提示保存與取消操作:當(dāng)你打開一個未保存的文件時,程序會在退出前彈出提示,提醒你是否保存修改過的內(nèi)容。這是避免誤操作的小細(xì)節(jié),讓你不會丟失任何數(shù)據(jù)。
這些看似簡單的需求,其實背后涉及到很多細(xì)節(jié)和優(yōu)化。比如,字體選擇功能,我并沒有僅僅實現(xiàn)一個下拉框,而是讓用戶能輕松預(yù)覽字體效果;又比如在保存文件時,我對文件路徑做了自動判斷,確保用戶不會保存到錯誤的位置。每個細(xì)節(jié)都是我對用戶體驗的精雕細(xì)琢。
2. Java Swing 簡介
在我多年的開發(fā)經(jīng)歷中,Java Swing 見證了我從初學(xué)者到有一定開發(fā)經(jīng)驗的過程。最開始,我對 Swing 充滿了恐懼。各種布局、組件、事件監(jiān)聽等概念讓我頭暈?zāi)垦?,特別是在布局管理器的使用上,我從未想過有那么多種不同的布局方式,每種方式的使用場景也讓我感到困惑。然而,隨著時間的推移,我逐漸理解了它們的設(shè)計思路,掌握了如何利用這些組件和布局來實現(xiàn)我想要的界面效果。
最初,我花了很多時間調(diào)試界面組件,尤其是 JTextArea 和 JScrollPane 的配合。每次調(diào)整窗口大小時,文本框內(nèi)容的顯示問題就會讓我抓狂。于是我開始慢慢理解:布局并不是單純地“擺放控件”,而是要讓每一個控件都能在不同尺寸的窗口中自如適應(yīng),確保它們之間的互動更自然。
經(jīng)過無數(shù)次的嘗試與調(diào)整,我終于學(xué)會了用 Swing 設(shè)計簡潔、流暢的桌面應(yīng)用。每次看到界面穩(wěn)定運(yùn)行時,那種滿足感讓我覺得:這份辛苦是值得的。
常用組件介紹:
- JTextArea:多行文本輸入?yún)^(qū)域,用于編輯文本內(nèi)容。
- JMenuBar 和 JMenu:菜單欄和菜單,用于顯示應(yīng)用中的功能選項。
- JFileChooser:文件選擇器,用于打開和保存文件。
3. 項目實現(xiàn)
一開始,我的目標(biāo)是簡單地搭建一個基本的界面,能讓用戶輸入文本、保存文件、設(shè)置字體等。但隨著需求的不斷豐富,我發(fā)現(xiàn)每一步都需要不斷優(yōu)化代碼,解決隱藏的問題。例如,在文件保存時,我不得不考慮編碼問題、路徑問題、擴(kuò)展名問題等,甚至在用戶關(guān)閉應(yīng)用時,我都要細(xì)心處理文件未保存的情況。
3.1 代碼演示
首先,我們創(chuàng)建一個基本的窗口框架,其中包含一個文本編輯區(qū)域和菜單欄。然后,我們會逐步實現(xiàn)文件操作功能。具體代碼如下演示,僅供參考:
/**
* @Author bug菌
* @Source 公眾號:猿圈奇妙屋
* @date: 2025-07-31 15:56
*/
public class NotepadApp {
private JFrame frame;
private JTextArea textArea;
private JFileChooser fileChooser;
private String currentFilePath = null; // 當(dāng)前文件路徑
private JLabel statusLabel; // 狀態(tài)欄標(biāo)簽
private UndoManager undoManager; // 撤銷/重做管理器
public NotepadApp() {
frame = new JFrame("簡易記事本");
textArea = new JTextArea();
fileChooser = new JFileChooser();
undoManager = new UndoManager();
// 設(shè)置基本布局
frame.setLayout(new BorderLayout());
frame.add(new JScrollPane(textArea), BorderLayout.CENTER);
// 設(shè)置文本區(qū)
textArea.setFont(new Font("Serif", Font.PLAIN, 14)); // 默認(rèn)字體
textArea.setLineWrap(true); // 自動換行
textArea.setWrapStyleWord(true); // 按字換行
textArea.getDocument().addUndoableEditListener(e -> undoManager.addEdit(e.getEdit())); // 撤銷/重做監(jiān)聽
// 狀態(tài)欄
statusLabel = new JLabel(" 未保存 ");
frame.add(statusLabel, BorderLayout.SOUTH); // 狀態(tài)欄顯示
// 創(chuàng)建菜單欄
JMenuBar menuBar = new JMenuBar();
frame.setJMenuBar(menuBar);
createMenu(menuBar);
// 設(shè)置窗口
frame.setSize(600, 400);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLocationRelativeTo(null); // 居中顯示
// 設(shè)置圖標(biāo)
ImageIcon icon = new ImageIcon("notepad_icon.png"); // 添加圖標(biāo)
frame.setIconImage(icon.getImage());
}
// 創(chuàng)建菜單
private void createMenu(JMenuBar menuBar) {
JMenu fileMenu = new JMenu("文件");
JMenu editMenu = new JMenu("編輯");
// 文件菜單項
JMenuItem openItem = new JMenuItem("打開");
openItem.addActionListener(e -> openFile());
fileMenu.add(openItem);
JMenuItem saveItem = new JMenuItem("保存");
saveItem.addActionListener(e -> saveFile());
fileMenu.add(saveItem);
JMenuItem saveAsItem = new JMenuItem("另存為");
saveAsItem.addActionListener(e -> saveFileAs());
fileMenu.add(saveAsItem);
JMenuItem exitItem = new JMenuItem("退出");
exitItem.addActionListener(e -> exitApplication());
fileMenu.add(exitItem);
// 編輯菜單項
JMenuItem undoItem = new JMenuItem("撤銷");
undoItem.addActionListener(e -> undoAction());
editMenu.add(undoItem);
JMenuItem redoItem = new JMenuItem("重做");
redoItem.addActionListener(e -> redoAction());
editMenu.add(redoItem);
JMenuItem fontItem = new JMenuItem("字體樣式");
fontItem.addActionListener(e -> changeFont());
editMenu.add(fontItem);
// 將菜單添加到菜單欄
menuBar.add(fileMenu);
menuBar.add(editMenu);
}
// 打開文件
private void openFile() {
int returnValue = fileChooser.showOpenDialog(frame);
if (returnValue == JFileChooser.APPROVE_OPTION) {
File selectedFile = fileChooser.getSelectedFile();
try {
currentFilePath = selectedFile.getAbsolutePath();
String content = new String(Files.readAllBytes(selectedFile.toPath()), StandardCharsets.UTF_8); // UTF-8 編碼讀取
textArea.setText(content);
statusLabel.setText(" 已打開: " + currentFilePath);
} catch (IOException e) {
showError("無法打開文件");
}
}
}
// 保存文件
private void saveFile() {
if (currentFilePath == null) {
saveFileAs();
} else {
try {
Files.write(Paths.get(currentFilePath), textArea.getText().getBytes(StandardCharsets.UTF_8)); // UTF-8 編碼保存
statusLabel.setText(" 已保存: " + currentFilePath);
} catch (IOException e) {
showError("保存文件失敗");
}
}
}
// 另存為
private void saveFileAs() {
int returnValue = fileChooser.showSaveDialog(frame);
if (returnValue == JFileChooser.APPROVE_OPTION) {
File selectedFile = fileChooser.getSelectedFile();
currentFilePath = selectedFile.getAbsolutePath();
if (!currentFilePath.endsWith(".txt")) {
currentFilePath += ".txt"; // 自動加上 .txt 擴(kuò)展名
}
saveFile();
}
}
// 改變字體
private void changeFont() {
String[] fonts = {"Serif", "Arial", "Verdana"};
String selectedFont = (String) JOptionPane.showInputDialog(frame,
"選擇字體",
"字體樣式",
JOptionPane.PLAIN_MESSAGE,
null,
fonts,
fonts[0]);
if (selectedFont != null) {
String[] sizes = {"12", "14", "16", "18", "20"};
String selectedSize = (String) JOptionPane.showInputDialog(frame,
"選擇字號",
"字號",
JOptionPane.PLAIN_MESSAGE,
null,
sizes,
sizes[1]);
if (selectedSize != null) {
textArea.setFont(new Font(selectedFont, Font.PLAIN, Integer.parseInt(selectedSize)));
}
}
}
// 撤銷
private void undoAction() {
if (undoManager.canUndo()) {
undoManager.undo();
}
}
// 重做
private void redoAction() {
if (undoManager.canRedo()) {
undoManager.redo();
}
}
// 退出應(yīng)用程序
private void exitApplication() {
if (confirmExit()) {
System.exit(0);
}
}
// 彈窗提示是否保存文件
private boolean confirmExit() {
int response = JOptionPane.showConfirmDialog(frame,
"是否保存文件?",
"退出",
JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.QUESTION_MESSAGE);
if (response == JOptionPane.YES_OPTION) {
saveFile();
return true;
} else if (response == JOptionPane.NO_OPTION) {
return true;
}
return false;
}
// 顯示錯誤信息
private void showError(String message) {
JOptionPane.showMessageDialog(frame, message, "錯誤", JOptionPane.ERROR_MESSAGE);
}
// 啟動應(yīng)用程序
public static void main(String[] args) {
SwingUtilities.invokeLater(() -> {
NotepadApp app = new NotepadApp();
app.frame.setVisible(true);
});
}
}
3.2 代碼解析
代碼的核心部分主要包括界面設(shè)計、文件操作、字體選擇和撤銷重做等功能的實現(xiàn)。每個功能我都逐步進(jìn)行了實現(xiàn),并在每個環(huán)節(jié)中進(jìn)行細(xì)致優(yōu)化。例如,在 文件操作 部分,我采用了 Files.readAllBytes() 和 Files.write() 來保證文件操作的高效與安全;在 字體選擇 部分,我通過彈窗讓用戶可以自由選擇字體和字號,并實時預(yù)覽效果。
這個小小的記事本,雖然看起來簡單,但每一行代碼都承載著我對編程的熱愛與執(zhí)著。從每個細(xì)節(jié)的實現(xiàn)中,我不斷打磨自己的技術(shù),精益求精。
1. 類成員變量
frame:這是主窗口 (JFrame) 的對象,所有界面的展示都會依賴于這個窗口對象。textArea:JTextArea對象,用戶用來輸入和編輯文本。它會包含實際的文本內(nèi)容,并在窗口的中央顯示。fileChooser:JFileChooser是一個文件選擇對話框,用來打開或保存文件。currentFilePath: 存儲當(dāng)前打開或保存的文件路徑,用來標(biāo)識文件。statusLabel:JLabel用來在窗口的底部顯示當(dāng)前的狀態(tài)信息,如文件是否已保存。undoManager:UndoManager用來管理撤銷和重做操作,保證文本編輯操作可以回退或恢復(fù)。
2. 構(gòu)造函數(shù):初始化界面和控件
主要步驟:
- 創(chuàng)建了主窗口
frame,并設(shè)置標(biāo)題為“簡易記事本”。 - 初始化
textArea和fileChooser。 - 通過
frame.setLayout(new BorderLayout())使用了BorderLayout布局管理器,將文本區(qū)域 (JTextArea) 放置在窗口的中央,并用JScrollPane包裹使其支持滾動。 - 為
textArea設(shè)置字體和自動換行功能,確保文本區(qū)在超出邊界時自動換行。 - 添加了撤銷和重做功能,通過監(jiān)聽
textArea的文檔編輯事件 (UndoableEditListener),每次文本編輯都會通過undoManager.addEdit()方法記錄。
狀態(tài)欄:
- 使用
JLabel顯示文件的保存狀態(tài),初始化為“未保存”。
菜單欄:
- 創(chuàng)建了文件菜單(“打開”,“保存”,“另存為”,“退出”)和編輯菜單(“撤銷”,“重做”,“字體樣式”)。
- 每個菜單項都有一個事件監(jiān)聽器,監(jiān)聽用戶操作并觸發(fā)對應(yīng)的功能。
3. 文件操作功能
打開文件 (openFile()):
- 彈出文件選擇對話框 (
fileChooser.showOpenDialog()) 讓用戶選擇一個文件。 - 讀取選中文件的內(nèi)容并顯示在
textArea中。使用Files.readAllBytes()讀取文件,并將其轉(zhuǎn)換為 UTF-8 編碼的字符串,顯示到文本區(qū)域。 - 更新狀態(tài)欄顯示當(dāng)前文件路徑。
保存文件 (saveFile()):
- 判斷
currentFilePath是否為null,如果是,則調(diào)用“另存為”功能。 - 使用
Files.write()將textArea中的文本保存到指定路徑的文件,并以 UTF-8 編碼保存。 - 更新狀態(tài)欄為已保存的文件路徑。
另存為 (saveFileAs()):
- 彈出保存對話框讓用戶選擇保存的文件位置和文件名。
- 如果文件名沒有擴(kuò)展名
.txt,自動附加該擴(kuò)展名后保存。
4. 文本編輯功能
改變字體 (changeFont())
- 彈出兩個對話框:一個讓用戶選擇字體(“Serif”,“Arial”,“Verdana”),另一個讓用戶選擇字號(12,14,16,18,20)。
- 用戶選擇后,通過
textArea.setFont()改變文本區(qū)域的字體和字號。
撤銷和重做 (undoAction() 和 redoAction())
undoManager是一個用于管理撤銷和重做操作的類。undoAction()方法調(diào)用undoManager.undo()執(zhí)行撤銷操作,redoAction()方法調(diào)用undoManager.redo()執(zhí)行重做操作。- 如果沒有可撤銷或可重做的操作,
UndoManager會進(jìn)行檢查并且不會執(zhí)行。
5. 退出應(yīng)用程序與保存提示
退出應(yīng)用程序 (exitApplication()):
- 在用戶嘗試退出時,彈出確認(rèn)框詢問是否保存文件。
- 如果用戶選擇保存,則執(zhí)行保存操作后退出;如果用戶選擇不保存,則直接退出;如果用戶選擇取消,則不會退出。
確認(rèn)保存 (confirmExit()):
- 彈出
JOptionPane.showConfirmDialog()提示用戶是否保存當(dāng)前文件。 - 根據(jù)用戶選擇執(zhí)行相應(yīng)的操作:保存文件、退出或者取消退出。
6. 錯誤提示
顯示錯誤信息 (showError()):
使用 JOptionPane.showMessageDialog() 彈出一個錯誤提示框,顯示錯誤信息(如文件無法打開或保存失?。?。
7. 啟動應(yīng)用程序
啟動應(yīng)用程序 (main()):
SwingUtilities.invokeLater()用來在事件調(diào)度線程中啟動應(yīng)用程序,確保 GUI 組件的線程安全。- 創(chuàng)建
NotepadApp實例并使其界面可見。
3.3 主要功能
編輯文本:
- 用戶可以在
JTextArea中輸入和編輯文本內(nèi)容。 JTextArea是 Swing 提供的一個用于顯示和編輯多行文本的組件,已在代碼中定義,并通過setLineWrap(true)和setWrapStyleWord(true)使文本能夠自動換行并按單詞邊界換行。
打開文件:
- 用戶可以通過菜單中的 "打開" 項,選擇本地文件并加載文件內(nèi)容。
- 通過
JFileChooser實現(xiàn)文件選擇對話框,用戶選擇的文件會被讀取并顯示到JTextArea中,文件的路徑保存在currentFilePath中,便于后續(xù)的保存操作。
保存文件:
- 用戶可以保存文本內(nèi)容到本地文件,保存時默認(rèn)使用 UTF-8 編碼,避免亂碼。
- 若文件路徑為空,調(diào)用 "另存為" 功能,要求用戶選擇文件路徑并保存文件。保存時,系統(tǒng)會根據(jù)
currentFilePath判斷文件是否已有路徑。 - 文件保存的同時,狀態(tài)欄會更新顯示文件的保存狀態(tài)與路徑。
字體樣式和字號選擇:
- 用戶可以通過菜單中的 "字體樣式" 項,選擇所需的字體(如
Serif,Arial,Verdana)以及字號(如 12、14、16 等),并在JTextArea中實時改變顯示的字體效果。 - 使用
JOptionPane彈出對話框來讓用戶選擇字體和字號,選擇后通過textArea.setFont(...)方法更新文本樣式。
文件另存為:
- 用戶可以選擇 "另存為" 功能,將當(dāng)前文本內(nèi)容保存到新文件中。
- 在 "另存為" 的對話框中,系統(tǒng)自動判斷文件擴(kuò)展名是否為
.txt,若用戶未指定擴(kuò)展名,程序會自動添加.txt作為文件擴(kuò)展名。
保存提示:
- 在嘗試退出程序時,若當(dāng)前文本尚未保存,系統(tǒng)會彈出提示,詢問用戶是否保存文件。
JOptionPane.showConfirmDialog()用于彈出確認(rèn)對話框,選擇 "是" 后保存文件,選擇 "否" 后直接退出,選擇 "取消" 后不退出。
編輯文本:
用戶可以在主界面的文本區(qū)域 (JTextArea) 中直接輸入、修改和刪除文本內(nèi)容,支持基本的文本操作和自動換行,適合快速記錄筆記或編寫文檔。
撤銷 / 重做: 支持對文本操作進(jìn)行撤銷和重做。
- 撤銷:用戶誤操作后可以通過 “編輯” 菜單中的“撤銷”來回退到上一步狀態(tài)。
- 重做:如果撤銷后發(fā)現(xiàn)不需要回退,可以使用“重做”恢復(fù)操作。
- 實現(xiàn)基于
UndoManager類,自動監(jiān)聽文本更改。
字體樣式設(shè)置:
用戶可通過菜單選擇字體名稱(如 Serif、Arial、Verdana)和字號(如 12、14、16、18、20),即時應(yīng)用于文本內(nèi)容,改善閱讀或編輯體驗。
狀態(tài)欄提示:
窗口底部的狀態(tài)欄動態(tài)顯示當(dāng)前文件的保存狀態(tài)和路徑,便于用戶確認(rèn)文件是否保存。
3.4 流程圖
以下是記事本程序的基本流程圖,為大家展示了用戶如何通過菜單操作實現(xiàn)文件的打開、保存、字體選擇等功能:

3.5 本地運(yùn)行演示
當(dāng)我看到記事本應(yīng)用流暢運(yùn)行時,內(nèi)心的成就感是無可比擬的。每一項功能的實現(xiàn),都讓我回想起過去在編程中的學(xué)習(xí)和成長。雖然這只是一個簡單的工具,但它象征著我多年來對技術(shù)的理解和沉淀。每一次的進(jìn)步,都是我不斷挑戰(zhàn)自我的結(jié)果。
完整界面
如下是程序運(yùn)行成功會自動彈出的一個界面,演示如下:

首先,點擊【文件】可支持以下功能:打開、保存、另存為、退出。

【點擊】編輯可支持的功能有:撤銷、重做、字體樣式。

打開文件
接著,我們來演示下打開文件:

接著我們?nèi)我獯蜷_一個文件,可對比我們本地的TXT記事本。

雖然功能上沒有txt記事本豐富,但是,純手搓的,是不是非??梢粤?!只需要把這些其他的功能逐步完善,那堪比記事本,甚至可談超越。

保存文件
我們直接通過打開的文本進(jìn)行新增內(nèi)容,效果如下:

另存為
我們同樣也可以將文件另存為,功能上與文件另存為毫無區(qū)別。

剩下的其他功能及未實現(xiàn)的功能點,這就留給大家去測試及完善啦,基礎(chǔ)的模型已經(jīng)替大家搭建好了。
4. 總結(jié)
通過本項目的實現(xiàn),我們成功構(gòu)建了一個簡易的記事本應(yīng)用,支持 文本編輯、文件打開、保存、另存為,并且實現(xiàn)了 字體選擇、字號設(shè)置、保存提示 等功能。通過使用 Java Swing 和 Java IO,我們實現(xiàn)了圖形界面的搭建和文件的讀取寫入。
通過這個記事本項目,大家不僅可以學(xué)會如何使用 Swing 開發(fā)桌面應(yīng)用,還能深入了解了文件操作的基本方式。同時希望,大家可以在此基礎(chǔ)上繼續(xù)擴(kuò)展功能,考慮加入 文本搜索、撤銷重做 或 文件加密保護(hù) 等功能,進(jìn)一步提升應(yīng)用的實用性和安全性。
我相信,編程不止是一個解決問題的工具,它更是一種創(chuàng)造和表達(dá)的方式。每一次的編程經(jīng)歷,都是對自己的一次磨礪,讓我不斷突破,不斷成長。
到此這篇關(guān)于Java實現(xiàn)簡單記事本的完整指南的文章就介紹到這了,更多相關(guān)Java記事本內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java notify和notifyAll的區(qū)別和相同
本文主要介紹Java notify和notifyAll的知識,這里整理詳細(xì)的資料來說明notify 和NotifAll的區(qū)別,有需要的小伙伴可以參考下2016-09-09
關(guān)于@Autowired注入依賴失敗的問題及解決
這篇文章主要介紹了關(guān)于@Autowired注入依賴失敗的問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-08-08
Java接口和抽象類實現(xiàn)抽象和多態(tài)的方法示例
接口和抽象類是 Java 中兩種實現(xiàn)抽象和多態(tài)的方法。它們之間有一些區(qū)別,但也有一些相似之處。這一節(jié)我們將通過詳細(xì)的例子來更深入地了解接口和抽象類2023-05-05
SpringBoot后端進(jìn)行數(shù)據(jù)校驗JSR303的使用詳解
這篇文章主要介紹了SpringBoot后端進(jìn)行數(shù)據(jù)校驗JSR303的使用詳解,本文給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-03-03
部署SpringBoot項目到Linux服務(wù)器數(shù)據(jù)盤的完整流程
這篇文章講述了如何在Linux服務(wù)器上掛載數(shù)據(jù)盤并部署SpringBoot項目,具體步驟包括查看磁盤狀態(tài)、分區(qū)與格式化、掛載分區(qū)、配置開機(jī)自動掛載等,以及上傳項目文件、編寫啟動腳本、啟動項目并測試、配置Systemd服務(wù)管理,需要的朋友可以參考下2025-11-11

