文件拆分与合并(VE)

    xiaoxiao2025-06-09  35

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

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

    代码实现:

    <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,毕竟文件拆分就是要把很大的文件拆开保存。

     

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

     

     

    转载请注明原文地址: https://ju.6miu.com/read-1299752.html
    最新回复(0)