实例说明
实例079中介绍了如何实现将较大的文件进行分割,分割后的文件是不能运行的,如果想要运行分割后的文件,就需要通过程序对相应的文件进行重新合并。
关键技术
本实例实现文件合并,仍然是通过文件字节输入/输出流。在进行文件合并时,需要将要进行合并的所有文件全部读取之后。在写入到新文件中。
UniteFrame.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 javax.swing.DefaultListModel;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JList;
import javax.swing.JLabel;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.io.File;
import java.util.*;
public class UniteFrame extends JFrame {
private JPanel contentPane;
JList fileList = new JList();
DefaultListModel listModel = new DefaultListModel();
String folder = "";
String fileName = "";
List listPath = new ArrayList<String>();
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
UniteFrame frame = new UniteFrame();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public UniteFrame() {
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 425, 300);
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, 409, 262);
contentPane.add(panel);
panel.setLayout(null);
JScrollPane scrollPane = new JScrollPane();
scrollPane.setBounds(33, 51, 311, 151);
panel.add(scrollPane);
fileList.setModel(listModel);
scrollPane.setViewportView(fileList);
JLabel messagelabel = new JLabel("要进行合并的文件列表:");
messagelabel.setBounds(33, 20, 156, 21);
panel.add(messagelabel);
JButton openButton = new JButton("打开");
openButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
do_openButton_actionPerformed(arg0);
}
});
openButton.setBounds(43, 218, 68, 23);
panel.add(openButton);
JButton uniteButton = new JButton("合并");
uniteButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
do_uniteButton_actionPerformed(arg0);
}
});
uniteButton.setBounds(152, 218, 68, 23);
panel.add(uniteButton);
JButton closeButton = new JButton("退出");
closeButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
do_closeButton_actionPerformed(arg0);
}
});
closeButton.setBounds(258, 218, 68, 23);
panel.add(closeButton);
}
// 打开按钮的单击事件
protected void do_openButton_actionPerformed(ActionEvent arg0) {
java.awt.FileDialog fd = new FileDialog(this);
fd.setVisible(true);
folder = fd.getDirectory();
String path = fd.getDirectory() + fd.getFile();
fileName = fd.getFile();
UniteUtil util = new UniteUtil();
if (path.endsWith(".tem")) {
List list = util.getList(folder);
for (int i = 0; i < list.size(); i++) {
String abPath = list.get(i).toString();
if (abPath.endsWith(".tem")) {
System.out.println("ABPAth "+abPath);
listModel.addElement(abPath);
listPath.add(abPath);
}
}
}
validate();
}
// 合并按钮的单击事件
protected void do_uniteButton_actionPerformed(ActionEvent arg0) {
UniteUtil util = new UniteUtil();
String newName = fileName.substring(fileName.indexOf("."), fileName.lastIndexOf("."));
File[] files = new File[listPath.size()];
for(int i = 0;i<listPath.size();i++){
files[i] = new File(listPath.get(i).toString());
}
util.heBing(files,new File(folder),newName);
JOptionPane.showMessageDialog(getContentPane(),
"文件合并成功!",
"信息提示框", JOptionPane.PLAIN_MESSAGE);
}
// 退出按钮的单击事件
protected void do_closeButton_actionPerformed(ActionEvent arg0) {
System.exit(0);
}
}
UniteUtil.java
import java.io.*;
import java.util.*;
public class UniteUtil {
/**
* @param file
* :要进行合并的文件数组对象
* @param cunDir
* :合并后文件的保存路径
* @param hz
* :合并后文件的格式
*/
public void heBing(File[] file, File cunDir, String hz) {
try {
File heBingFile = new File(cunDir.getAbsoluteFile() + "\\UNTIE" + hz); // 指定分割后文件的文件名
if (!heBingFile.isFile()) {
heBingFile.createNewFile();
}
FileOutputStream fos = new FileOutputStream(heBingFile); // 创建FileOutputStream对象
for (int i = 0; i < file.length; i++) { // 循环遍历要进行合并的文件数组对象
FileInputStream fis = new FileInputStream(file[i]);
int len = (int) file[i].length(); // 获取文件长度
byte[] bRead = new byte[len];
fis.read(bRead); // 读取文件
fos.write(bRead); // 写入文件
fis.close(); // 将流关闭
}
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
// 获取磁盘所有文件方法
public List getList(String path) {
LinkedList<File> list = new LinkedList<File>();
ArrayList<String> listPath = new ArrayList<String>();
File dir = new File(path);
File file[] = dir.listFiles();
for (int i = 0; i < file.length; i++) {
if (file[i].isDirectory())
list.add(file[i]);
else {
listPath.add(file[i].getAbsolutePath());
}
}
File tmp;
while (!list.isEmpty()) {
tmp = list.removeFirst(); // 移除并返回集合中第一项
if (tmp.isDirectory()) {
file = tmp.listFiles();
if (file == null)
continue;
for (int i = 0; i < file.length; i++) {
if (file[i].isDirectory())
list.add(file[i]);
else {
listPath.add(file[i].getAbsolutePath());
}
}
} else {
}
}
return listPath;
}
}