有些文件我们不想让别人看到,那就把文件拆开成几部分,然后把其中一部分给藏起来,别人就是拿到其中的碎片也无法合成,增加文件的安全性。
在学了文件拆分与合并之后,我对其做了界面实现,并加以改进。
代码实现:
<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,毕竟文件拆分就是要把很大的文件拆开保存。
文件合并:保证要合并的文件是完整的。在这里只需要其中选中一个被拆分的文件就可以了。