java问题
用户界面大小为400×200像素,如下图所示:
程序启动后,多行文本输入框JTextArea中显示当前目录下myText.txt文件中原有的内容,如果该文件不存在,则新建该文件。
“保存”按钮功能:将多行文本输入框JTextArea中的内容写入myText.txt文件中保存。
“取消”按钮功能:将多行文本输入框TextArea中的内容清空。
“退出”按钮功能:退出程序 展开
这里直接把s赋值给readContent是有问题的,问题点如下:
假设文件有两行
第一行
第二行
则读取循环两次,第一次s赋值给readContent,readContent的值为 "第一行",然后又循环,读取第二行,再次赋值,则readContent就会变成 "第二行",第一行的值就丢失了;
这里StringBuff的作用是把读取到的内容连接起来成为一个字符串;
不过这里的例子的确有问题,问题却不在StringBuffer上,而在 s 变量上,s中间两步是不必要的,循环内直接改成如下形式:
另外,除了以上问题,来总结下这段代码的问题吧:
1、文件资源没有释放
2、在不涉及多线程的情况下,应使用StringBuilder类进行字符串拼接,而不是StringBuffer,因为StringBuilder更快(但是StringBuilder线程不安全,StringBuffer线程安全);
3、异常处理有问题,如果出现IO异常,就返回异常信息的字符串?那么如何区分这个字符串是发生了异常还是从文件中读取到的内容呢?这里不应该返回字符串,而是直接声明异常,有异常就向外抛,直到能处理的顶层程序处理。
基于以上几点,修改代码如下:
注意第27行,声明本方法可能抛出 IOException 异常,稍后主程序将进行处理。另外注意第30行,创建InputStreamReader 的时候指定了文件编码为utf8,以避免乱码,你的文件如果存储的是其他编码类型,则会出现乱码。
调用代码如下:
注意18行和21行,是分别处理正常情况和异常情况,当读取异常时,将会调用第21行,打印异常信息;
整体代码如下:
接下来我们看看代码执行情况。
1、当我们要读的文件不存在时,执行结果如下:
看,当文件不存在时,抛出异常,并由异常处理程序捕获和打印,你可以看到具体哪一行代码出错[getContent(App.java:29)],说明在App.java 文件中的getContent方法,文件的29行出错。
2、那么正常情况下呢?当然是输出文件内容了,我们放一个有如下内容的文件在"D:\\file.txt"处:
执行结果如下:
最后,我不知道你看的是什么书,是不是课本,但感觉质量不高,这里给你推荐几本,可以买来看看:
3、最权威的,自然是The Java® Language Specificati了
祝你学习之路顺利
import java.awt.FileDialog;
import java.awt.TextArea;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileOutputStream;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
public class TextEditc {
static String filepath;
static JFrame frame = new JFrame("文本编辑器");
static TextArea textArea = new TextArea("", 20, 30,
TextArea.SCROLLBARS_BOTH);
static JButton jButton1 = new JButton("保存"), jButton2 = new JButton("取消"),
jButton3 = new JButton("退出");
JPanel panel = new JPanel();
public TextEditc() {
frame.add(textArea, BorderLayout.CENTER);
panel.add(jButton1);
panel.add(jButton2);
panel.add(jButton3);
frame.add(panel, BorderLayout.SOUTH);
frame.setSize(500, 400);
frame.setVisible(true);
init();
}
public void init() {
jButton1.addActionListener(new SaveFileAction(filepath));
jButton2.addActionListener(new ResetTextArea());
jButton3.addActionListener(new ExitSystemJB());
}
public static void main(String[] args) {
new TextEditc();
}
}
// 保存文件按钮监听事件
class SaveFileAction implements ActionListener {
private String filepath = null;
public SaveFileAction(String filepath) {
this.filepath = filepath;
}
public void actionPerformed(ActionEvent e) {
FileDialog dialog = new FileDialog(new JFrame(), "保存文件",
FileDialog.LOAD);
dialog.setVisible(true);
filepath = dialog.getDirectory() + dialog.getFile();
File file = new File(filepath);
FileOutputStream fileOutputStream = null;
try {
fileOutputStream = new FileOutputStream(file);
// String content = textArea.getText();
String content = TextEditc.textArea.getText();
byte[] b = content.getBytes();
fileOutputStream.write(b);
fileOutputStream.close();// 关闭输出流
} catch (Exception e1) {
e1.printStackTrace();
}
}
}
// 取消按钮监听事件
class ResetTextArea implements ActionListener {
public void actionPerformed(ActionEvent e) {
// textarea区域设置为空
TextEditc.textArea.setText("");
}
}
// 退出按钮监听事件
class ExitSystemJB implements ActionListener {
public void actionPerformed(ActionEvent e) {
int a = JOptionPane.showConfirmDialog(null, "确定关闭吗?", "温馨提示",
JOptionPane.YES_NO_OPTION);
if (a == 0) {
System.exit(0); // 关闭
}
}
}