如果两个文件相同并且在 Java 中具有相同的内容,则提供日志

Provide log if the two files are identical and has same contents in Java

我有下面的代码,我从特定目录读取文件,处理它,处理后我将文件移动到存档目录。这工作正常。我每天都收到新文件,我正在使用 Control-M 调度程序作业来 运行 这个过程。

现在在下一个 运行 我正在再次从那个特定目录读取新文件并检查这个文件与存档目录中的文件如果内容不同则只处理文件否则不做任何事情.已编写 shell 脚本来完成这项工作,但我们没有看到此过程的任何日志。

现在我想在我的 java 代码中生成日志消息,如果特定目录和存档目录中的文件相同,然后生成 'files are identical' 的日志。但我不知道该怎么做。我不想编写逻辑来处理或移动文件中的任何内容..我只需要检查文件是否相等以及是否相等 产生日志消息。我收到的文件不是很大,最大大小可以到 10MB。

下面是我的代码:

        for(Path inputFile : pathsToProcess) {
            // read in the file:
            readFile(inputFile.toAbsolutePath().toString());
            // move the file away into the archive:
            Path archiveDir = Paths.get(applicationContext.getEnvironment().getProperty(".archive.dir"));
            Files.move(inputFile, archiveDir.resolve(inputFile.getFileName()),StandardCopyOption.REPLACE_EXISTING);
        }
        return true;
    }

    private void readFile(String inputFile) throws IOException, FileNotFoundException {
        log.info("Import " + inputFile);

        try (InputStream is = new FileInputStream(inputFile);
                Reader underlyingReader = inputFile.endsWith("gz")
                        ? new InputStreamReader(new GZIPInputStream(is), DEFAULT_CHARSET)
                        : new InputStreamReader(is, DEFAULT_CHARSET);
                BufferedReader reader = new BufferedReader(underlyingReader)) {

            if (isPxFile(inputFile)) {
                Importer.processField(reader, tablenameFromFilename(inputFile));
            } else {
                Importer.processFile(reader, tablenameFromFilename(inputFile)); 
            }

        }
        log.info("Import Complete");
    }       

}

根据有关文件大小或性能需求的有限信息,可以完成类似的操作。这可能不是 100% 优化的,而只是一个例子。您可能还必须在 main 方法中进行一些异常处理,因为新方法可能会抛出 IOException:

import org.apache.commons.io.FileUtils;  // Add this import statement at the top


// Moved this statement outside the for loop, as it seems there is no need to fetch the archive directory path multiple times.
Path archiveDir = Paths.get(applicationContext.getEnvironment().getProperty("betl..archive.dir"));  

for(Path inputFile : pathsToProcess) {

    // Added this code
    if(checkIfFileMatches(inputFile, archiveDir); {
        // Add the logger here.
    }
    //Added the else condition, so that if the files do not match, only then you read, process in DB and move the file over to the archive. 
    else {
        // read in the file:
        readFile(inputFile.toAbsolutePath().toString());
        Files.move(inputFile, archiveDir.resolve(inputFile.getFileName()),StandardCopyOption.REPLACE_EXISTING);
    }       
}


//Added this method to check if the source file and the target file contents are same.
// This will need an import of the FileUtils class. You may change the approach to use any other utility file, or read the data byte by byte and compare. If the files are very large, probably better to use Buffered file reader.
    private boolean checkIfFileMatches(Path sourceFilePath, Path targetDirectoryPath) throws IOException {
        if (sourceFilePath != null) {  // may not need this check
            File sourceFile = sourceFilePath.toFile();
            String fileName = sourceFile.getName();

            File targetFile = new File(targetDirectoryPath + "/" + fileName);

            if (targetFile.exists()) {
                return FileUtils.contentEquals(sourceFile, targetFile);
            }
        }
        return false;
    }