每日一个java算法小分享【079文件分割】

 实例说明

   大文件在传输时不方便,为了便于携带,很多软件都提供了将大文件分割的功能。本实例就是将较大的文件分割成若干个小文件,但是分割后的文件不能作为单独的文件运行。

关键技术

   实现本实例的关键是通过输入流读取要分割的文件,再分别从流中读取相应的字节数,将其写入到以tem为后缀的文件中。通过FileInputStream类的read()方法可实现读取文件

注意

   在使用read()方法读取字节时,都会抛出IOException异常,因此在使用该方法读取字节时,要处理该异常。

  ComminuteFrame.java

import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.FileDialog;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.border.EmptyBorder;
import java.awt.FlowLayout;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.io.File;


public class ComminuteFrame extends JFrame {
    
    private JPanel contentPane;
    private JTextField sourceTextField;
    private JTextField sizeTextField;
   
    
    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    ComminuteFrame frame = new ComminuteFrame();
                    frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }
    
    /**
     * Create the frame.
     */
    public ComminuteFrame() {
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setBounds(100, 100, 430, 211);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);
        contentPane.setLayout(null);
        setTitle("文件分割");
        JPanel panel = new JPanel();
        panel.setBounds(0, 0, 414, 181);
        contentPane.add(panel);
        panel.setLayout(null);
        
        JLabel messagelabel = new JLabel("源文件:");
        messagelabel.setBounds(47, 41, 54, 20);
        panel.add(messagelabel);
        
        sourceTextField = new JTextField();
        sourceTextField.setBounds(105, 41, 178, 21);
        panel.add(sourceTextField);
        sourceTextField.setColumns(10);
        
        JButton sourceButton = new JButton("选择");
        sourceButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                do_sourceButton_actionPerformed(arg0);
            }
        });
        sourceButton.setBounds(303, 40, 67, 23);
        panel.add(sourceButton);
        
        JLabel sizelabel = new JLabel("分割大小:");
        sizelabel.setBounds(34, 86, 67, 15);
        panel.add(sizelabel);
        
        sizeTextField = new JTextField();
        sizeTextField.setBounds(105, 83, 178, 21);
        panel.add(sizeTextField);
        sizeTextField.setColumns(10);
        sizeTextField.addKeyListener(new KeyAdapter() {         
            public void keyTyped(KeyEvent event) {  //某键按下时调用的方法
                char ch = event.getKeyChar();       //获取用户键入的字符             
                if((ch<'0'||ch>'9')){  //如果用户输入的信息不为数字或小数
                    event.consume();                //不允许用户键入
                }
                
            }
        });

        
        JLabel lblM = new JLabel("M");
        lblM.setBounds(313, 86, 44, 15);
        panel.add(lblM);
        
        JButton cominButton = new JButton("分割");
        cominButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                do_cominButton_actionPerformed(arg0);
            }
        });
        cominButton.setBounds(101, 138, 93, 23);
        panel.add(cominButton);
        
        JButton close = new JButton("退出");
        close.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent arg0) {
                do_close_actionPerformed(arg0);
            }
        });
        close.setBounds(229, 138, 93, 23);
        panel.add(close);
    }
    protected void do_sourceButton_actionPerformed(ActionEvent arg0) {
        java.awt.FileDialog fd=new FileDialog(this);
        fd.setVisible(true);
        String path = fd.getDirectory()+fd.getFile();
        if(!path.equals("") && !(path == null)){
            sourceTextField.setText(path);
        }    
    }
    protected void do_cominButton_actionPerformed(ActionEvent arg0) {
        ComminuteUtil util = new ComminuteUtil();
        String path = sourceTextField.getText();
        int size = Integer.parseInt(sizeTextField.getText());
        String subPath = path.substring(0,path.lastIndexOf("\\"));
        util.fenGe(new File(path), new File(subPath),size);
        JOptionPane.showMessageDialog(getContentPane(),
                "文件分割成功!", 
                "信息提示框", JOptionPane.PLAIN_MESSAGE);
    }
    protected void do_close_actionPerformed(ActionEvent arg0) {
        System.exit(0);
    }
}

ComminuteUtil.java

import java.io.*;

public class ComminuteUtil {
    // 实现文件分割方法
public void fenGe(File commFile, File untieFile, int filesize) {
    FileInputStream fis = null;
    int size = 1024 * 1024; // 用来指定分割文件要以MB为单位
    try {
        if (!untieFile.isDirectory()) { // 如果要保存分割文件地址不是路径
            untieFile.mkdirs(); // 创建该路径
        }
        size = size * filesize;
        int length = (int) commFile.length(); // 获取文件大小
        int num = length / size; // 获取文件大小除以MB的得数
        int yu = length % size; // 获取文件大小与MB相除的余数
        String newfengeFile = commFile.getAbsolutePath(); // 获取保存文件的完成路径信息
        int fileNew = newfengeFile.lastIndexOf(".");
        String strNew = newfengeFile.substring(fileNew, newfengeFile
                .length()); // 截取字符串
        fis = new FileInputStream(commFile); // 创建FileInputStream类对象
        File[] fl = new File[num + 1]; // 创建文件数组
        int begin = 0;
        for (int i = 0; i < num; i++) { // 循环遍历数组
            fl[i] = new File(untieFile.getAbsolutePath() + "\\" + (i + 1)
                    + strNew + ".tem"); // 指定分割后小文件的文件名
            if (!fl[i].isFile()) {
                fl[i].createNewFile(); // 创建该文件
            }
            FileOutputStream fos = new FileOutputStream(fl[i]);
            byte[] bl = new byte[size];
            fis.read(bl); // 读取分割后的小文件
            fos.write(bl); // 写文件
            begin = begin + size * 1024 * 1024;
            fos.close(); // 关闭流
        }
        if (yu != 0) { // 文件大小与指定文件分割大小相除的余数不为0
            fl[num] = new File(untieFile.getAbsolutePath() + "\\"
                    + (num + 1) + strNew + ".tem"); // 指定文件分割后数组中最后一个文件名
            if (!fl[num].isFile()) {
                fl[num].createNewFile(); // 新建文件
            }
            FileOutputStream fyu = new FileOutputStream(fl[num]);
            byte[] byt = new byte[yu];
            fis.read(byt);
            fyu.write(byt);
            fyu.close();
        }
    } catch (Exception e) {
        e.printStackTrace();
    }
}
    
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值