多个客户端发送写入文件的请求,并期望响应成功或失败。我想简单地描述一下在服务器端所做的工作。
FileWriter类,该类将执行文件写入过程。a).在上下文下创建目录并在目录中写入*.txt文件
b).将一些文件从上下文的现有目录复制到新创建的目录中。
c).压缩(*.zip)这个目录
class FileWriter {
公共同步writeFile(String contextPath) {在上下文copyFiles(Path_to_directory)下创建一个目录和新文件;}私有的copyFiles(String path_to_directory){将文件复制到/contextPath/目录/.从existingDirectory;compressDir( Directory_path );//压缩文件}私有的compressDir(String Directory_path ){压缩新创建的目录}
}
正如您在前面的类中所看到的,有一个方法是synchronized,两个方法是private。只有synchrnized方法是从servlet class调用的,其他方法是从该方法内部调用的。因此,这是处理多个客户端请求的良好/标准方法吗?
或者应该直接从servlet class调用每个方法。请纠正我,并建议一个更好的方法来实施这门课。
@Edit : req1来创建目录和文件,例如context/directory_1/file_1.txt
同时,req2来检查directory_1是否已经存在,因此它创建了directory_2,例如context/directory_2/file_1.txt。
现在第二步是将文件从上下文复制到新创建的目录。让我告诉您,directory_1与directory_2无关,所有新创建的目录都从common_directory复制文件,例如``context/Common目录/.到上下文/目录_1,上下文/目录_2‘
第三步是压缩目录:例如,directory_1.zip, directory_2.zip
发布于 2011-12-02 09:16:05
查看上面的代码,如果从servlet调用writeFile,您的servlet最终会成为一个线程化的应用程序。
如果两个人正在处理两个单独的目录和单独的文件,并且您保证没有重叠,那么您应该直接调用这两个方法并丢弃synchronized。看来你的处境就是这样。因此,您可以使用以下方法:
Servlet Code
{
....
String uniqDir = createUniqDir();
copyFiles(uniqDir);
compressDir(uniqDir);
}现在,整个想法是创建uniq名称。现在有很多方法来创建uniq名称。我将使用一个基于时间戳的方法。
String createUniqDir() {
// Use SimpleDateFormat or just millis from Date
// We just trying to be as uniq as possible.
String timeStampStr;
Date now = new Date();
timeStampStr = "" + now.getTime(); // If using EPOC
// This soln if you wana use SimpleDateFormat
// SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd_HHmmssSSS");
// timeStampStr = sdf.format(dt);
int counter = 1;
String dirToCreateStr = "some_prefix-" + timeStampStr;
File dirToCreate = new File(dirToCreate);
while(!dirToCreate.mkdir()) {
dirToCreateStr = "some_prefix-" + timeStampStr + "-" + counter;
file = new File(dirToCreate);
counter++;
}
return dirToCreateStr;
}因为我们使用的是mkdir,而且它是原子的,所以只有当它能够创建uniq时才返回true。这个soln是优化的,因为在毫秒内请求碰撞要少得多,我们不需要任何同步开销。
您也可以使用一些counter来创建uniq名称。但是,如果您的计数器总是从一开始就开始(也就是说,您没有以线程安全的方式维护它的状态),那么您就存在性能/准确性问题。
发布于 2011-12-02 09:37:23
两项建议:
类FileProcessor /*FileUtil,但不包括FileWriter */ {
公共同步writeFile(String contextPath) { //在上下文下创建目录和新文件
copyFiles(contextPath);compressDir(contextPath);//压缩文件
}
//将文件复制到/contextPath/目录/.来自existingDirectory;
私有空copyFiles(String path_to_directory){ }
//压缩新创建的目录私有空compressDir(String Directory_path) { }
https://stackoverflow.com/questions/8353910
复制相似问题