首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何设计类及其方法

如何设计类及其方法
EN

Stack Overflow用户
提问于 2011-12-02 08:59:39
回答 2查看 88关注 0票数 1

多个客户端发送写入文件的请求,并期望响应成功或失败。我想简单地描述一下在服务器端所做的工作。

  1. 通过servlet类处理请求,并调用另一个类进行进一步的处理。调用
  2. 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_1directory_2无关,所有新创建的目录都从common_directory复制文件,例如``context/Common目录/.到上下文/目录_1,上下文/目录_2‘

第三步是压缩目录:例如,directory_1.zip, directory_2.zip

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-12-02 09:16:05

查看上面的代码,如果从servlet调用writeFile,您的servlet最终会成为一个线程化的应用程序。

如果两个人正在处理两个单独的目录和单独的文件,并且您保证没有重叠,那么您应该直接调用这两个方法并丢弃synchronized。看来你的处境就是这样。因此,您可以使用以下方法:

代码语言:javascript
复制
Servlet Code

{
  ....
  String uniqDir = createUniqDir();
  copyFiles(uniqDir);
  compressDir(uniqDir);
}

现在,整个想法是创建uniq名称。现在有很多方法来创建uniq名称。我将使用一个基于时间戳的方法。

代码语言:javascript
复制
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名称。但是,如果您的计数器总是从一开始就开始(也就是说,您没有以线程安全的方式维护它的状态),那么您就存在性能/准确性问题。

票数 1
EN

Stack Overflow用户

发布于 2011-12-02 09:37:23

两项建议:

  1. 不将该类命名为JDK中已经存在的类。
  2. 不以这种方式调用链式方法,创建一个单一用途的方法,然后将它们放在一个方法中,清楚地显示您的内涵。

类FileProcessor /*FileUtil,但不包括FileWriter */ {

公共同步writeFile(String contextPath) { //在上下文下创建目录和新文件

copyFiles(contextPath);compressDir(contextPath);//压缩文件

}

//将文件复制到/contextPath/目录/.来自existingDirectory;

私有空copyFiles(String path_to_directory){ }

//压缩新创建的目录私有空compressDir(String Directory_path) { }

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8353910

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档