文件拆分与合并(VE)

有些文件我们不想让别人看到,那就把文件拆开成几部分,然后把其中一部分给藏起来,别人就是拿到其中的碎片也无法合成,增加文件的安全性。

在学了文件拆分与合并之后,我对其做了界面实现,并加以改进。

代码实现:

<span style="font-family:Times New Roman;font-size:14px;">/*
 * App.java
 *
 * Created on __DATE__, __TIME__
 */

package cn.huncu.io.ex;

/**
 *
 * @author  __USER__
 */
public class App extends javax.swing.JFrame {

	/** Creates new form App */
	public App() {
		this.setContentPane(new ListPanel(this));
		this.validate();
		initComponents();
	}

	/** This method is called from within the constructor to
	 * initialize the form.
	 * WARNING: Do NOT modify this code. The content of this method is
	 * always regenerated by the Form Editor.
	 */
	//GEN-BEGIN:initComponents
	// <editor-fold defaultstate="collapsed" desc="Generated Code">
	private void initComponents() {

		menuBar = new javax.swing.JMenuBar();
		fileMenu = new javax.swing.JMenu();
		openMenuItem = new javax.swing.JMenuItem();
		saveMenuItem = new javax.swing.JMenuItem();
		saveAsMenuItem = new javax.swing.JMenuItem();
		exitMenuItem = new javax.swing.JMenuItem();
		editMenu = new javax.swing.JMenu();
		cutMenuItem = new javax.swing.JMenuItem();
		copyMenuItem = new javax.swing.JMenuItem();
		pasteMenuItem = new javax.swing.JMenuItem();
		deleteMenuItem = new javax.swing.JMenuItem();
		helpMenu = new javax.swing.JMenu();
		contentsMenuItem = new javax.swing.JMenuItem();
		aboutMenuItem = new javax.swing.JMenuItem();

		setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
		setMinimumSize(new java.awt.Dimension(800, 600));
		getContentPane().setLayout(null);

		fileMenu.setText("File");

		openMenuItem.setText("Open");
		fileMenu.add(openMenuItem);

		saveMenuItem.setText("Save");
		fileMenu.add(saveMenuItem);

		saveAsMenuItem.setText("Save As ...");
		fileMenu.add(saveAsMenuItem);

		exitMenuItem.setText("Exit");
		exitMenuItem.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent evt) {
				exitMenuItemActionPerformed(evt);
			}
		});
		fileMenu.add(exitMenuItem);

		menuBar.add(fileMenu);

		editMenu.setText("Edit");

		cutMenuItem.setText("Cut");
		editMenu.add(cutMenuItem);

		copyMenuItem.setText("Copy");
		editMenu.add(copyMenuItem);

		pasteMenuItem.setText("Paste");
		editMenu.add(pasteMenuItem);

		deleteMenuItem.setText("Delete");
		editMenu.add(deleteMenuItem);

		menuBar.add(editMenu);

		helpMenu.setText("Help");

		contentsMenuItem.setText("Contents");
		helpMenu.add(contentsMenuItem);

		aboutMenuItem.setText("About");
		helpMenu.add(aboutMenuItem);

		menuBar.add(helpMenu);

		setJMenuBar(menuBar);

		pack();
	}// </editor-fold>
	//GEN-END:initComponents

	private void exitMenuItemActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_exitMenuItemActionPerformed
		System.exit(0);
	}//GEN-LAST:event_exitMenuItemActionPerformed

	/**
	 * @param args the command line arguments
	 */
	public static void main(String args[]) {
		java.awt.EventQueue.invokeLater(new Runnable() {
			public void run() {
				new App().setVisible(true);
			}
		});
	}

	//GEN-BEGIN:variables
	// Variables declaration - do not modify
	private javax.swing.JMenuItem aboutMenuItem;
	private javax.swing.JMenuItem contentsMenuItem;
	private javax.swing.JMenuItem copyMenuItem;
	private javax.swing.JMenuItem cutMenuItem;
	private javax.swing.JMenuItem deleteMenuItem;
	private javax.swing.JMenu editMenu;
	private javax.swing.JMenuItem exitMenuItem;
	private javax.swing.JMenu fileMenu;
	private javax.swing.JMenu helpMenu;
	private javax.swing.JMenuBar menuBar;
	private javax.swing.JMenuItem openMenuItem;
	private javax.swing.JMenuItem pasteMenuItem;
	private javax.swing.JMenuItem saveAsMenuItem;
	private javax.swing.JMenuItem saveMenuItem;
	// End of variables declaration//GEN-END:variables

}</span>


 

<span style="font-family:Times New Roman;font-size:14px;">/*
 * splitPanel.java
 *
 * Created on __DATE__, __TIME__
 */

package cn.huncu.io.ex;

import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileFilter;
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.Collection;
import java.util.Collections;
import java.util.Enumeration;

import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

/**
 * 
 * @author 丁灿
 *
 *2016-8-14下午5:23:05
 *
 */
 
 
public class ListPanel extends javax.swing.JPanel {
	private JFrame mainFrame = null;

	/** Creates new form splitPanel */
	public ListPanel(JFrame mainFrame) {
		this.mainFrame = mainFrame;
		initComponents();
		
		ImageIcon image=new ImageIcon("F:\\备用图片\\风景图/1.jpg");
		JLabel label=new JLabel(image);
//		JPanel p=(JPanel) (mainFrame.getContentPane());
//		p.setOpaque(false);//必须把框架的内容窗格设成透明的,这样后面加组件之后,背景还能看得到
		label.setBounds(0, 0, image.getIconWidth(), image.getIconHeight());
		
		this.add(label);
		//mainFrame.getLayeredPane().add(label,new Integer(Integer.MIN_VALUE));//后面那个参数(整数)表示分层显示时,当前图片的位置(放在哪一层),数值越小放在越底层
	}
	
	/**
	 * This method is called from within the constructor to initialize the form.
	 * WARNING: Do NOT modify this code. The content of this method is always
	 * regenerated by the Form Editor.
	 */
	//GEN-BEGIN:initComponents
	// <editor-fold defaultstate="collapsed" desc="Generated Code">
	private void initComponents() {

		btnSplit = new javax.swing.JButton();
		btnMerger = new javax.swing.JButton();
		jLabel1 = new javax.swing.JLabel();

		setDebugGraphicsOptions(javax.swing.DebugGraphics.NONE_OPTION);
		setMinimumSize(new java.awt.Dimension(800, 600));
		setLayout(null);

		btnSplit.setFont(new java.awt.Font("微软雅黑", 1, 18));
		btnSplit.setText("\u6587\u4ef6\u62c6\u5206");
		btnSplit.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent evt) {
				btnSplitActionPerformed(evt);
			}
		});
		add(btnSplit);
		btnSplit.setBounds(180, 340, 130, 40);

		btnMerger.setFont(new java.awt.Font("微软雅黑", 1, 18));
		btnMerger.setText("\u6587\u4ef6\u5408\u5e76");
		btnMerger.addActionListener(new java.awt.event.ActionListener() {
			public void actionPerformed(java.awt.event.ActionEvent evt) {
				btnMergerActionPerformed(evt);
			}
		});
		add(btnMerger);
		btnMerger.setBounds(440, 340, 140, 40);

		jLabel1.setFont(new java.awt.Font("微软雅黑", 1, 36));
		jLabel1.setForeground(new java.awt.Color(255, 51, 51));
		jLabel1.setText("\u5c0f\u5de5\u5177");
		add(jLabel1);
		jLabel1.setBounds(280, 80, 170, 90);
	}// </editor-fold>
	//GEN-END:initComponents

	private void btnMergerActionPerformed(java.awt.event.ActionEvent evt) {
		JOptionPane.showMessageDialog(this, "请确保要合并的文件为完整文件");
		JFileChooser jfc = new JFileChooser();
		int result = jfc.showOpenDialog(this);

		if (result == JFileChooser.APPROVE_OPTION) {
			File file = jfc.getSelectedFile();
			File parent = file.getParentFile();
			//File srcDir=new File(parent, "scripts");
			String path = parent.getAbsolutePath();
			//System.out.println(path);
			//String names=file.getName().split("");
			String begin = file.getName().substring(0,
					file.getName().indexOf("("));
			//System.out.println(begin);
			final String end = file.getName().substring(
					file.getName().lastIndexOf("."));
			//System.out.println(end);

			FileFilter ff = new FileFilter() {

				@Override
				public boolean accept(File pathname) {
					return pathname.getName().endsWith(end);
				}
			};
			File[] files = parent.listFiles(ff);

			Collection<FileInputStream> col = new ArrayList<FileInputStream>();
			BufferedOutputStream bos = null;
			try {
				for (int i = 0; i < files.length; i++) {
					//System.out.println(files[i].getName());
					if (files[i].getName().equals(begin + end)) {
						continue;
					}
					//String nm=begin+end
					//					col.add(new FileInputStream(new File(srcDir, begin+"("+i+")"+end)));
					col.add(new FileInputStream(path + "/" + begin + "(" + i
							+ ")" + end));
					//col.add(new FileInputStream(files[i].getAbsolutePath()));
					//System.out.println("1: "+path+"/"+ begin+"("+i+")"+end);
					//System.out.println("2:  "+files[i].getAbsolutePath());

				}
				Enumeration<FileInputStream> en = Collections.enumeration(col);
				SequenceInputStream sis = new SequenceInputStream(en);

				//				 bos=new BufferedOutputStream(new FileOutputStream(path+"/"+begin+end));
				bos = new BufferedOutputStream(new FileOutputStream(path + "/"
						+ begin + end));

				byte[] buf = new byte[512];
				int len = 0;
				while ((len = sis.read(buf)) != -1) {
					bos.write(buf, 0, len);
				}
				bos.flush();
				sis.close();
				JOptionPane.showMessageDialog(this, "文件合并成功");
			} catch (FileNotFoundException e) {
				e.printStackTrace();
			} catch (IOException e) {
				e.printStackTrace();
			} finally {
				if (bos != null) {
					try {
						bos.close();
					} catch (IOException e) {
						throw new RuntimeException("文件关流失败", e);
					}
				}
			}
		}
	}

	private void btnSplitActionPerformed(java.awt.event.ActionEvent evt) {
		
		JFileChooser jfc = new JFileChooser();
		int result = jfc.showOpenDialog(this);
		
		if (result == JFileChooser.APPROVE_OPTION) {
			File file = jfc.getSelectedFile();
			File dir = file.getParentFile();
			String str=JOptionPane.showInputDialog("请输入文件要拆分的大小(M)。不输入则默认是1M");
			//System.out.println("str: "+str);
			if(str==null||str.length()==0){
				str="1";
			}
			int  size=0;
			try {
				size=Integer.parseInt(str);
			} catch (NumberFormatException e) {
				JOptionPane.showMessageDialog(this, "拆分的文件大小输入必须为整数");
				return;
			}
			boolean boo = filesplit(file, dir,size);
			if (boo) {
				JOptionPane.showMessageDialog(this, "文件拆分完毕");
			}

		}
	}

	private static boolean filesplit(File file, File dir,int  size) {
		File desDir = new File(dir.getAbsolutePath() + "/scripts");
		if (!desDir.exists()) {// 记得用File为IO开道
			desDir.mkdirs();
		}
		// inputStream/outputStream
		// 源
		FileInputStream fin = null;
		try {
			fin = new FileInputStream(file);
			// 目的
			FileOutputStream fout = null;
			byte[] buf = new byte[1024*1024*size];
			int count = 0;
			int len = 0;
			while ((len = fin.read(buf)) != -1) {
				// fileName="录像91.lxe"
				String name = file.getName().substring(0,
						file.getName().lastIndexOf("."));
				// fout=new
				// FileOutputStream(dir.getAbsolutePath()+"/scripts/"+name+"("+(count++)+").dat");
				String fomat = file.getName().substring(
						file.getName().lastIndexOf("."));
				fout = new FileOutputStream(desDir.getAbsolutePath() + "/"
						+ name + "(" + (count++) + ")" + fomat);
				fout.write(buf, 0, len);
				fout.close();
			}
			// return true;

		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			if (fin != null) {
				try {
					fin.close();
				} catch (IOException e) {
					throw new RuntimeException("关流失败!", e);
				}
			}
		}
		return true;

	}

	//GEN-BEGIN:variables
	// Variables declaration - do not modify
	private javax.swing.JButton btnMerger;
	private javax.swing.JButton btnSplit;
	private javax.swing.JLabel jLabel1;
	// End of variables declaration//GEN-END:variables

}</span>

运行结果如图:

文件拆分:打开文件夹,选择要被拆分的文件。注意这里要拆分的文件最小要大于1M,毕竟文件拆分就是要把很大的文件拆开保存。

 

文件合并:保证要合并的文件是完整的。在这里只需要其中选中一个被拆分的文件就可以了。

 


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值