千里冰封
          JAVA 濃香四溢
          posts - 151,comments - 2801,trackbacks - 0
          做文件傳輸的時候,為了保證文件是合法的有效的,經常會對文件做MD5校驗,以確保和原始的文件是一樣的.并且做斷點續傳的時候這一點也是挺重要的,其實JAVA處理這方面也挺不錯的,可是我搜了半天,也沒有搜到一個用JAVA寫的文件MD5生成程序,有的也只是命令行模式下的,沒有一個GUI模式的,所以就寫了一個GUI的,方便使用,只用了兩個類,一個是工具類,除了生成MD5外還可以生成SHA碼,大家可以通過改源文件達到這一點,并且文件支持拖放,可以把要生成的文件拖到文本區,就可以顯示這個文件的信息了.

          /*
           * To change this template, choose Tools | Templates
           * and open the template in the editor.
           
          */
          package test1; 

          import java.io.File;
          import java.io.FileInputStream;
          import java.io.IOException;
          import java.security.MessageDigest;
          import java.security.NoSuchAlgorithmException;
          import java.util.logging.Level;
          import java.util.logging.Logger;
          import javax.swing.JProgressBar;

          /**
           *
           * 
          @author hadeslee
           
          */
          public final class Util {

              
          /**
               * 得到文件的MD5碼,用于校驗
               * 
          @param file
               * 
          @param jpb 
               * 
          @return
               
          */
              
          public static String getMD5(File file, JProgressBar jpb) {
                  FileInputStream fis 
          = null;
                  jpb.setMaximum((
          int) file.length());
                  jpb.setValue(
          0);
                  jpb.setString(
          "正在計算:" + file.getName() + "的MD5值");
                  
          try {
                      MessageDigest md 
          = MessageDigest.getInstance("MD5");
                      fis 
          = new FileInputStream(file);
                      
          byte[] buffer = new byte[8192];
                      
          int length = -1;
                      System.out.println(
          "開始算");
                      
          int value = 0;
                      
          while ((length = fis.read(buffer)) != -1) {
                          md.update(buffer, 
          0, length);
                          value 
          += length;
                          jpb.setValue(value);
                      }
                      System.out.println(
          "算完了");
                      
          return bytesToString(md.digest());
                  } 
          catch (IOException ex) {
                      Logger.getLogger(Util.
          class.getName()).log(Level.SEVERE, null, ex);
                      
          return null;
                  } 
          catch (NoSuchAlgorithmException ex) {
                      Logger.getLogger(Util.
          class.getName()).log(Level.SEVERE, null, ex);
                      
          return null;
                  } 
          finally {
                      
          try {
                          fis.close();
                      } 
          catch (IOException ex) {
                          Logger.getLogger(Util.
          class.getName()).log(Level.SEVERE, null, ex);
                      }
                  }
              }

              
          /**
               * 
               * 
          @param file
               * 
          @return
               
          */
              
          public static String getMD5(File file) {
                  FileInputStream fis 
          = null;
                  
          try {
                      MessageDigest md 
          = MessageDigest.getInstance("MD5");
                      fis 
          = new FileInputStream(file);
                      
          byte[] buffer = new byte[8192];
                      
          int length = -1;
                      System.out.println(
          "開始算");
                      
          while ((length = fis.read(buffer)) != -1) {
                          md.update(buffer, 
          0, length);
                      }
                      System.out.println(
          "算完了");
                      
          return bytesToString(md.digest());
                  } 
          catch (IOException ex) {
                      Logger.getLogger(Util.
          class.getName()).log(Level.SEVERE, null, ex);
                      
          return null;
                  } 
          catch (NoSuchAlgorithmException ex) {
                      Logger.getLogger(Util.
          class.getName()).log(Level.SEVERE, null, ex);
                      
          return null;
                  } 
          finally {
                      
          try {
                          fis.close();
                      } 
          catch (IOException ex) {
                          Logger.getLogger(Util.
          class.getName()).log(Level.SEVERE, null, ex);
                      }
                  }
              }

              
          /**
               * 得到文件的SHA碼,用于校驗
               * 
          @param file
               * 
          @return
               
          */
              
          public static String getSHA(File file) {
                  FileInputStream fis 
          = null;
                  
          try {
                      MessageDigest md 
          = MessageDigest.getInstance("SHA");
                      fis 
          = new FileInputStream(file);
                      
          byte[] buffer = new byte[8192];
                      
          int length = -1;
                      System.out.println(
          "開始算");
                      
          while ((length = fis.read(buffer)) != -1) {
                          md.update(buffer, 
          0, length);
                      }
                      System.out.println(
          "算完了");
                      
          return bytesToString(md.digest());
                  } 
          catch (IOException ex) {
                      Logger.getLogger(Util.
          class.getName()).log(Level.SEVERE, null, ex);
                      
          return null;
                  } 
          catch (NoSuchAlgorithmException ex) {
                      Logger.getLogger(Util.
          class.getName()).log(Level.SEVERE, null, ex);
                      
          return null;
                  } 
          finally {
                      
          try {
                          fis.close();
                      } 
          catch (IOException ex) {
                          Logger.getLogger(Util.
          class.getName()).log(Level.SEVERE, null, ex);
                      }
                  }
              }
              
              
          /**
               * 
               * 
          @param file
               * 
          @param jpb
               * 
          @return
               
          */
              
          public static String getSHA(File file,JProgressBar jpb) {
                  FileInputStream fis 
          = null;
                  jpb.setMaximum((
          int) file.length());
                  jpb.setValue(
          0);
                  jpb.setString(
          "正在計算:" + file.getName() + "的MD5值");
                  
          try {
                      MessageDigest md 
          = MessageDigest.getInstance("SHA");
                      fis 
          = new FileInputStream(file);
                      
          byte[] buffer = new byte[8192];
                      
          int length = -1;
                      System.out.println(
          "開始算");
                      
          int value=0;
                      
          while ((length = fis.read(buffer)) != -1) {
                          md.update(buffer, 
          0, length);
                          value
          +=length;
                          jpb.setValue(value);
                      }
                      System.out.println(
          "算完了");
                      
          return bytesToString(md.digest());
                  } 
          catch (IOException ex) {
                      Logger.getLogger(Util.
          class.getName()).log(Level.SEVERE, null, ex);
                      
          return null;
                  } 
          catch (NoSuchAlgorithmException ex) {
                      Logger.getLogger(Util.
          class.getName()).log(Level.SEVERE, null, ex);
                      
          return null;
                  } 
          finally {
                      
          try {
                          fis.close();
                      } 
          catch (IOException ex) {
                          Logger.getLogger(Util.
          class.getName()).log(Level.SEVERE, null, ex);
                      }
                  }
              }

              
          public static String bytesToString(byte[] data) {
                  
          char hexDigits[] = {'0''1''2''3''4''5''6''7''8''9''a''b''c''d',
                          
          'e''f'};
                  
          char[] temp = new char[data.length * 2];
                  
          for (int i = 0; i < data.length; i++) {
                      
          byte b = data[i];
                      temp[i 
          * 2= hexDigits[b >>> 4 & 0x0f];
                      temp[i 
          * 2 + 1= hexDigits[b & 0x0f];
                  }
                  
          return new String(temp);

              }

              
          public static void main(String[] args) {
                  String s 
          = System.getProperties().getProperty("java.io.tmpdir");
                  System.out.println(s);
              }
          }

          窗體的代碼:

          /*
           * Main.java
           *
           * Created on 2007年11月8日, 上午9:15
           
          */
          package test1;

          import java.awt.datatransfer.DataFlavor;
          import java.awt.datatransfer.Transferable;
          import java.awt.datatransfer.UnsupportedFlavorException;
          import java.awt.dnd.DnDConstants;
          import java.awt.dnd.DropTarget;
          import java.awt.dnd.DropTargetDragEvent;
          import java.awt.dnd.DropTargetDropEvent;
          import java.awt.dnd.DropTargetEvent;
          import java.awt.dnd.DropTargetListener;
          import java.io.File;
          import java.io.IOException;
          import java.text.SimpleDateFormat;
          import java.util.Date;
          import javax.swing.JFileChooser;
          import javax.swing.UIManager;

          /**
           *
           * 
          @author  hadeslee
           
          */
          public class Main extends javax.swing.JFrame implements DropTargetListener {

              
          private JFileChooser jfc;
              
          private File toMd5;
              
          private DropTarget dt;
              
          /** Creates new form Main */

              
          public Main() {
                  
          try {
                      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                  } 
          catch (Exception exe) {
                      exe.printStackTrace();
                  }
                  initComponents();
                  initOther();
                  
          this.setLocationRelativeTo(null);
              }

              
          private void initOther() {
                  dt 
          = new DropTarget(jTextArea1, DnDConstants.ACTION_COPY_OR_MOVE, this);
              }
              
          /** 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.
               
          */
              
          // <editor-fold defaultstate="collapsed" desc="Generated Code">
              private void initComponents() {

                  jLabel1 
          = new javax.swing.JLabel();
                  jTextField1 
          = new javax.swing.JTextField();
                  jButton1 
          = new javax.swing.JButton();
                  jScrollPane1 
          = new javax.swing.JScrollPane();
                  jTextArea1 
          = new javax.swing.JTextArea();
                  jButton2 
          = new javax.swing.JButton();
                  jButton3 
          = new javax.swing.JButton();
                  jpb 
          = new javax.swing.JProgressBar();
                  jLabel2 
          = new javax.swing.JLabel();
                  jTextField2 
          = new javax.swing.JTextField();

                  setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
                  setTitle(
          "MD5生成");
                  setResizable(
          false);

                  jLabel1.setText(
          "文件路徑:");

                  jTextField1.setEditable(
          false);

                  jButton1.setText(
          "瀏覽");
                  jButton1.addActionListener(
          new java.awt.event.ActionListener() {
                      
          public void actionPerformed(java.awt.event.ActionEvent evt) {
                          jButton1ActionPerformed(evt);
                      }
                  });

                  jScrollPane1.setBorder(javax.swing.BorderFactory.createTitledBorder(
          "文件信息"));

                  jTextArea1.setColumns(
          20);
                  jTextArea1.setRows(
          5);
                  jScrollPane1.setViewportView(jTextArea1);

                  jButton2.setText(
          "生成");
                  jButton2.addActionListener(
          new java.awt.event.ActionListener() {
                      
          public void actionPerformed(java.awt.event.ActionEvent evt) {
                          jButton2ActionPerformed(evt);
                      }
                  });

                  jButton3.setText(
          "退出");
                  jButton3.addActionListener(
          new java.awt.event.ActionListener() {
                      
          public void actionPerformed(java.awt.event.ActionEvent evt) {
                          jButton3ActionPerformed(evt);
                      }
                  });

                  jLabel2.setText(
          "MD5值:");

                  jTextField2.setEditable(
          false);

                  javax.swing.GroupLayout layout 
          = new javax.swing.GroupLayout(getContentPane());
                  getContentPane().setLayout(layout);
                  layout.setHorizontalGroup(
                      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                      .addGroup(layout.createSequentialGroup()
                          .addContainerGap()
                          .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, 
          false)
                              .addGroup(layout.createSequentialGroup()
                                  .addComponent(jButton2)
                                  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                  .addComponent(jButton3)
                                  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                  .addComponent(jpb, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                              .addGroup(layout.createSequentialGroup()
                                  .addComponent(jLabel2)
                                  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                  .addComponent(jTextField2))
                              .addComponent(jScrollPane1)
                              .addGroup(layout.createSequentialGroup()
                                  .addComponent(jLabel1)
                                  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                  .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, 
          246, javax.swing.GroupLayout.PREFERRED_SIZE)
                                  .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                                  .addComponent(jButton1)))
                          .addContainerGap(
          16, Short.MAX_VALUE))
                  );
                  layout.setVerticalGroup(
                      layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                      .addGroup(layout.createSequentialGroup()
                          .addContainerGap()
                          .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                              .addComponent(jLabel1)
                              .addComponent(jTextField1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                              .addComponent(jButton1))
                          .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                          .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 
          182, javax.swing.GroupLayout.PREFERRED_SIZE)
                          .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                          .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                              .addComponent(jLabel2)
                              .addComponent(jTextField2, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                          .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 
          11, Short.MAX_VALUE)
                          .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.CENTER)
                              .addComponent(jButton3)
                              .addComponent(jpb, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                          .addContainerGap())
                      .addGroup(layout.createSequentialGroup()
                          .addGap(
          267267267)
                          .addComponent(jButton2)
                          .addGap(
          101010))
                  );

                  pack();
              }
          // </editor-fold>

              
          private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {
                  
          // TODO add your handling code here:
                  if (jfc == null) {
                      jfc 
          = new JFileChooser();
                      jfc.setFileSelectionMode(JFileChooser.FILES_ONLY);
                  }
                  
          if (jfc.showOpenDialog(this== JFileChooser.APPROVE_OPTION) {
                      toMd5 
          = jfc.getSelectedFile();
                      jTextField1.setText(toMd5.toString());
                      showFileInfo();
                  }
              }

              
          private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {
                  
          // TODO add your handling code here:
                  jButton2.setEnabled(false);
                  
          new Thread(){
                      
          public void run(){
                          String s
          =Util.getMD5(toMd5, jpb);
                          jTextField2.setText(s);
                          jButton2.setEnabled(
          true);
                      }
                  }.start();
              }

              
          private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {
                  
          // TODO add your handling code here:
                  System.exit(0);
              }

              
          private void showFileInfo() {
                  
          if (toMd5 != null) {
                      SimpleDateFormat sdf 
          = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss");
                      File f 
          = toMd5;
                      StringBuilder sb 
          = new StringBuilder();
                      sb.append(
          "文件名稱:").append(f.getName()).append('\n');
                      sb.append(
          "文件大小:").append(f.length()).append('\n');
                      sb.append(
          "文件最后修改日期:").append(sdf.format(new Date(f.lastModified()))).append("\n");
                      sb.append(
          "文件屬性:").append(f.canWrite() ? "讀寫" : "只讀").append('\n');
                      jTextArea1.setText(sb.toString());
                  }
              }
              
          /**
               * 
          @param args the command line arguments
               
          */

              
          public static void main(String args[]) {
                  java.awt.EventQueue.invokeLater(
          new Runnable() {

                              
          public void run() {
                                  
          new Main().setVisible(true);
                              }
                          });
              }
              
          // Variables declaration - do not modify
              private javax.swing.JButton jButton1;
              
          private javax.swing.JButton jButton2;
              
          private javax.swing.JButton jButton3;
              
          private javax.swing.JLabel jLabel1;
              
          private javax.swing.JLabel jLabel2;
              
          private javax.swing.JScrollPane jScrollPane1;
              
          private javax.swing.JTextArea jTextArea1;
              
          private javax.swing.JTextField jTextField1;
              
          private javax.swing.JTextField jTextField2;
              
          private javax.swing.JProgressBar jpb;
              
          // End of variables declaration

              
          public void dragEnter(DropTargetDragEvent dtde) {
                  dtde.acceptDrag(DnDConstants.ACTION_COPY_OR_MOVE);
              }

              
          public void dragOver(DropTargetDragEvent dtde) {
              }

              
          public void dropActionChanged(DropTargetDragEvent dtde) {
              }

              
          public void dragExit(DropTargetEvent dte) {
              }

              
          public void drop(DropTargetDropEvent e) {
                  
          try {
                      
          if (e.isDataFlavorSupported(DataFlavor.javaFileListFlavor)) {
                          Transferable tr 
          = e.getTransferable();
                          e.acceptDrop(DnDConstants.ACTION_COPY_OR_MOVE);
                          @SuppressWarnings(
          "unchecked")
                          java.util.List
          <File> list = (java.util.List<File>) tr.getTransferData(DataFlavor.javaFileListFlavor);
                          
          if (list.size() == 1) {
                              File f 
          = list.get(0);
                              
          if (f.isFile()) {
                                  toMd5 
          = list.get(0);
                                  
          this.showFileInfo();
                                  jTextField1.setText(toMd5.toString());
                              }
                          }
                          e.dropComplete(
          true);
                      }
          else {
                          e.rejectDrop();
                      }
                  } 
          catch ( IOException io) {
                      io.printStackTrace();
                      e.rejectDrop();
                  } 
          catch ( UnsupportedFlavorException ufe) {
                      ufe.printStackTrace();
                      e.rejectDrop();
                  }
              }
          }

          可以點擊這里下載可執行的JAR文件和源代碼




          盡管千里冰封
          依然擁有晴空

          你我共同品味JAVA的濃香.
          posted on 2007-11-08 10:11 千里冰封 閱讀(7815) 評論(8)  編輯  收藏 所屬分類: JAVASE

          FeedBack:
          # re: JAVA版文件MD5生成器
          2007-11-08 12:43 | 最後の騎士
          暈,我怎么提示 javax.swing.GroupLayout無法解析為類型  回復  更多評論
            
          # re: JAVA版文件MD5生成器[未登錄]
          2007-11-08 12:58 | 屹礫
          嗯,不錯  回復  更多評論
            
          # re: JAVA版文件MD5生成器
          2007-11-08 16:27 | 千里冰封
          @最後の騎士
          要求JDK1.6才能運行,因為用了1.6新加的GroupLayout  回復  更多評論
            
          # re: JAVA版文件MD5生成器
          2007-11-09 05:33 | 編程中國某睡
          太有才啦  回復  更多評論
            
          # re: JAVA版文件MD5生成器
          2007-11-09 12:39 | lizongbo
          我自己曾經寫了個命令行的:

          http://618119.com/archives/2007/10/15/5.html

          建議你改一下不要硬編碼hash類型 :

          MessageDigest.getInstance("SHA");

          改成 MessageDigest.getInstance(hashType);

          這樣方便支持 MD4,MD5,SHA1,SHA-256,SHA-384,SHA-512

            回復  更多評論
            
          # re: JAVA版文件MD5生成器
          2008-01-22 11:04 | Crane Leeon
          可以用
          return (new java.math.BigInteger(md.digest())).toString(16);
          來代替筆者的 bytesToString 方法。
            回復  更多評論
            
          # re: JAVA版文件MD5生成器
          2009-05-12 15:30 | FENGLIBIN
          不錯,正是我找的,謝謝  回復  更多評論
            
          # re: JAVA版文件MD5生成器
          2015-03-26 14:32 | Ace
          不錯,正是我要學習的,謝謝  回復  更多評論
            
          主站蜘蛛池模板: 浦江县| 油尖旺区| 双峰县| 沧州市| 棋牌| 个旧市| 垦利县| 海盐县| 甘洛县| 周至县| 平泉县| 景东| 武安市| 昔阳县| 吉林市| 含山县| 肇东市| 余姚市| 左权县| 夏河县| 富民县| 恩施市| 天台县| 府谷县| 长泰县| 马边| 桂平市| 仙游县| 南部县| 浦江县| 阆中市| 龙江县| 四川省| 桐乡市| 淄博市| 宜城市| 那坡县| 绥江县| 林周县| 尼勒克县| 太原市|