文本替换几乎是所有文本编辑器都支持的功能,但是要限制在编辑器中才可以执行该功能。
本实例实现了指定文本文件中的内容替换,并且不需要再编辑器中打开文本文件。实例的运行效果如下图所示。
(1)替换前;
(2)替换后。
用到了两个方法:
(1)append()方法
利用StringBuilder类的append()方法,可以向该类的对象尾部追加字符串文本,该方法的声明如下:
public StringBuilder append(String str) 该方法支持重载
(2)replace()方法
替换字符串要通过String类的replace()方法实现,该方法的声明如下:
public String replace(CharSequence target, CharSequence replacement)
参数声明:
target: 目标字符串
replace门头:替换的新字符串
完整代码如下:
package cn.whut.num;
import java.awt.Desktop;
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.SwingConstants;
import javax.swing.JTextField;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class ReplaceFileText extends JFrame {
private static final long serialVersionUID = 1L;
private JPanel contentPane;
private JTextField fileField;
private JTextField searchTextField;
private JTextField replaceTextField;
private File file;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
ReplaceFileText frame = new ReplaceFileText();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public ReplaceFileText() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
contentPane.setLayout(null);
JButton button = new JButton("\u9009\u62E9\u6587\u4EF6");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
do_button_actionPerformed(e);
}
});
button.setBounds(32, 23, 93, 23);
contentPane.add(button);
JLabel label = new JLabel("\u641C\u7D22\u6587\u672C\uFF1A");
label.setHorizontalAlignment(SwingConstants.CENTER);
label.setBounds(32, 56, 93, 15);
contentPane.add(label);
JLabel label_1 = new JLabel("\u66FF\u6362\u4E3A\uFF1A");
label_1.setHorizontalAlignment(SwingConstants.CENTER);
label_1.setBounds(32, 92, 93, 15);
contentPane.add(label_1);
fileField = new JTextField();
fileField.setBounds(149, 24, 213, 21);
contentPane.add(fileField);
fileField.setColumns(10);
searchTextField = new JTextField();
searchTextField.setBounds(149, 53, 213, 21);
contentPane.add(searchTextField);
searchTextField.setColumns(10);
replaceTextField = new JTextField();
replaceTextField.setBounds(149, 89, 213, 21);
contentPane.add(replaceTextField);
replaceTextField.setColumns(10);
JButton replaceButton = new JButton("\u66FF\u6362");
replaceButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
do_replaceButton_actionPerformed(e);
}
});
replaceButton.setBounds(110, 139, 93, 23);
contentPane.add(replaceButton);
JButton openfileButton = new JButton("\u6253\u5F00\u6587\u4EF6");
openfileButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
do_button_2_actionPerformed(e);
}
});
openfileButton.setBounds(246, 139, 93, 23);
contentPane.add(openfileButton);
}
private void do_button_actionPerformed(ActionEvent e) {
JFileChooser chooser = new JFileChooser("./");
//设置文件的扩展名,以方便过滤
chooser.setFileFilter(new FileNameExtensionFilter("文本文件", "txt",
"java","php","html","htm"));
//显示文件打开的对话框
int option = chooser.showOpenDialog(this);
//确定用户按下“打开”按钮,而非取消按钮
if(option != JFileChooser.APPROVE_OPTION)
return;
//获取用户选择的文件对象
file = chooser.getSelectedFile();
//显示文件信息到文本框
fileField.setText(file.toString());
}
private void do_replaceButton_actionPerformed(ActionEvent e) {
String searchText = searchTextField.getText();
String replaceText = replaceTextField.getText();
if(searchText.isEmpty())
return;
try{
FileReader fis = new FileReader(file);//创建文件输入流
char[] data = new char[1024];//创建缓冲字符数组
int rn = 0;
StringBuilder sb = new StringBuilder();//创建字符串构建器
while((rn = fis.read(data)) > 0){ //读取文件内容到字符串构建器
String str = String.valueOf(data,0,rn);
sb.append(str);
}
fis.close();//关闭输入流
//从构建器中生成字符串,并替换searchText文本
String str = sb.toString().replace(searchText, replaceText);
FileWriter fout = new FileWriter(file);//创建文件输出流
fout.write(str.toCharArray()); //把替换完成的字符串写入文件
fout.close();//关闭输出流,很重要。
}catch(FileNotFoundException e1){
e1.printStackTrace();
}catch(IOException e2){
e2.printStackTrace();
}
JOptionPane.showMessageDialog(null, "替换完成");
}
private void do_button_2_actionPerformed(ActionEvent e) {
try{
if(file == null)
return;
Desktop.getDesktop().edit(file);
}catch(IOException e3){
e3.printStackTrace();
}
}
}