java Swing TXT文件分割程序
自学了javaSwing和文件读取相关知识,做了一个分割TXT文件的小程序。
思路
先获取到要分割的文件路径,分割后的文件保存目录和要分割的数目,然后根据原TXT文件的行数和要分割的数目将原TXT文件分割为result0.txt,result1.txt,result2.txt,result3.txt。。。。
代码
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.*;
import static javax.swing.JFileChooser.DIRECTORIES_ONLY;
import static javax.swing.JFileChooser.FILES_ONLY;
public class myTxtTool extends JFrame {
JLabel jLabel_getFile;
JTextField jTextField_getFilePath;
JButton jButton_getFilePath;
JLabel jLabel_saveFile;
JTextField jTextField_saveFilePath;
JButton jButton_saveFilePath;
JLabel jLabel_count;
JTextField jTextField_count;
JButton jButton_start;
JLabel jLabel_result = new JLabel();
JPanel jPanel;
myTxtTool(){
setTitle("我的TXT文件分割程序");
setLayout(new BorderLayout());
setSize(400,200);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jLabel_getFile = new JLabel("源文件路径:");
jTextField_getFilePath = new JTextField(16);
jButton_getFilePath = new JButton("浏览");
jButton_getFilePath.addActionListener(new jButton_getFilePath_ActionListener());//对jButton_getFilePath添加一个事件监听器,当该按钮被点击时,将打开一个文件浏览的窗口
jLabel_saveFile = new JLabel("生成文件路径:");
jTextField_saveFilePath = new JTextField(16);
jButton_saveFilePath = new JButton("保存到...");
jButton_saveFilePath.addActionListener(new jButton_saveFilePath_ActionListener());//对jButton_saveFilePath添加一个事件监听器,当该按钮被点击时,将打开一个保存文件的窗口
jLabel_count = new JLabel("生成文件的数目:");
jTextField_count = new JTextField(16);
jButton_start = new JButton("开始分割");
jButton_start.addActionListener(new jButton_start_ActionListener());//对jButton_start添加一个事件监听器:当该按钮被点击时,对文件进行分割并根据是否分割成功反馈提示窗口
jPanel = new JPanel(new FlowLayout());
jPanel.add(jLabel_getFile);
jPanel.add(jTextField_getFilePath);
jPanel.add(jButton_getFilePath);
jPanel.add(jLabel_saveFile);
jPanel.add(jTextField_saveFilePath);
jPanel.add(jButton_saveFilePath);
jPanel.add(jLabel_count);
jPanel.add(jTextField_count);
jPanel.add(jButton_start);
jPanel.add(jLabel_result);
add(jPanel);
setVisible(true);
}
class jButton_start_ActionListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
File sourceFile = new File(jTextField_getFilePath.getText());//获取TXT文件
int lines = getTxtLine(sourceFile);//计算出该文件的总行数
int targetCount = Integer.parseInt(jTextField_count.getText());//获取要分割成的数目
String savePath = jTextField_saveFilePath.getText();//获取要保存到的目录
boolean fileExit = false;//首先判断该保存路径下是否已经存在result0等文件
for (int i = 0; i <= targetCount; i++) {
if(new File(savePath + "//result" + i + ".txt").exists()){
fileExit = true;
break;
}
}
if(fileExit){//输出文件已存在提示窗口
JOptionPane.showMessageDialog(null, "保存路径下已存在分割后的文件,请重新选择文件保存路径", "", JOptionPane.ERROR_MESSAGE);
} else {//输出文件不存在时,调用splitTxt函数对文件进行分割
boolean isSuccessful = splitTxt(sourceFile, targetCount, lines, savePath);
if (isSuccessful) {//弹出分隔成功窗口
JOptionPane.showMessageDialog(null, "成功分割文件", "successful", JOptionPane.INFORMATION_MESSAGE);
} else {//弹出分隔失败窗口
JOptionPane.showMessageDialog(null, "分割文件失败", "filed", JOptionPane.ERROR_MESSAGE);
}
}
}
}
class jButton_getFilePath_ActionListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {
JFileChooser jFileChooser_getFile = new JFileChooser();//JFileChooser 即为文件浏览窗口
jFileChooser_getFile.setFileSelectionMode(FILES_ONLY);//保证选取到的一定是文件而不是目录
int result = jFileChooser_getFile.showOpenDialog(null);//result记录的是是否通过该窗口选择了一个文件
if(result == JFileChooser.APPROVE_OPTION){
File sourceFile = jFileChooser_getFile.getSelectedFile();//获取到选择的文件
jTextField_getFilePath.setText(sourceFile.getAbsolutePath());//获取到选择的文件的绝对路径并记录在jTextField_getFilePath中,以便jButton_start_ActionListener的调用
} else{
jTextField_getFilePath.setText("未选取到文件");
}
}
}
class jButton_saveFilePath_ActionListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e) {//基本同上
JFileChooser jFileChooser_saveFile = new JFileChooser();
jFileChooser_saveFile.setFileSelectionMode(DIRECTORIES_ONLY);//保证选到的只能是目录
int result = jFileChooser_saveFile.showOpenDialog(null);
if(result == JFileChooser.APPROVE_OPTION){
File targetFile = jFileChooser_saveFile.getSelectedFile();
jTextField_saveFilePath.setText(targetFile.getAbsolutePath());
} else{
jTextField_saveFilePath.setText("未选取到目录");
}
}
}
public static int getTxtLine(File file) {//计算file的总行数
int lines = 0;//行数
FileReader f_reader = null;
BufferedReader b_reader = null;
try {
f_reader = new FileReader(file);
b_reader = new BufferedReader(f_reader);//通过BufferedReader类对文件进行遍历
while(b_reader.readLine() != null)
lines++;
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if(b_reader != null) {//注意关闭顺序
b_reader.close();
f_reader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
return lines;
}
public static boolean splitTxt(File file, int targetCount, int lines, String outPathName){
int fileNo = 0;//文件编号,方便命名
int nowLine = 0;//当前读到的源文件的第几行
int each = lines / targetCount;//分割后的文件的最大行数
FileReader f_reader ;
BufferedReader b_reader ;
FileWriter f_writer ;
BufferedWriter b_writer ;
try {
f_reader = new FileReader(file);
b_reader = new BufferedReader(f_reader);
f_writer = new FileWriter(new File(outPathName + "//result" + fileNo + ".txt"));
b_writer = new BufferedWriter(f_writer);
String s;
while ((s = b_reader.readLine()) != null) {
nowLine++;
if (!s.equals("")) {//当前读到的源文件不是空行时,将该行写入对应的文件中
b_writer.write(s);
b_writer.newLine();
if (nowLine / each != fileNo) {//更新编号
//如果不关闭通道直接new的话会导致数据丢失,因为BufferedWriter是将缓冲区
//充满后或者调用close()函数后才会将缓冲区的内容真正写入文件
b_writer.close();
f_writer.close();
fileNo++;
f_writer = new FileWriter(new File(outPathName + "//result" + fileNo + ".txt"));
b_writer = new BufferedWriter(f_writer);
}
}
}
try {
b_reader.close();
f_reader.close();
b_writer.close();
f_writer.close();
} catch (IOException e) {
e.printStackTrace();
}
return true;
} catch (IOException e) {
e.printStackTrace();
return false;
}
}
}
public class Main {
public static void main(String[] args) {
new myTxtTool();
}
}
代码运行
将Main类和myTxtTool类放到同一个包下,运行Main类中的main方法即可。