Java 如何知道以前是否处理过文件

Java 如何知道以前是否处理过文件,java,file-io,file-attributes,Java,File Io,File Attributes,如何确定文件是否已在以前处理?有一个远程存储位置,它是我的应用程序的文件源。我的程序从这个位置获取文件,并按计划方式处理它们。如何确保下次仅获取未处理的文件?我正在考虑使用文件属性。存档和修改日期可以是一个解决方案。但我了解到两位文件属性没有被使用。如何在Java中使用这些字段?顺便说一句,我不想使用数据库。常用的策略是使用某种形式的哈希函数来创建校验和。记录文件的校验和,并将校验和标识的已处理文件列表与相关文件进行比较。如果相关文件的校验和在列表中,则表示您已经对其进行了处理 保护已处理文件校

如何确定文件是否已在以前处理?有一个远程存储位置,它是我的应用程序的文件源。我的程序从这个位置获取文件,并按计划方式处理它们。如何确保下次仅获取未处理的文件?我正在考虑使用文件属性。存档和修改日期可以是一个解决方案。但我了解到两位文件属性没有被使用。如何在Java中使用这些字段?顺便说一句,我不想使用数据库。

常用的策略是使用某种形式的哈希函数来创建校验和。记录文件的校验和,并将校验和标识的已处理文件列表与相关文件进行比较。如果相关文件的校验和在列表中,则表示您已经对其进行了处理

保护已处理文件校验和的列表。如果你丢失了它,或者它被破坏了,这可能是漫长而糟糕的一天

<>为了防止不必要的网络流量,您可以考虑在远程存储库中准备“校验”文件,该文件包含对应于潜在输入文件的校验和。p> 编辑:

进一步评论后,可能会直接与文件系统属性交互。建议的Java 1.7规范引入了特定于文件系统的属性视图,以直接与这些属性交互。您感兴趣的视图是“DosFileAttributeView”

基本用法可能与此类似(“输入”是基于java“路径”的文件;添加必要的异常处理):


您可以重命名该文件(例如“filename.archive”)?或者进入“存档”子目录?

你说的“两位文件未使用”是什么意思?您希望使用什么属性?远程端的操作系统是什么?如何访问文件(网络共享、ftp等)?什么文件系统?Windows:NTFS/VFat,Linux:(无数),…?您能确保不必多次处理一个文件吗?文件名不会被重复?这主要是一个性能问题,还是处理一个文件两次是一个严重问题?你可以把名字记在记忆里。你是修改文件,还是只是读取?您可以将一些信息存储在文件/数据库中,以便重新启动您的程序。他说他不想使用数据库。我当然也不打算建议这样做。你认为我的答案的哪一部分暗示了这一点?嗯,存储文件的校验和。根据OP关于使用文件属性的建议,我假设他希望能够通过查看文件来判断文件是否已被处理,而不需要额外的数据。OP必须有一些东西可以与之进行比较,除非程序不确定地存在于内存中,比较值必须以某种方式保存或持久化,无论是在数据库本身、松散结构的文本文件还是某种二进制序列化中,我尝试索引和归档一个目录中的所有文件。该目录中的文件可以由程序动态地、连续地生成,或者用户可以手动将文件放入该目录。远程计算机可以是使用NTFS的任何操作系统。我了解到每个文件都有一个用于文件属性的关联字节,目前只有六个字节它们已被使用。此文件日志文件将在需要时使用,因此我无法重命名它们。并且可以更改其扩展名。主要问题是,我正在尝试不影响任何其他也将相同文件用于不同用途的应用程序。
// import as necessary from java.nio.file and java.io

DosFileAttributeView view = input.getFileAttributeView(DosFileAttributeView.class);

//Check if the system supports this view 
if (view != null) 
{
    DosFileAttributes attributes = view.readAttributes();

    // skip any file already marked as an archive
    if (!attributes.isArchive()) 
    {
         myObject.process(input)
         attributes.setArchive(true)
    }
}