背景 我需要在我正在使用的服务器上加载测试进程。我正在做的是我在客户端创建一堆文件,并将它们上传到服务器。服务器正在监视新文件(在输入目录中,文件名是唯一的),一旦有新文件处理它,一旦完成,它就会创建一个响应文件,其名称相同但扩展名与输出目录不同。如果处理失败,则将传入文件放入错误目录。我使用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;
问题: 这有效吗?或者有更好的方法来解决这种情况吗?无论如何,你可能会认为这是一个你只执行一次的代码,为什么要挣扎,但我真的想知道如何正确处理这个问题。
答案 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目录中的每个文件执行此操作。