实例说明
大文件在传输时不方便,为了便于携带,很多软件都提供了将大文件分割的功能。本实例就是将较大的文件分割成若干个小文件,但是分割后的文件不能作为单独的文件运行。
关键技术
实现本实例的关键是通过输入流读取要分割的文件,再分别从流中读取相应的字节数,将其写入到以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();
}
}
}