Java1.设计一个程序,主界面如下图所示: 2.用户点击"打开..."按钮,则程序: (1) 弹出打开目录的对话框,供用户选择要统计的txt文件所在的文件夹; (2) 统计所选择文件夹中所有txt文件以及子文件夹中所有文件中所出现的字母(a-z)以及每个字母出现的总数,不区分大小写。(3) 将结果(文件路径+文件名,文件中出现的字母以及每个字母出现的总数)显示在上图中的空白区域,同时将结果写入"结果.txt"(和类放在同一文件夹)。
时间: 2024-03-08 11:48:04 浏览: 181
Java实现统计某一目录下每个文件中出现的字母个数、数字个数、空格个数及行数
好的,这是一个比较复杂的程序,需要分几个步骤来实现。
首先,我们需要创建一个 Java 程序,并设计主界面。可以使用 Swing 或 JavaFX 来实现界面的设计,这里我选择使用 Swing。
以下是主界面的设计代码:
```java
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
public class MainFrame extends JFrame {
public MainFrame() {
super("文件统计");
setSize(600, 400);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel(new BorderLayout());
JTextArea resultArea = new JTextArea();
JScrollPane scrollPane = new JScrollPane(resultArea);
JButton openButton = new JButton("打开...");
openButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
// TODO: 打开目录对话框,统计文件中字母出现次数,并将结果显示在 resultArea 中
}
});
panel.add(openButton, BorderLayout.NORTH);
panel.add(scrollPane, BorderLayout.CENTER);
setContentPane(panel);
setVisible(true);
}
public static void main(String[] args) {
new MainFrame();
}
}
```
接下来,我们需要实现打开目录对话框,统计文件中字母出现次数,并将结果显示在 `resultArea` 中的功能。
以下是代码实现:
```java
import javax.swing.*;
import javax.swing.filechooser.FileNameExtensionFilter;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;
import java.util.Scanner;
public class MainFrame extends JFrame {
public MainFrame() {
super("文件统计");
setSize(600, 400);
setLocationRelativeTo(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel panel = new JPanel(new BorderLayout());
JTextArea resultArea = new JTextArea();
JScrollPane scrollPane = new JScrollPane(resultArea);
JButton openButton = new JButton("打开...");
openButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
JFileChooser fileChooser = new JFileChooser();
fileChooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
int result = fileChooser.showOpenDialog(MainFrame.this);
if (result == JFileChooser.APPROVE_OPTION) {
File directory = fileChooser.getSelectedFile();
Map<Character, Integer> charCount = new HashMap<>();
countCharInDirectory(directory, charCount);
StringBuilder resultBuilder = new StringBuilder();
for (Map.Entry<Character, Integer> entry : charCount.entrySet()) {
resultBuilder.append(entry.getKey());
resultBuilder.append(": ");
resultBuilder.append(entry.getValue());
resultBuilder.append("\n");
}
resultArea.setText(resultBuilder.toString());
writeResultToFile(directory, charCount);
}
}
});
panel.add(openButton, BorderLayout.NORTH);
panel.add(scrollPane, BorderLayout.CENTER);
setContentPane(panel);
setVisible(true);
}
private void countCharInDirectory(File directory, Map<Character, Integer> charCount) {
File[] files = directory.listFiles();
if (files != null) {
for (File file : files) {
if (file.isDirectory()) {
countCharInDirectory(file, charCount);
} else if (file.isFile() && file.getName().endsWith(".txt")) {
try (Scanner scanner = new Scanner(file)) {
while (scanner.hasNextLine()) {
String line = scanner.nextLine();
for (char c : line.toCharArray()) {
if (Character.isLetter(c)) {
c = Character.toLowerCase(c);
charCount.put(c, charCount.getOrDefault(c, 0) + 1);
}
}
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
}
}
}
private void writeResultToFile(File directory, Map<Character, Integer> charCount) {
File resultFile = new File(directory, "结果.txt");
try (PrintWriter writer = new PrintWriter(resultFile)) {
for (Map.Entry<Character, Integer> entry : charCount.entrySet()) {
writer.printf("%c: %d\n", entry.getKey(), entry.getValue());
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
public static void main(String[] args) {
new MainFrame();
}
}
```
以上代码中,`countCharInDirectory` 方法用于递归统计目录中所有 txt 文件中字母出现次数,`writeResultToFile` 方法用于将结果写入文件,而 `openButton` 的监听器中则调用这两个方法,并将统计结果显示在 `resultArea` 中。
注意:在代码中,`resultArea` 中的文本只显示了字母和出现次数,没有显示文件路径和文件名,如需显示,可按照需要修改代码。
另外,由于需要处理文件和目录,因此在使用时,需要保证程序有访问文件和目录的权限。
阅读全文