java Swing TXT文件分割程序

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方法即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值