用Java编写程序,实现一个GUI应用程序,让用户在文本域输人一个文件名,限定用户只能输入0或1,然后单击回车键在文本区域显示它的二进制表示形式。用户也可以修改这个二进制代码,然后将它回存到这个文件中,退出应用时,若文件修改后未存储,需提醒用户(Y/N/C)
时间: 2024-01-01 14:03:18 浏览: 100
好的,我可以帮你编写一个Java程序实现你的需求。下面是代码示例:
```java
import java.awt.BorderLayout;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.WindowConstants;
public class BinaryEditor extends JFrame implements ActionListener {
// GUI组件
private JTextField filenameField;
private JTextArea binaryArea;
private JButton readButton;
private JButton saveButton;
// 当前打开的文件
private File currentFile;
// 文件是否被修改
private boolean modified = false;
public BinaryEditor() {
// 初始化GUI界面
setTitle("二进制文件编辑器");
setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
JPanel topPanel = new JPanel(new FlowLayout());
topPanel.add(new JLabel("文件名:"));
filenameField = new JTextField(30);
topPanel.add(filenameField);
readButton = new JButton("读取文件");
readButton.addActionListener(this);
topPanel.add(readButton);
add(topPanel, BorderLayout.NORTH);
binaryArea = new JTextArea(20, 60);
binaryArea.setEditable(true);
JScrollPane scrollPane = new JScrollPane(binaryArea);
add(scrollPane, BorderLayout.CENTER);
JPanel bottomPanel = new JPanel(new FlowLayout());
saveButton = new JButton("保存文件");
saveButton.addActionListener(this);
bottomPanel.add(saveButton);
add(bottomPanel, BorderLayout.SOUTH);
pack();
setLocationRelativeTo(null);
setVisible(true);
}
// 实现ActionListener接口
@Override
public void actionPerformed(ActionEvent e) {
Object source = e.getSource();
if (source == readButton) {
// 读取文件
String filename = filenameField.getText();
if (filename.isEmpty()) {
JOptionPane.showMessageDialog(this, "请输入文件名");
return;
}
File file = new File(filename);
if (!file.exists() || !file.isFile()) {
JOptionPane.showMessageDialog(this, "文件不存在");
return;
}
try {
byte[] bytes = readBytes(file);
String binaryString = bytesToBinaryString(bytes);
binaryArea.setText(binaryString);
currentFile = file;
modified = false;
} catch (IOException ex) {
ex.printStackTrace();
JOptionPane.showMessageDialog(this, "读取文件出错: " + ex.getMessage());
}
} else if (source == saveButton) {
// 保存文件
if (currentFile == null) {
JOptionPane.showMessageDialog(this, "请先读取文件");
return;
}
String binaryString = binaryArea.getText();
try {
byte[] bytes = binaryStringToBytes(binaryString);
writeBytes(currentFile, bytes);
modified = false;
} catch (IllegalArgumentException ex) {
JOptionPane.showMessageDialog(this, "输入不合法: " + ex.getMessage());
} catch (IOException ex) {
ex.printStackTrace();
JOptionPane.showMessageDialog(this, "保存文件出错: " + ex.getMessage());
}
}
}
private byte[] readBytes(File file) throws IOException {
FileInputStream in = new FileInputStream(file);
try {
byte[] buffer = new byte[1024];
List<Byte> bytes = new ArrayList<>();
int n;
while ((n = in.read(buffer)) != -1) {
for (int i = 0; i < n; i++) {
bytes.add(buffer[i]);
}
}
byte[] result = new byte[bytes.size()];
for (int i = 0; i < bytes.size(); i++) {
result[i] = bytes.get(i);
}
return result;
} finally {
in.close();
}
}
private void writeBytes(File file, byte[] bytes) throws IOException {
FileOutputStream out = new FileOutputStream(file);
try {
out.write(bytes);
} finally {
out.close();
}
}
private String bytesToBinaryString(byte[] bytes) {
StringBuilder sb = new StringBuilder();
for (byte b : bytes) {
String binaryString = Integer.toBinaryString(b & 0xFF);
while (binaryString.length() < 8) {
binaryString = "0" + binaryString;
}
sb.append(binaryString).append(" ");
}
return sb.toString();
}
private byte[] binaryStringToBytes(String binaryString) {
String[] tokens = binaryString.split("\\s+");
byte[] bytes = new byte[tokens.length];
for (int i = 0; i < tokens.length; i++) {
String token = tokens[i];
if (token.length() != 8) {
throw new IllegalArgumentException("输入不合法: " + token);
}
try {
int value = Integer.parseInt(token, 2);
bytes[i] = (byte) value;
} catch (NumberFormatException ex) {
throw new IllegalArgumentException("输入不合法: " + token);
}
}
return bytes;
}
public static void main(String[] args) {
BinaryEditor editor = new BinaryEditor();
editor.addWindowListener(new java.awt.event.WindowAdapter() {
@Override
public void windowClosing(java.awt.event.WindowEvent windowEvent) {
if (editor.modified) {
// 文件被修改,提示是否保存
int choice = JOptionPane.showOptionDialog(editor, "文件已修改,是否需要保存?",
"保存文件", JOptionPane.YES_NO_CANCEL_OPTION,
JOptionPane.QUESTION_MESSAGE, null,
new String[]{"保存", "不保存", "取消"}, "保存");
if (choice == JOptionPane.YES_OPTION) {
editor.saveButton.doClick();
} else if (choice == JOptionPane.NO_OPTION) {
// 不保存,直接退出
System.exit(0);
}
// 取消则什么都不做
} else {
// 文件未被修改,直接退出
System.exit(0);
}
}
});
}
}
```
这个程序使用Java Swing库创建了一个GUI界面,包括一个文本框和两个按钮。用户输入文件名后,单击“读取文件”按钮,程序会打开该文件并将其内容转换为二进制表示形式,然后在文本框中显示。用户可以在文本框中修改二进制代码,然后单击“保存文件”按钮,程序会将修改后的二进制代码写回到原始文件中。
需要注意的是,这个程序限定用户只能输入0或1,如果输入不合法,则会提示错误信息。此外,为了保证程序的稳定性和安全性,需要添加一些错误处理和安全检查的代码。最后,当用户关闭应用程序时,如果文件被修改,程序会提示是否需要保存,如果用户选择保存,则会自动执行保存操作。
阅读全文