文件分割機

文件分割與合并


要求:實現對大文件的分割與合并。

按指定個數切(如把一個文件切成10份)或按指定大小切(如每份最大不超過10M),這兩種方式都能夠。

程序說明:

文件分割:把一個文件分割成多個碎片,每一個碎片的大小不超過1M。自己可把功能進一步擴展:分割前的文件名稱、長度,分割后的碎片個數、文件名稱等信息可寫到第一個碎

片中或另外用properties把這些寫到配置文件里。

文件合并:這里簡單如果已知被合并文件夾的File對象和原文件的名字。

事實上這些全然能夠做成活的,如把這些信息保存在碎片文件或配置文件。也能夠相同用文件選擇對話框

來讀取用戶的選擇。

項目目的:

做一個簡單的圖形界面的文件處理器。能實現對單個文件的分割。和將多個文件合而唯一的功能。

個人想法:

本著做個簡單的圖形界面的想法,所以沒有過的美化界面。就是簡單的實現功能。

圖形界面模塊:兩個選擇button:分隔操作還是合并操作;一個退出button;兩個文本域。一個顯示要切割的文件和合成后的文件,還有一個顯示切割后的文件和要合成的文件;

兩個文本顯示框,分別在兩個文本域以下,顯示文本域中文件的路徑。(還有略微好點的界面就是用戶先選擇要切割和合并的文件,然后在選擇要存儲的位置,最后點操作button)

功能模塊:用戶點擊切割或合并button,彈出文件選擇框,切割時。僅僅能選擇一個文件,而合并時,設置能夠選擇多個文件,可是這個多個文件必須是同一類型的文件。切割

后和合并后的文件都應與相應操作前的文件類型同樣。

注意事項和問題:

1、圖形界面看個人喜好,能夠自己設置,但個人在布局上面喜歡用this.setLayout(null);然后通過setBounds設置絕對位置

2、要是實現可選擇存儲位置時,記得用jfc.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY);設置成僅僅選擇文件夾,且要將這句放在jfc.showOpenDialog(null)前

面,不然無效哦

3、關于分割和合并后的文件的存放和文件名稱問題值得深究

4、合并時。選中的多個文件類型要求同樣

5、文件的切割和合并(解說見io基礎到加強)

解決這個問題方案:

主要是注意事項和問題中的3。首先關于路徑。能夠在選中的文件的同級目錄下建立splitFile1或mergeFile1目錄,然后通過檢查是否存在這種目錄,若存在則取出那

兩個文件的后綴為數組的部分,然后將加1。再加在splitFIle或mergeFile后面。就可以避免存放路徑反復。由于有了前面的處理,所以僅僅要進行一次操作,只是是切割還是合并。

都會又一次建立一個不存在的目錄存放結果文件。并且合并時,還能夠將合并的分文件也同一時候拷貝都結果目錄中。

大概就是這么回事啊,還有非常多細節問題有待更新啊!

程序代碼:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
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.Enumeration;import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;public class FileSplitDemo extends JFrame implements ActionListener{JLabel titleLabel,resultLabel,dirLabel;JTextField sdirTextField,mdirTextField;JButton splitButton,mergeButton,exitJButton;JTextArea mergeTextArea,splitTextArea;JScrollPane jsp1,jsp2;JFileChooser jfc;File dirFile;static int mergeCount;//圖型界面設置public FileSplitDemo(){super("文件處理器");mergeCount=0;this.setSize(400, 500);this.setLocationRelativeTo(null);this.setDefaultCloseOperation(EXIT_ON_CLOSE);this.setResizable(false);this.setLayout(null);titleLabel=new JLabel("請選擇操作種類:");titleLabel.setBounds(10, 10, 100, 50);splitButton=new JButton("分割文件");splitButton.setBounds(50, 50, 100, 30);mergeButton=new JButton("合成文件");mergeButton.setBounds(230, 50, 100, 30);mergeTextArea=new JTextArea(10, 10);mergeTextArea.setEditable(false);resultLabel=new JLabel();resultLabel.setBounds(165, 180, 100, 50);dirLabel=new JLabel();dirLabel.setBounds(140, 200, 100, 100);sdirTextField=new JTextField();sdirTextField.setEditable(false);sdirTextField.setBounds(10, 400, 150, 30);mdirTextField=new JTextField();mdirTextField.setEditable(false);mdirTextField.setBounds(220, 400, 150, 30);exitJButton=new JButton("退出");exitJButton.setBounds(140, 430, 100, 30);exitJButton.addActionListener(this);jsp1=new JScrollPane(mergeTextArea);jsp1.setBounds(10, 90, 150, 300);splitTextArea=new JTextArea(10, 10);splitTextArea.setEditable(false);jsp2=new JScrollPane(splitTextArea);jsp2.setBounds(220, 90, 150, 300);this.getContentPane().add(titleLabel);this.getContentPane().add(mergeButton);this.getContentPane().add(splitButton);this.getContentPane().add(jsp1);this.getContentPane().add(jsp2);this.getContentPane().add(resultLabel);this.getContentPane().add(dirLabel);this.getContentPane().add(sdirTextField);this.getContentPane().add(mdirTextField);this.getContentPane().add(exitJButton);splitButton.addActionListener(this);mergeButton.addActionListener(this);this.setVisible(true);}public static void main(String[] args) {new FileSplitDemo();}public void actionPerformed(ActionEvent e) {if (e.getSource() == splitButton){jfc = new JFileChooser();jfc.setDialogTitle("請選擇一個要分割的文件");int result = jfc.showOpenDialog(this);File file =null;File desDir =null;//1分割if(result==JFileChooser.APPROVE_OPTION){//分割文件file = jfc.getSelectedFile();//用戶所選擇的文件mergeTextArea.setText(file.getName());desDir = new File(file.getParent(),"splitFiles"+1);
//				System.out.println(desDir.getAbsolutePath());try {fileSplit(file,desDir);} catch (IOException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}dirFile=jfc.getCurrentDirectory();sdirTextField.setText(dirFile.getPath());mdirTextField.setText(desDir.getPath());resultLabel.setText("分割結果");dirLabel.setIcon(new ImageIcon("right.png"));}}if (e.getSource() == mergeButton){jfc = new JFileChooser();jfc.setDialogTitle("請選擇若干個要合成的文件");jfc.setMultiSelectionEnabled(true);int result = jfc.showOpenDialog(this);File[] files =null;File desDir =null;//合成if(result==JFileChooser.APPROVE_OPTION){files = jfc.getSelectedFiles();if(!isLegal(files)){//推斷是否存在種文件JOptionPane.showMessageDialog(this, "請選擇同一類型文件!!");return;}String str="";for(int i=0;i<files.length;i++){str+=files[i].getName()+"\r\n";}splitTextArea.setText(str);desDir = new File(files[0].getParent(),"mergeFiles"+1);try {mergeFile(files,desDir);} catch (IOException e1) {// TODO Auto-generated catch blocke1.printStackTrace();}dirFile=jfc.getCurrentDirectory();sdirTextField.setText(dirFile.getPath());mdirTextField.setText(dirFile.getPath());resultLabel.setText("合成結果");dirLabel.setIcon(new ImageIcon("left.png"));}}if(e.getSource()==exitJButton){System.exit(EXIT_ON_CLOSE);}}private boolean isLegal(File[] files) {String s=" ",a;int count=0;for(int i=0;i<files.length;i++){a=files[i].getName();int j=a.lastIndexOf('.');String str=a.substring(j+1);if(s.compareToIgnoreCase(str)!=0){s=str;count++;}if(count>1){return false;}}return true;}private void mergeFile(File[] files, File srcDir) throws IOException{if(files.length==0){throw new RuntimeException("碎片不存在。");}while(srcDir.exists()){//假設路徑存在。則改動路徑,規則就是將文件后綴加1String s=getName(srcDir.getName());srcDir=new File(srcDir.getParent(),s);}srcDir.mkdirs();//System.out.println(srcDir.getParent()+" "+srcDir.getAbsoluteFile());fileCopy(files,srcDir.getParent(),srcDir.getAbsoluteFile());//用序列流進行文件合并ArrayList<FileInputStream> aList = new ArrayList<FileInputStream>();for(int i=0;i<files.length;i++){aList.add(new FileInputStream( files[i]) );}//枚舉接口對象Enumeration<FileInputStream> en = Collections.enumeration(aList);SequenceInputStream sis = new SequenceInputStream(en);//把序列流其中的內容寫到一個新文件(合并后的文件)int a=files[0].getName().lastIndexOf('.');String s="megreFile"+files[0].getName().substring(a);mergeTextArea.setText(s);FileOutputStream fos = new FileOutputStream(new File(srcDir,s));byte buf[] = new byte[1024];int len=0;while( (len=sis.read(buf))!=-1){fos.write(buf,0,len);}fos.close();sis.close();}private void fileCopy(File[] files, String dir1, File dir2) {System.out.println(dir1+" "+dir2);BufferedInputStream in = null;BufferedOutputStream out = null;for (int j = 0; j < files.length; j++) {try {in = new BufferedInputStream(new FileInputStream(files[j]));out = new BufferedOutputStream(new FileOutputStream(new File(dir2,files[j].getName())));byte[] buffer = new byte[512];int num = 0;while (in.available() > 0) {num = in.read(buffer);//最簡單的加密for (int i = 0; i < num; i++) {buffer[i] = (byte) (buffer[i] + 1);}out.write(buffer, 0, num);}} catch (FileNotFoundException e) {e.printStackTrace();} catch (Exception e) {} finally {try {in.close();out.close();} catch (IOException e) {throw new RuntimeException("文件無法關閉");}}}}private void fileSplit(File srcFile, File desDir) throws IOException{//1源FileInputStream fis = new FileInputStream(srcFile);//2目的while(desDir.exists()){String s=getName(desDir.getName());desDir=new File(desDir.getParent(),s);}desDir.mkdirs();//分割FileOutputStream fos = null;byte buf[] = new byte[1024*1024];int len=0;int count=1;String s="";while( (len=fis.read(buf))!=-1 ){int a=srcFile.getName().lastIndexOf('.');String fileName = srcFile.getName().substring(0,a)+(count++)+srcFile.getName().substring(a);s+=fileName+"\r\n";fos = new FileOutputStream( new File(desDir,fileName) );fos.write(buf,0,len);fos.close();}splitTextArea.setText(s);}private String getName(String name) {int k=0;for(int i=0;i<name.length();i++){if(name.charAt(i)>='0'&&name.charAt(i)<='9'){k=i;break;}}String s=name.substring(k,name.length());int a=Integer.parseInt(s)+1;return name.substring(0, k)+a;}}

執行截圖:

開始:

切割文件:

切割完畢:

切割碎片和存放:

合并文件:

合并完畢:

合并文件存放:
















轉載于:https://www.cnblogs.com/wzjhoutai/p/7394510.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/454893.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/454893.shtml
英文地址,請注明出處:http://en.pswp.cn/news/454893.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

mysql pow函數怎么用_pow函數怎么用

PHP pow函數表示指數表達式。pow函數怎么用&#xff1f;php pow()函數 語法作用&#xff1a;pow()函數的作用是將一個數進行n次方計算后返回語法&#xff1a;pow(X,Y);參數&#xff1a;X表示要做處理的數字Y表示指定n次方中的n數值說明&#xff1a;返回X的Y次方冪&#xff0c;如…

【IntelliJ IDEA】添加一個新的tomcat,tomcat啟動無法訪問歡迎頁面,空白頁,404

第一部分&#xff0c;添加一個tomcat 1.先把Toolbar 和 Tool Buttons顯示出來 2.選擇Edit Configurations 3.添加一個新的tomcat server進來 解決no artifacts configured問題&#xff0c;就是沒有項目加入里面 先添加一個沒有的項目 啟動之后找不到 頁面 第二部分&#xff0c…

回文數-時間變換-判斷郵箱

class huiwenshu public class huiwenshu {public static void main(String[] args) {System.out.println("輸入...");Scanner in new Scanner(System.in);String number in.next();boolean flag true;for(int i0;i<number.trim().length()/2;i){if(!String.va…

mac eclipse tomcat mysql_mac下使用eclipse+tomcat+mysql開發 j2ee(一)

在這里是使用eclipse&#xff0b;tomcat&#xff0b;mysql的方式。1、軟件下載(1) eclipse我使用的是mac&#xff0c;因為本人是蘋果客戶端開發者&#xff0c;所以目前只有蘋果機器了。首先下載eclipse for mac&#xff0c;選擇mac 64位&#xff0c;下載eclipse-jee-kepler-SR1…

社交系統ThinkSNS-plus(TS+)V1.0發布!

2019獨角獸企業重金招聘Python工程師標準>>> 需要購買源碼的同志們&#xff0c;依然隨時可以聯系我們手機&#xff1a;18108035545&#xff08;同微信&#xff09;&#xff1b;電話&#xff1a;028-82884828 &#xff1b;QQ&#xff1a;3298713109&#xff1b; 從決…

《軟件架構設計》一書目錄

第一部分 軟件架構概念與思想篇 1 第1章 解析軟件架構概念 3 1.1 軟件架構概念的分類 3 1.1.1 組成派 4 1.1.2 決策派 5 1.2 軟件架構概念大觀 5 1.2.1 Booch、Rumbaugh和Jacobson的定義 5 1.2.2 Woods的觀點 6 1.2.3 Garlan和Shaw的定義 6 1.2.4 Perry和Wolf的定義 …

.net 讀取mysql數據庫配置文件_.NETCore添加及讀取默認配置文件信息

這里的默認配置文件指的是項目中的appsettings.json文件&#xff0c;我們可以把一些配置信息保存在里面&#xff0c;比如數據庫連接信息。來吧&#xff0c;看例子&#xff1a;1、先在appsettings.json文件中寫入數據庫的連接信息&#xff1a;{"Logging": {"LogL…

年齡層統計SQL

-- 處理名單丟失SELECT u.user_id u_userid,o.user_id o_userid,o.* FROMtb_gh_orders o LEFT JOIN tb_gh_user u ON o.user_id u.user_id WHERE o.course_id 128 AND o.order_state 1 ;-- 年齡段統計SELECT T1.*,CONCAT(LEFT (T1.C1 / T2.C2 * 100, 5), %) P FROM(SELECT C…

h5 img js 點擊圖片放大_H5實現移動端圖片預覽:手勢縮放, 手勢拖動,雙擊放大......

查看示例效果&#xff1a;一、功能介紹圖片預覽主要有以下幾個功能點組成&#xff1a;監聽圖片點擊事件&#xff0c;進入圖片預覽模式自定義手勢事件, (雙指縮放&#xff0c;滑動&#xff0c;雙擊。。。)監聽圖片手勢事件&#xff0c;通過 transform-matrix 實現圖片的各種變換…

[轉載]建立團隊溝通協作工作方式

很多初創團隊、以及剛開始嘗試敏捷的團隊&#xff0c;沒有工作協議的概念&#xff0c;熱熱鬧鬧&#xff0c;混混亂亂。本文介紹了關于工作協議的What, Why, Who, When, 以及How。 What:什么是工作協議 工作協議&#xff1a;由團隊共同商議&#xff0c;達成一致遵守的一組規則、…

私有云促進企業管理變革 助力企業快步前行

在全球經濟迅速發展和科學技術突飛猛進的情況下, 無論是制造型企業還是服務型行業&#xff0c;企業數量都在迅速增加,產品和服務質量也日趨完善。這必然導致一個結果——企業間的競爭更加激烈、產品的同質化現象日益明顯。在這樣的大背景之下, 再伴隨著現代管理和營銷理論的不斷…

linux安裝自帶mysql嗎_Linux下安裝mysql

前提下必須要有這三個文件夾A.jpgB.jpg還要安裝這兩個軟件&#xff1b;直接百度官網即可&#xff1b;先通過Xftp6這個軟件&#xff0c;編譯文件夾&#xff0c;C.jpg搭建mysql1.查看CentOS自帶的mysqlrpm -qa | grep mysql2.卸載CentOS自帶的mysqlrpm -e --nodeps 要卸載的軟件3…

Android深入源代碼分析理解Aidl總體調用流程(雷驚風)

2017年開始上班的第一天。老不想工作了&#xff0c;假期感覺還沒開始就已經結束了&#xff0c;唉&#xff0c;時間就是這樣&#xff0c;新的一年開始了&#xff0c;盡管非常不想干正事&#xff0c;沒辦法&#xff0c;必須干起來。由于后邊的路還非常長&#xff0c;距離六十歲還…

(轉載)UI接口分層自動化測試框架設計思想

閱讀本小節&#xff0c;需要讀者具備如下前提條件&#xff1a; 1. 掌握一種編程語言基礎&#xff0c;如java、python等。 2. 掌握一種單元測試框架&#xff0c;如java語言的testng框架、python的unittest框架。 3. 掌握目前主流的UI測試框架&#xff0c;移動端APP測試框架Ap…

如何提高閱讀源代碼的效率 .

如何提高閱讀源代碼的效率 記得在開源流行之前&#xff0c;我看過的代碼緊限于所參與的項目&#xff0c;能有個幾萬行就不錯哩。后來很多優秀開源項目都相繼蹦出來了&#xff0c;閱讀的代碼量那叫一個大呀&#xff01;不得不看。我現在掉到android這個大坑里&#xff0c;每天都…

170821-關于SpringMVC的知識點

1.SpringMVC 概述以及優勢 SpringMVC和Spring的關系&#xff1a; 軟件開發的三層架構&#xff1a; web層【表示層、表現層】---->Service層---->Dao[DataBase Access Object]---->數據庫&#xff01; SpringMVC實際上是Spring的一個子模塊&#xff0c;我們用Spring…

pojo類中list存儲其他字段_List集合流處理類型小結

本文為博主原創&#xff0c;未經允許不得轉載對應實體類importlombok.Getter;importlombok.Setter;GetterSetterpublic classStudent {privateString name;private intage;privateString className;privateString birthday;}1.根據字段取出某一個字段屬性的集合List studentLis…

Hash表的擴容(轉載)

Hash表&#xff08;Hash Table&#xff09;hash表實際上由size個的桶組成一個桶數組table[0...size-1] 。 當一個對象經過哈希之后。得到一個對應的value , 于是我們把這個對象放到桶table[ value ]中。當一個桶中有多個對象時。我們把桶中的對象組織成為一個鏈表。 這在沖突處…

寫在前面的一些話:《Learning OpenCV》中文版 .

2009-09-17 15:51 7578人閱讀 評論(4) 收藏 舉報 <!-- /* Font Definitions */ font-face {font-family:Helvetica; panose-1:2 11 5 4 2 2 2 2 2 4; mso-font-charset:0; mso-generic-font-family:swiss; mso-font-format:other; mso-font-pitch:variable; mso-font-sign…

獨家 | 一文讀懂自然語言處理NLP(附學習資料)

前言 自然語言處理是文本挖掘的研究領域之一&#xff0c;是人工智能和語言學領域的分支學科。在此領域中探討如何處理及運用自然語言。 對于自然語言處理的發展歷程&#xff0c;可以從哲學中的經驗主義和理性主義說起。基于統計的自然語言處理是哲學中的經驗主義&#xff0c;基…