簡體   English   中英

java.io.file幫助從文件夾中選擇多個文件並列出哈希值

[英]java.io.file help selecting multiple files from folder and listing hash values

第一個程序應將兩個輸入作為參數:directory1和directory2。 程序應為文件夾目錄1中的每個文件計算一個哈希值(使用HMAC),並將該哈希值存儲在一個新文件中,該文件將保存在文件夾目錄2下。 (b)。 第二個程序應執行驗證過程。 它也使用與第一個程序相同的兩個輸入參數。 它應該再次生成哈希值(您可以在此處重用第一個程序中的某些代碼),並檢查它們是否與存儲在directory2中的相應值匹配。 對於每個文件,此程序應輸出兩個字符串:文件名和YES / NO(表示哈希是否匹配)。

我已經完成了一些工作,這些工作將從一個文件夾中生成單個文件的哈希值,我需要幫助從該文件夾中生成所有文件的哈希值,這些代碼如下。

功能

import java.io.FileInputStream;
import java.io.FileWriter;
import java.io.PrintWriter;
import java.security.MessageDigest;

public class HMAC {

public static void main(String args[]) throws Exception {


  String datafile = "/Users/Samip/Desktop/crypto1";

MessageDigest md = MessageDigest.getInstance("SHA1");
FileInputStream fis = new FileInputStream(datafile);
byte[] dataBytes = new byte[1024];

int nread = 0; 

while ((nread = fis.read(dataBytes)) != -1) {
  md.update(dataBytes, 0, nread);
};

byte[] mdbytes = md.digest();

//convert the byte to hex format
StringBuffer sb = new StringBuffer("");



for (int i = 0; i < mdbytes.length; i++) {
    sb.append(Integer.toString((mdbytes[i] & 0xff) + 0x100, 16).substring(1));
}

//System.out.println("SHA-1 value is :: " + sb.toString());





    FileWriter file = new FileWriter("/Users/Samip/Desktop/crypto/output.txt");
    PrintWriter output = new PrintWriter(file);
    output.println(sb.toString());    
    output.close(); 
    System.out.println(sb.toString());

 }
 }

我希望有人可以幫助我。

您可以使用遍歷所有文件並在其上使用哈希函數。 將結果存儲在用\\n分隔的文件中(換行符)

String stringout = "" 
Files.walk(Paths.get("/path/to/dir1")).forEach(filePath -> { 
    if (Files.isRegularFile(filePath)) { 
        //create your hash 
        stringout += hash + "\n" 
    }
});
// write stringout to your output file 

對於第二個程序,您可以重用該代碼,並使用this從文件讀取哈希。 然后將它們除以\\n以得到您的哈希並將它們與哈希函數的輸出進行比較。

基本布局/自頂向下方法

從您所知道的開始,並將其放入方法中。 您從名稱和他們需要執行的工作開始。 不要再考慮實現,只考慮邏輯流程。

就您而言,您將需要以下內容:

public void createHash(File sourceDir, File targetDir)

public String createHash(File file)

public void writeHash(File toFile, String hash)

將其包裝在main()中

您需要在此處填寫您的班級名稱。

public static void main(String[] args) {
   new YourClass().createHash(new File(args[0]), new File(args[1]));
}

自上而下實施

從最外層的方法開始,然后嘗試正確。 您可以從其余的虛擬代碼開始。

public void createHash(File sourceDir, File targetDir) {
  for(File f : sourceDir.listFiles()) {
     String hash = createHash(f); //That you almost have
     File target = new File(targetDir, f.getName()+".hash");
     writeHash(target, hash);
  } 
}

public String createHash(f) {
  return f.getName(); //This is where your existing code will go later
}

public String writeHash(File target, String hash) {
  System.out.println("I'd write " + hash + " to File " + file.getName());
}

現在,您的程序應該能夠遍歷源文件夾,創建(虛擬)哈希並打印到System.out,它將寫入哪些文件。

提煉方法

現在,逐步進行其余操作-一次使用一種方法。 直到您完成操作或出現故障–在這種情況下,您都會回來尋求幫助。

  public String createHash(File datafile) throws IOException {
    //SNIP - YOUR CODE BEGINS
    MessageDigest md = MessageDigest.getInstance("SHA1");
    FileInputStream fis = new FileInputStream(datafile);
    byte[] dataBytes = new byte[1024];

    int nread = 0; 

    while ((nread = fis.read(dataBytes)) != -1) {
      md.update(dataBytes, 0, nread);
    }

    byte[] mdbytes = md.digest();

    //convert the byte to hex format
    StringBuffer sb = new StringBuffer("");
    for (int i = 0; i < mdbytes.length; i++) {
      sb.append(Integer.toString((mdbytes[i] & 0xff) + 0x100, 16).substring(1));
    }
  //SNAP - YOUR CODE ENDS
  }
  public void writeFile(File target, String hash) {
     try(FileOutputStream fo = new FileOutputStream(target)) {
       fo.write(hash.getBytes());
     } catch(IOException e) {
       System.err.println("No Hash Written for " + target.getName());
     }
  }

工作實例

import java.io.*;
import java.security.MessageDigest;

public class Checksums {

    public static void main(String[] args) {
        String sourceDir = "/Users/Jan/Desktop/Folder1";
        String targetDir = "/Users/Jan/Desktop/Folder2";
        try {
            new Checksums().createHash(new File(sourceDir), new File(targetDir));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    private void createHash(File sourceDir, File targetDir) throws Exception {
        for (File f : sourceDir.listFiles()) {
            String hash = createHash(f); // That you almost have
            File target = new File(targetDir, f.getName() + ".hash");
            writeHash(target, hash);
        }
    }

    public String createHash(File datafile) throws Exception {
        // SNIP - YOUR CODE BEGINS
        MessageDigest md = MessageDigest.getInstance("SHA1");
        FileInputStream fis = new FileInputStream(datafile);
        byte[] dataBytes = new byte[1024];

        int nread = 0;

        while ((nread = fis.read(dataBytes)) != -1) {
            md.update(dataBytes, 0, nread);
        }

        byte[] mdbytes = md.digest();

        // convert the byte to hex format
        StringBuffer sb = new StringBuffer("");
        for (int i = 0; i < mdbytes.length; i++) {
            sb.append(Integer.toString((mdbytes[i] & 0xff) + 0x100, 16).substring(1));
        }
        // SNAP - YOUR CODE ENDS
        return sb.toString();
    }

    public void writeHash(File target, String hash) {
        try (FileOutputStream fo = new FileOutputStream(target)) {
            fo.write(hash.getBytes());
            System.out.println("Hash written for " + target.getAbsolutePath());
        } catch (IOException e) {
            System.err.println("No Hash Written for " + target.getName());
        }
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM