云计算环境中提供了多种文件管理系统,包括HDFS和AWSS3等。这些文件系统都有各自的特点,并且它们提供的编程接口也有很大的区别。
对文件的操作一般有创建、删除、复制、下载等。
为了便于日后迁移系统,我们需要设计一个公共文件系统访问框架。
针对这个问题,必须提供一个统一的文件管理接口FileManager,在本书中将针对AWS S3文件系统与HDFS文件系统分别实现AWSS3FileManager与HDFSFileManager,并使用工厂模式根据所需使用的文件系统类型选择具体的实现,如图5-9所示。
图5-9 公共文件系统访问框架
(1)FileManager接口代码
FileManager接口代码如代码清单5-17所示。
【代码清单5-17】
(2)统一文件对象
由于各个文件系统返回的文件对象不一致,所以需要根据用户自己的要求建立统一的文件类。对于本系统,目前只关心文件名与大小。统一文件类的代码如代码清单5-18所示。
【代码清单5-18】
(3)根据文件系统类型,选择具体的文件系统实现
注意在该代码中,我们同样使用了单态模式,但并不是在JVM加载类的时候进行实例化,而是在getInstance时初始化。原因很简单,在具体的云计算环境中,一般只存在一种文件系统,HDFS与AWSS3很难共存。在这样的情况下,就没有必要每一种文件系统都实例化,而是要根据具体情况来初始化文件系统。
同时要在getInstance方法后加synchronized关键字。因为可能有好几个Servlet线程同时调用getInstance方法。如果不对getInstance方法加锁,则有可能实例化出多个FileMan- ager对象。如代码清单5-19所示。
【代码清单5-19】
先将文件管理模块与HDFS集成,HDFS文件系统初始化的代码如代码清单5-20所示。
【代码清单5-20】
(4)上传文件
该共享系统要求每个用户只能访问属于自己的文件。因此在HDFS根目录下建立一个filesharesystem文件夹,每个新用户都将在该文件夹下建立以自身用户名命名的专属文件夹。
使用如下命令建立filesharesystem文件夹。
为用户创建专有文件夹,如代码清单5-21所示。
【代码清单5-21】(www.xing528.com)
检查用户文件夹是否已存在,如代码清单5-22所示。
【代码清单5-22】
通过Tomcat上传文件有两种方式,一种方式是将文件先上传到Tomcat所在的服务器。另一种方式是通过数据流,直接将文件上传到最终的文件系统中。这里选择后者,如代码清单5-23所示。
【代码清单5-23】
将文件上传到服务器的代码如代码清单5-24所示。
【代码清单5-24】
调用服务器上传文件的JSP代码如代码清单5-25所示。
【代码清单5-25】
(5)下载文件
通过Tomcat下载文件也有两种方式,一种方式是将文件先下载到Tomcat所在的服务器。另一种方式是通过数据流直接获取文件,再通过数据流传递给客户端。这里选择后者,如代码清单5-26所示。
【代码清单5-26】
使用数据流下载文件有一个小技巧,即设置Http返回消息头,其代码如下。
这就告诉客户端,这是一个下载文件。服务器的实现如代码清单5-27所示。
【代码清单5-27】
JSP页面只需加入如下链接,即可让用户单击下载文件,如代码清单5-28所示。
【代码清单5-28】
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。