多个客户端发送写入文件的请求,并期望响应成功或失败。我想简要描述在服务器端完成的工作。
FileWriter
类,此类执行文件写入过程
a)。 在上下文中创建目录并在目录中写入*.txt
文件
b)。 将上下文现有目录中的一些文件复制到新创建的目录中。
c)。 压缩(*.zip)
此目录
class FileWriter {
public synchronized writeFile(String contextPath) {
creates a directory & new file under context
copyFiles(path_to_directory);
}
private void copyFiles(String path_to_directory){
copies files to /contextPath/directory/... from existingDirectory;
compressDir( Directory_path ); // to compress the file
}
private void compressDir(String Directory_path) {
compress the newly created directory
}
}
正如您在课堂上看到的那样,有一种方法是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_directory / ...到context / directory_1,context / directory_2'
和第三步是压缩目录:例如directory_1.zip, directory_2.zip
答案 0 :(得分:2)
两个建议:
不要将类命名为JDK中已存在的类。
不要以这种方式链接方法调用,然后创建一个用途的方法 把它们放在一起,清楚显示你的内涵。
类FileProcessor / * FileUtil是什么,但不是FileWriter * / {
public synchronized writeFile(String contextPath){ //创建一个目录&上下文中的新文件
copyFiles(contextPath中);
compressDir(contextPath中); //压缩文件
}
//将文件从existingDirectory复制到/ contextPath / directory / ...;
private void copyFiles(String path_to_directory){}
//压缩新创建的目录 private void compressDir(String Directory_path){}
答案 1 :(得分:1)
查看上面的代码,如果从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名称。但是,如果你的计数器总是从头开始(即你没有以线程安全的方式保持其状态),那么你就会遇到性能/准确性问题。