`

实例183 - 简单的文件合并工具

 
阅读更多

SequenceInputStream类可以用来接收元素类型为输入流的枚举接口类型。本实例将使用它制作一个文件合并工具,可以使用该工具合并文本文件、音频文件、视频文件等。

心法领悟182:文件合并程序的增强。

  1. 读者可以在本实例的基础上修改表格控件、增加排序功能,并根据排序的结果来创建SequenceInputStream类的对象。
  2. 可以让文件选择器支持选择文件夹,利用文件的扩展名不同将需要合并的文件筛选出来进行合并。
  3. 可以为不同类型的文件专门编写一个合并工具。
    package com.mingrisoft.concat;
    
    import java.awt.BorderLayout;
    import java.awt.Dimension;
    import java.awt.EventQueue;
    import java.awt.Font;
    import java.awt.event.ActionEvent;
    import java.awt.event.ActionListener;
    import java.awt.event.WindowAdapter;
    import java.awt.event.WindowEvent;
    import java.io.BufferedInputStream;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.SequenceInputStream;
    import java.util.ArrayList;
    import java.util.Collections;
    import java.util.List;
    
    import javax.swing.JButton;
    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.JTable;
    import javax.swing.JTextField;
    import javax.swing.UIManager;
    import javax.swing.border.EmptyBorder;
    import javax.swing.table.DefaultTableModel;
    import javax.swing.table.JTableHeader;
    
    public class FileConcatenation extends JFrame {
        
        /**
         * 
         */
        private static final long serialVersionUID = 5592010207848128980L;
        private JPanel contentPane;
        private JTextField pathTextField;
        private JTable table;
        private int id;
        private List<FileInputStream> files = new ArrayList<FileInputStream>();
        
        /**
         * Launch the application.
         */
        public static void main(String[] args) {
            try {
                UIManager.setLookAndFeel("com.sun.java.swing.plaf.nimbus.NimbusLookAndFeel");
            } catch (Throwable e) {
                e.printStackTrace();
            }
            EventQueue.invokeLater(new Runnable() {
                public void run() {
                    try {
                        FileConcatenation frame = new FileConcatenation();
                        frame.setVisible(true);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                }
            });
        }
        
        /**
         * Create the frame.
         */
        public FileConcatenation() {
            addWindowListener(new WindowAdapter() {
                public void windowActivated(WindowEvent e) {
                    do_this_windowActivated(e);
                }
            });
            setTitle("\u6587\u4EF6\u5408\u5E76\u5DE5\u5177");
            setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            setBounds(100, 100, 450, 300);
            contentPane = new JPanel();
            contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
            contentPane.setLayout(new BorderLayout(0, 0));
            setContentPane(contentPane);
            
            JPanel choosePanel = new JPanel();
            contentPane.add(choosePanel, BorderLayout.NORTH);
            
            JLabel label = new JLabel("\u65B0\u6587\u4EF6\u7684\u7EDD\u5BF9\u8DEF\u5F84\uFF1A");
            label.setFont(new Font("微软雅黑", Font.PLAIN, 16));
            choosePanel.add(label);
            
            pathTextField = new JTextField();
            pathTextField.setFont(new Font("微软雅黑", Font.PLAIN, 16));
            choosePanel.add(pathTextField);
            pathTextField.setColumns(10);
            
            JButton chooseButton = new JButton("\u589E\u52A0\u6587\u4EF6");
            chooseButton.setFont(new Font("微软雅黑", Font.PLAIN, 16));
            chooseButton.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    do_chooseButton_actionPerformed(e);
                }
            });
            choosePanel.add(chooseButton);
            
            JPanel buttonPanel = new JPanel();
            contentPane.add(buttonPanel, BorderLayout.SOUTH);
            
            JButton concatButton = new JButton("\u5408\u5E76\u6587\u4EF6");
            concatButton.setFont(new Font("微软雅黑", Font.PLAIN, 16));
            concatButton.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent e) {
                    do_concatButton_actionPerformed(e);
                }
            });
            buttonPanel.add(concatButton);
            
            JScrollPane scrollPane = new JScrollPane();
            contentPane.add(scrollPane, BorderLayout.CENTER);
            
            table = new JTable();
            table.setFont(new Font("微软雅黑", Font.PLAIN, 14));
            table.setRowHeight(30);
            JTableHeader header = table.getTableHeader();
            header.setFont(new Font("微软雅黑", Font.PLAIN, 16));
            header.setPreferredSize(new Dimension(header.getWidth(), 35));
            scrollPane.setViewportView(table);
        }
        
        protected void do_chooseButton_actionPerformed(ActionEvent e) {
            JFileChooser fileChooser = new JFileChooser();
            fileChooser.setFileSelectionMode(JFileChooser.FILES_ONLY);
            int result = fileChooser.showOpenDialog(this);
            if (result == JFileChooser.APPROVE_OPTION) {
                File file = fileChooser.getSelectedFile();
                try {
                    files.add(new FileInputStream(file));
                } catch (FileNotFoundException e1) {
                    e1.printStackTrace();
                }
                DefaultTableModel model = (DefaultTableModel) table.getModel();
                model.addRow(new Object[] { ++id, file.getName() });
            }
        }
        
        protected void do_concatButton_actionPerformed(ActionEvent e) {
            String fileName = pathTextField.getText();
            if (fileName.length() == 0) {
                JOptionPane.showMessageDialog(this, "请输入新文件的绝对路径", "", JOptionPane.WARNING_MESSAGE);
                return;
            }
            if (files.size() == 0) {
                JOptionPane.showMessageDialog(this, "请选择要合并的文件", "", JOptionPane.WARNING_MESSAGE);
                return;
            }
            SequenceInputStream sis = new SequenceInputStream(Collections.enumeration(files));
            BufferedInputStream bis = new BufferedInputStream(sis);
            FileOutputStream out = null;
            try {
                out = new FileOutputStream(fileName);
                int length;
                while ((length = bis.read()) != -1) {
                    out.write(length);
                }
            } catch (IOException e1) {
                e1.printStackTrace();
            } finally {
                if (out != null) {
                    try {
                        out.close();
                    } catch (IOException e1) {
                        e1.printStackTrace();
                    }
                }
            }
            JOptionPane.showMessageDialog(this, "文件合并成功!", "", JOptionPane.WARNING_MESSAGE);
        }
        
        protected void do_this_windowActivated(WindowEvent e) {
            DefaultTableModel model = (DefaultTableModel) table.getModel();
            model.setColumnIdentifiers(new Object[] { "序号", "文件名" });
            table.setModel(model);
        }
    }
    
     
分享到:
评论

相关推荐

    Pro.ENGINEER野火版3.0从入门到精通.pdf

     本书面向初学者,结合大量实例说明软件功能,例子的选择经典而实用,简单易学,初学者以及具有一定基础的中级读者,都能通过书中给出的详细讲解完成每个例子,并通过技巧的提示达到举一反三的目的。 目录: ...

    数据合并工具.rar

    dbf文件合并、目录链接及数据汇总,帮助您整理文件,方便您的操作。适用于总部管理、统计、办公、财务、个人等处理文件时使用。不影响原文件内容和格式 一、当鼠标停在按钮键上时,会显示出相应的操作说明。每步...

    VB6.0压缩文件、解压文件、合并文件源码实例.rar

    VB6.0压缩文件、解压文件、合并文件源码实例,这个小工具的用处在于:你可以把图片文件和压缩文件合并起来,传到网上相册中,既保存了图片,同时也把你的文件(可以合并个人隐私文件哦!)传了上去。打开这个文件时...

    C#开发实例大全(基础卷).软件开发技术联盟(带详细书签) PDF 下载

    《C#开发实例大全(基础卷)》筛选、汇集了C#开发从基础知识到高级应用各个层面约600个实例及源代码,每个实例都按实例说明、关键技术、设计过程、详尽注释、秘笈心法的顺序进行了分析解读。全书分6篇共25章,主要...

    java源码包---java 源码 大量 实例

     Java数据压缩与传输实例,可以学习一下实例化套按字、得到文件输入流、压缩输入流、文件输出流、实例化缓冲区、写入数据到文件、关闭输入流、关闭套接字关闭输出流、输出错误信息等Java编程小技巧。 Java数组倒置...

    5案例四:[中英文 JSON 合并工具] Node 的文件操作能力 - fs(1).md

    node原理讲解实例探究|1源码挖掘: Webpack 中用到 Node 的 10 个核心基础能力2案例一: [龟兔赛跑] Node 的语言基础 - JS(ES5[6[78)案例二: [视频时长统计] Node 的模块机制(CommonJS)与包管理|6案例五: ...

    Visual C++程序开发范例宝典(光盘) 第八部分

    实例183 设置其他程序中编辑框内的文本 实例184 执行一个外部程序直到其结束 实例185 调用具有参数的可执行程序 6.7 线程同步 实例186 利用事件对象实现线程同步 实例187 利用互斥对象实现线程同步 实例188 ...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    实例182 简单的文件合并工具 231 8.2 泛型使用的简介 233 实例183 自定义非泛型栈结构 233 实例184 使用泛型实现栈结构 234 实例185 自定义泛型化数组类 235 实例186 泛型方法与数据查询 236 实例187 泛型化方法与...

    Delphi开发范例宝典目录

    实例190 简单的文件加密解密 244 5.7 其他 246 实例191 在DELPHI中控制Word 246 实例192 带日志的程序 247 实例193 获取窗口文本 248 实例194 判断文件是否正在被使用 250 实例195 提取文件中的图标...

    明日科技《C#示例源代码》(13-16)

    实例020 DataGridView中单元格合并及添加、显示行号 74 实例021 从DataGridView控件中拖放数据到TreeView控件 78 第3章 图形图像及多媒体应用 实例022 生成中文验证码 86 实例023 生成图片缩略图 88 ...

    C#程序开发范例宝典(第2版).part13

    实例183 M3U文件的创建及删除 264 实例184 获取MP3文件的播放时间 267 实例185 异步加载并播放声音文件 269 5.3 动画播放 270 实例186 播放Flash动画 270 实例187 制作AVI播放器 272 实例188 播放GIF动画 273 ...

Global site tag (gtag.js) - Google Analytics