Java實現(xiàn)大文件的分割與合并的方法詳解
一、題目描述-合并多個文本文件
1、題目
題目:做一個合并多個文本文件的工具。
2、解題思路
創(chuàng)建一個類:TextFileConcatenation
使用TextFileConcatenation繼承JFrame構(gòu)建窗體
讀取文本文件時,用的是BufferedReader類的readLine()方法讀入一行數(shù)據(jù)。
將選擇的多個文本文件合并到d://concatenation.txt
3、代碼詳解
package com.xiaoxuzhu;
import java.awt.BorderLayout;
import java.awt.EventQueue;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileFilter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
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.JTextArea;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;
/**
* Description: 合并多個文本文件工具
*
* @author xiaoxuzhu
* @version 1.0
*
* <pre>
* 修改記錄:
* 修改后版本 修改人 修改日期 修改內(nèi)容
* 2022/5/3.1 xiaoxuzhu 2022/5/3 Create
* </pre>
* @date 2022/5/3
*/
public class TextFileConcatenation extends JFrame {
/**
*
*/
private JPanel contentPane;
private JTextField textField;
private File[] textFiles;
private JTextArea textArea;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
TextFileConcatenation frame = new TextFileConcatenation();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public TextFileConcatenation() {
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 panel = new JPanel();
contentPane.add(panel, BorderLayout.NORTH);
JLabel fileLabel = new JLabel("文件夾所在位置");
panel.add(fileLabel);
textField = new JTextField();
panel.add(textField);
textField.setColumns(10);
JButton button = new JButton("選擇文件夾");
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
do_button_actionPerformed(e);
}
});
panel.add(button);
JScrollPane scrollPane = new JScrollPane();
contentPane.add(scrollPane, BorderLayout.CENTER);
textArea = new JTextArea();
scrollPane.setViewportView(textArea);
JPanel buttonPanel = new JPanel();
contentPane.add(buttonPanel, BorderLayout.SOUTH);
JButton concatButton = new JButton("合并文件");
concatButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
do_concatButton_actionPerformed(e);
}
});
buttonPanel.add(concatButton);
}
protected void do_button_actionPerformed(ActionEvent e) {
JFileChooser chooser = new JFileChooser();
chooser.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);
chooser.setMultiSelectionEnabled(false);
int result = chooser.showOpenDialog(this);
if (result == JFileChooser.APPROVE_OPTION) {
File selectFile = chooser.getSelectedFile();
textField.setText(selectFile.getAbsolutePath());
textFiles = selectFile.listFiles(new FileFilter() {
@Override
public boolean accept(File pathname) {
if (pathname.getAbsolutePath().endsWith(".txt")) {
return true;
} else {
return false;
}
}
});
for (File textFile : textFiles) {
textArea.append(textFile.getAbsolutePath() + "\n\r");
}
}
}
protected void do_concatButton_actionPerformed(ActionEvent e) {
if (textFiles == null) {
JOptionPane.showMessageDialog(this, "請選擇文件文件位置!", "警告信息", JOptionPane.WARNING_MESSAGE);
return;
}
if (textFiles.length == 0) {
JOptionPane.showMessageDialog(this, "文件夾中不包括文本文件!", "警告信息", JOptionPane.WARNING_MESSAGE);
return;
}
BufferedReader reader = null;
FileWriter writer = null;
try {
writer = new FileWriter("d://concatenation.txt");// 創(chuàng)建文件輸出流
for (File textFile : textFiles) {// 遍歷用戶選擇的文本文件
reader = new BufferedReader(new FileReader(textFile));// 創(chuàng)建緩沖輸入流
String line;
while ((line = reader.readLine()) != null) {
writer.write(line);// 將讀入的數(shù)據(jù)寫入到文件中
}
}
JOptionPane.showMessageDialog(this, "文件合并成功!", "提示信息", JOptionPane.INFORMATION_MESSAGE);
return;
} catch (IOException e1) {
e1.printStackTrace();
} finally {
if (writer != null) {
try {
writer.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
if (reader != null) {
try {
reader.close();
} catch (IOException e1) {
e1.printStackTrace();
}
}
}
}
}
啟動:

合并前:選擇文件夾




合并后:

二、題目描述-對大文件進行分割處理
1、題目
題目:大數(shù)據(jù)文件為了方便傳輸,通常會進行切割處理。
實現(xiàn)一個將大文件分割成多個文件的工具
2、解題思路
創(chuàng)建一個類:ComminuteFrame
使用ComminuteFrame繼承JFrame構(gòu)建窗體
ComminuteFrame 增加標(biāo)簽,文本框和分割按鈕
創(chuàng)建一個類:ComminuteUtil
ComminuteUtil主要處理分割的邏輯處理
通過輸入流讀取要分割的文件,分別從流中讀取相應(yīng)的字節(jié)數(shù);
將其寫到.tem的后綴文件中,分割的文件存放在源文件的對應(yīng)目錄下。
3、代碼詳解
ComminuteFrame類
package com.xiaoxuzhu;
import java.awt.EventQueue;
import java.awt.FileDialog;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.io.File;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.EmptyBorder;
/**
* Description: 對大文件進行分割處理
*
* @author xiaoxuzhu
* @version 1.0
*
* <pre>
* 修改記錄:
* 修改后版本 修改人 修改日期 修改內(nèi)容
* 2022/5/3.1 xiaoxuzhu 2022/5/3 Create
* </pre>
* @date 2022/5/3
*/
public class ComminuteFrame extends JFrame {
/**
*
*/
private static final long serialVersionUID = 2547743180459668116L;
private JPanel contentPane;
private JTextField sourceTextField;
private JTextField sizeTextField;
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
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() {
@Override
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() {
@Override
public void keyTyped(KeyEvent event) { // 某鍵按下時調(diào)用的方法
char ch = event.getKeyChar(); // 獲取用戶鍵入的字符
if ((ch < '0' || ch > '9')) { // 如果用戶輸入的信息不為數(shù)字或小數(shù)
event.consume(); // 不允許用戶鍵入
}
}
});
JLabel lblM = new JLabel("M");
lblM.setBounds(313, 86, 44, 15);
panel.add(lblM);
JButton cominButton = new JButton("分割");
cominButton.addActionListener(new ActionListener() {
@Override
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() {
@Override
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類
package com.xiaoxuzhu;
import java.io.*;
/**
* Description:
*
* @author xiaoxuzhu
* @version 1.0
*
* <pre>
* 修改記錄:
* 修改后版本 修改人 修改日期 修改內(nèi)容
* 2022/5/3.1 xiaoxuzhu 2022/5/3 Create
* </pre>
* @date 2022/5/3
*/
public class ComminuteUtil {
// 實現(xiàn)文件分割方法
public void fenGe(File commFile, File untieFile, int filesize) {
FileInputStream fis = null;
int size = 1024 * 1024; // 用來指定分割文件要以MB為單位
try {
if (!untieFile.isDirectory()) { // 如果要保存分割文件地址不是路徑
untieFile.mkdirs(); // 創(chuàng)建該路徑
}
size = size * filesize;
int length = (int) commFile.length(); // 獲取文件大小
int num = length / size; // 獲取文件大小除以MB的得數(shù)
int yu = length % size; // 獲取文件大小與MB相除的余數(shù)
String newfengeFile = commFile.getAbsolutePath(); // 獲取保存文件的完成路徑信息
int fileNew = newfengeFile.lastIndexOf(".");
String strNew = newfengeFile.substring(fileNew, newfengeFile.length()); // 截取字符串
fis = new FileInputStream(commFile); // 創(chuàng)建FileInputStream類對象
File[] fl = new File[num + 1]; // 創(chuàng)建文件數(shù)組
int begin = 0;
for (int i = 0; i < num; i++) { // 循環(huán)遍歷數(shù)組
fl[i] = new File(untieFile.getAbsolutePath() + "\\" + (i + 1) + strNew + ".tem"); // 指定分割后小文件的文件名
if (!fl[i].isFile()) {
fl[i].createNewFile(); // 創(chuàng)建該文件
}
FileOutputStream fos = new FileOutputStream(fl[i]);
byte[] bl = new byte[size];
fis.read(bl); // 讀取分割后的小文件
fos.write(bl); // 寫文件
begin = begin + size * 1024 * 1024;
fos.close(); // 關(guān)閉流
}
if (yu != 0) { // 文件大小與指定文件分割大小相除的余數(shù)不為0
fl[num] = new File(untieFile.getAbsolutePath() + "\\" + (num + 1) + strNew + ".tem"); // 指定文件分割后數(shù)組中最后一個文件名
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();
}
}
}
分割前:

分割后:

三、題目描述-分割后又再次合并
1、題目
題目:分割后的文件要能再次正常使用,需要合并。
實現(xiàn):做一個把分割后的文件又再次合并的工具
2、解題思路
創(chuàng)建一個類:UniteFrame
使用UniteFrame繼承JFrame構(gòu)建窗體
UniteFrame增加標(biāo)簽,文本框和分割按鈕
創(chuàng)建一個類:UniteUtil
UniteUtil主要處理合并的邏輯處理
通過文件字節(jié)輸入/輸出流,把要合并的所有文件讀取后,統(tǒng)一寫入新文件中。
3、代碼詳解
UniteFrame類:
package com.xiaoxuzhu;
import java.awt.EventQueue;
import java.awt.FileDialog;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.util.ArrayList;
import java.util.List;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.border.EmptyBorder;
/**
* Description:
*
* @author xiaoxuzhu
* @version 1.0
*
* <pre>
* 修改記錄:
* 修改后版本 修改人 修改日期 修改內(nèi)容
* 2022/5/3.1 xiaoxuzhu 2022/5/3 Create
* </pre>
* @date 2022/5/3
*/
public class UniteFrame extends JFrame {
/**
*
*/
private JPanel contentPane;
JList fileList = new JList();
DefaultListModel listModel = new DefaultListModel();
String folder = "";
String fileName = "";
List<String> 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);
}
// 打開按鈕的單擊事件
@SuppressWarnings("rawtypes")
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.unite(files, new File(folder), newName);
JOptionPane.showMessageDialog(getContentPane(), "文件合并成功!", "信息提示框", JOptionPane.PLAIN_MESSAGE);
}
// 退出按鈕的單擊事件
protected void do_closeButton_actionPerformed(ActionEvent arg0) {
System.exit(0);
}
}
UniteUtil類
package com.xiaoxuzhu;
import java.io.*;
import java.util.*;
/**
* Description:
*
* @author xiaoxuzhu
* @version 1.0
*
* <pre>
* 修改記錄:
* 修改后版本 修改人 修改日期 修改內(nèi)容
* 2022/5/3.1 xiaoxuzhu 2022/5/3 Create
* </pre>
* @date 2022/5/3
*/
public class UniteUtil {
/**
* @param file
* :要進行合并的文件數(shù)組對象
* @param cunDir
* :合并后文件的保存路徑
* @param hz
* :合并后文件的格式
*/
public void unite(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); // 創(chuàng)建FileOutputStream對象
for (int i = 0; i < file.length; i++) { // 循環(huán)遍歷要進行合并的文件數(shù)組對象
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(); // 將流關(guān)閉
}
fos.close();
} catch (Exception e) {
e.printStackTrace();
}
}
// 獲取磁盤所有文件方法
public List<String> 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;
}
}
合并成功:

4、多學(xué)一個知識點
新合并的文件,是怎么知道后綴文件名是哪個
這個在進行分割處理時就有考慮設(shè)計了,切割的文件名是以1.zip.tem,前面的是切割排序號,中間的是源文件的文件類型后綴,最后是切割文件后綴。
String newName = fileName.substring(fileName.indexOf("."), fileName.lastIndexOf("."));到此這篇關(guān)于Java實現(xiàn)大文件的分割與合并的方法詳解的文章就介紹到這了,更多相關(guān)Java文件分割 合并內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
IDEA編譯報錯:Error:java:無效的源發(fā)行版:17的解決辦法
IDEA里面裝了幾個版本的JDK,導(dǎo)入工程后時不時提示一下錯誤,下面這篇文章主要給大家介紹了關(guān)于IDEA編譯報錯:Error:java:無效的源發(fā)行版:17的解決辦法,需要的朋友可以參考下2023-01-01
JavaEE開發(fā)之SpringMVC中的自定義消息轉(zhuǎn)換器與文件上傳
本篇文章主要介紹了SpringMVC的相關(guān)知識。同時也會介紹到j(luò)s、css這些靜態(tài)文件的加載配置,以及服務(wù)器推送的兩種實現(xiàn)方式并且給出了兩者的區(qū)別。下面跟著小編一起來看下吧2017-04-04
Spring的嵌套事務(wù)(Propagation.NESTED)到底是個啥案例代碼講解
SavePoint是數(shù)據(jù)庫事務(wù)中的一個概念,?可以將整個事務(wù)切割為不同的小事務(wù),可以選擇將狀態(tài)回滾到某個小事務(wù)發(fā)生時的樣子,本文通過案例代碼講解Spring的嵌套事務(wù)(Propagation.NESTED)到底是個啥,感興趣的朋友跟隨小編一起看看吧2023-01-01

