Java - 从列表中查找匹配对

时间:2014-05-09 08:47:18

标签: java sorting

背景 我需要在我正在使用的服务器上加载测试进程。我正在做的是我在客户端创建一堆文件,并将它们上传到服务器。服务器正在监视新文件(在输入目录中,文件名是唯一的),一旦有新文件处理它,一旦完成,它就会创建一个响应文件,其名称相同但扩展名与输出目录不同。如果处理失败,则将传入文件放入错误目录。我使用inotifywait监视服务器上的更改,输出:

10:48:47 /path/to/in/ CREATE ABCD.infile1
10:48:55 /path/to/out/ CREATE ABCD.outfile1

10:49:11 /path/to/in/ CREATE ASDF.infile1
10:49:19 /path/to/err/ CREATE ASDF.infile1

问题: 我需要解析所有结果的列表(计划在java中实现),如此,我使用infile并将其与相同的文件名(在ERR或OUT中找到)匹配,计算所用的时间并指出它的天气成功与否。我的想法是创建3个列表(in,out,err)并尝试解析,类似于(在伪代码中)

inList
outList
errList

for item : inList
   if outlist.contains(item) parse;
   else if errList.contains(item) parse;
   else error;

问题: 这有效吗?或者有更好的方法来解决这种情况吗?无论如何,你可能会认为这是一个你只执行一次的代码,为什么要挣扎,但我真的想知道如何正确处理这个问题。

2 个答案:

答案 0 :(得分:0)

带有列表的解决方案存在问题,因为您必须使它们与驱动器状态保持正确同步并始终加载它们。对于存储在单个位置的文件,您将获得更多的容量限制。

替代方法您使用i / o API检查path existence,或在数据库之间引入您将存储值的替代方法。

另一种方法是数据库,您将存储有关文件实际具有的密钥和物理路径的信息。

如果我是你,我将从I / O API开始,并设计一个简单的界面,如果解决方案看起来效率低下,将来可以替换。

答案 1 :(得分:0)

您可以使用“UserDefinedfileAttributeView”概念。 创建自己的File属性,例如“Result”,并相应地为IN dir中的文件设置其值。如果文件移动到OUT目录,“结果”=“成功”,如果文件移动到ERR目录,“结果”=“错误” 我尝试了以下代码,希望它有所帮助。

public static void main(String[] args) {

    try{
    Path file = Paths.get("C:\\Users\\rohit\\Desktop\\imp docs\\Steps.txt");
    UserDefinedFileAttributeView userView = Files.getFileAttributeView(file, UserDefinedFileAttributeView.class);
    String attribName  = "RESULT";
    String attribValue = "SUCCESS";
    userView.write(attribName, Charset.defaultCharset().encode(attribValue));

    List<String> attribList = userView.list();
    for (String s : attribList) {            
        ByteBuffer buf = ByteBuffer.allocate(userView.size(s));
        userView.read(s, buf);
        buf.flip();
        String value = Charset.defaultCharset().decode(buf).toString();
        if("SUCCESS".equals(value)){
            System.out.print(String.format("User defined attribute: %s", s));
            System.out.println(String.format("; value: %s", value));
            }
        }
    }
    catch(Exception e){

    }

您可以为IN目录中的每个文件执行此操作。