【问题标题】:java.io.file help selecting multiple files from folder and listing hash valuesjava.io.file 帮助从文件夹中选择多个文件并列出哈希值
【发布时间】:2015-12-04 23:43:45
【问题描述】:

第一个程序应该接受两个输入作为参数: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());

 }
 }

我希望有人可以帮助我。

【问题讨论】:

  • 到底是什么?请提出问题。
  • 我想生成一个文本文件,其中包含特定文件夹中所有随机文件的所有哈希值。我有一个用于单个文件的功能,我需要为整个文件夹实现它。
  • 因此,对于每个文件,您都希望将一个哈希写入文件。而且您已经有了 one 文件的代码。而 File.listFiles() 可以列出一个目录中的所有文件。那么您面临的确切问题/错误/问题在哪里?
  • 我需要为所有文件生成哈希,我只知道如何为一个文件生成。
  • 字符串数据文件一次只能选择一个文件需要一些帮助来选择整个文件夹。

标签: java file hash


【解决方案1】:

您可以使用this 遍历所有文件并在其上使用您的哈希函数。将结果存储在用\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 以获取您的哈希并将它们与您的哈希函数的输出进行比较。

【讨论】:

  • 我不知道如何添加这两个东西。我对 JAVA 很陌生。
【解决方案2】:

基本布局/自上而下的方法

从你所知道的开始,并将其放入方法中。你从名字和他们需要执行的东西开始。一秒钟不要考虑实现,只考虑逻辑流程。

在你的情况下,你需要这样的东西:

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());
        }
    }

}

【讨论】:

  • 我正在研究如何遍历文件但遇到很多错误。
  • 我应该把路径 /Users/Samip/Desktop/crypto 放在上面的代码中吗?请解释
  • 让我在我的工作区设置这个项目 - 我们会让它工作的。
  • 检查工作示例 -> 在本地尝试。您只需要更改 main 中的文件夹名称。
猜你喜欢
  • 2014-03-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多