一、文件系统
class="MsoNormal" style="color: #555555; font-family: 'microsoft yahei'; font-size: 15px; line-height: 35px;">?
先简单的介绍一下文件系统和分布式文件系统
1、文件系统:是操作系统用来存取文件的,计算机通过文件系统存放数据。大部分均基于磁盘存储,典型的文件系统包括unix?的UFS,NTFS是window?NT的文件存储系统。传统文件系统主要面临的问题就是磁盘容量不够时,需要扩容才可继续进行文件存储,如同咱电脑内存不够加块内存条。
2、分布式文件存储系统:同传统的纵向扩容不同,分布式文件存储系统通过存储文件节点,各节点通信形成文件系统网络,各节点通过网络进行数据传输。就像原来密集的数据信息通过一张节点织网,分布式文件系统负责对节点进行存储,数据文件可存储于其他存储系统中。
二、GridFS?文件系统
?GridFS是分布式文件存储系统的典型代表。为MongoDB提供的数据存储解决方案,专门供大数据文件存储使用,主要用于存储视频、音频、图片,GridFS主要适用于文件数量较大的文件存储。
GridFS并非mongodb的特有,不过是mongo选择使用这样一种文件存储解决方案进行存储自己的数据。用户上传的数据存储于mongo的集合中,【mongoDB的集合类似于关系数据库的表】
?
三、在Java中使用mongo?GridFS进行数据操作
介绍了GridFS的原理,下面以上传、下载本地PDF文件为例,演示如何在java?maven项目中使用mongo进行数据操作。
1、整体流程
使用GridFS,首先调用客户端驱动程序提供的GFS?API【如java中引入mongojar包】来将数据块进行分割,准备上传,如果是下载则利用API进行数据合并,保存到mongo集合中。
?
2、代码演示
?(1)首先新建maven项目
?(2)在mongoDB官网下载mongo驱动jar包,
???????? 下载地址如下:https://docs.mongodb.org/ecosystem/drivers/?
?????????点击MongoDB?Java?Driver,将驱动坐标拷贝到maven?pom文件中。
?
?
[html]?view plain
?copy
?
- <dependencies>??
- ????<dependency>??
- ????????<groupId>org.mongodb</groupId>??
- ????????<artifactId>mongodb-driver</artifactId>??
- ????????<version>3.2.0</version>??
- ????</dependency>??
- </dependencies>??
?
?
?
?(3)创建数据库连接、文件上传下载操作
?
[java]?view plain
?copy
?
- public?class?GridFSDemo?{??
- ????public?static?void?main(String[]?args)?throws?FileNotFoundException??
- ????{??
- ?????????
- ?
- ??
- ????????Mongo?client=?new?Mongo("192.168.22.246",27017);??
- ??????????
- ????????DB?db=client.getDB("mongoTest");??
- ??????????
- ????????String?collectionName="mongoCollectionTest";??
- ??????????
- ????????GridFS?gridFS=?new?GridFS(db,collectionName);?????????
- ??????????
- ?????????
- ?
- ??
- ??????????
- ????????File?file=new?File("F:/Java/疯狂JAVA讲义.pdf");??
- ????????FileInputStream?fileInputStream=new?FileInputStream(file);??
- ??????????
- ??????????
- ????????GridFSInputFile?createFile=gridFS.createFile(fileInputStream);??
- ??????????
- ??????????
- ????????createFile.put("filename",?"123Test.pdf");??
- ????????createFile.put("contentType",?"application/pdf");??
- ????????createFile.save();??
- ??????????
- ??????????
- ?????????
- ?
- ??
- ????????GridFSDBFile?findOne=?gridFS.findOne(new?BasicDBObject("_id",createFile.getId()));??
- ????????System.out.print(findOne);??
- ??????????
- ?????????
- ?
- ?
- ??
- ????????DBCursor?fileList=gridFS.getFileList();??
- ????????while(fileList.hasNext())??
- ????????{??
- ????????????System.out.print(fileList.next());??
- ????????}??
- ??????????
- ?????????
- ?
- ??
- ????????gridFS.remove(new??BasicDBObject("_id",createFile.getId()));??
- ????????client.close();??
- ????}??
?
?
?
?(4)程序效果展示
如图,在mongDB中新建名为【mongoTest】的数据库和【mongoCollectionTest】集合,将【123Test.pdf】上传到该集合中。
四、项目应用
在ITOO项目中tool模块也封装了使用GridFS对mongoDB进行操作的底层方法,主要同【三】中的代码流程一致,通过创建数据库连接,建立数据库、集合,获取本地文件路径,创建文件输入流通过save方法将文件上传到数据库中。同样也有通过id查询、遍历查询所有文件列表、删除等方法。
?
[java]?view plain
?copy
?
- ?
- ?
- ?
- ?
- ??
- ????private?Mongo?getMongo(){??
- ????????Mongo?mongo=null;??
- ????????try?{??
- ????????????mongo?=?new?Mongo("192.168.22.246",27017);??
- ??????????????
- ????????}?catch?(Exception?e)?{??
- ????????????e.printStackTrace();??
- ????????}??
- ????????return?mongo;??
- ????}??
- ??????
- ?????
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ??
- ???public?void?uploadFile(File?file?,String?id,String?dbName,String?collectionName,LinkedHashMap<String,?Object>?map){??
- ?????????
- ????????try?{??
- ????????????Mongo?mongo?=getMongo();???
- ??????????????
- ????????????DB?db=?mongo.getDB(dbName);??
- ????????????System.out.println(db.toString());??
- ??????????????
- ????????????GridFS?gridFS=?new?GridFS(db,collectionName);??
- ??????????????
- ??????????????
- ????????????GridFSFile?gridFSFile?=?gridFS.createFile(file);??
- ??????????????
- ????????????GridFSDBFile?gridFSDBFile=getFileById(id,?dbName,?collectionName);??
- ????????????if(gridFSDBFile!=null){??
- ????????????????deleteFile(id,?dbName,?collectionName);??
- ????????????}??
- ??????????????
- ????????????gridFSFile.put("_id",?id);??
- ??????????????
- ????????????if?(map?!=?null?&&?map.size()?>?0)?{??
- ????????????????for?(String?key?:?map.keySet())?{??
- ????????????????????gridFSFile.put(key,?map.get(key));??
- ????????????????}??
- ????????????}??
- ??????????????
- ????????????gridFSFile.save();??
- ????????}?catch?(Exception?e)?{??
- ????????????e.printStackTrace();??
- ????????}??
- ????}??
- ?????
- ????
- ?
- ?
- ?
- ?
- ?
- ??
- ???public?void?deleteFile(String?id,String?dbName,String?collectionName){??
- ??
- ????????try?{??
- ??????????????
- ????????????Mongo?mongo?=getMongo();???
- ??????????????
- ????????????DB?db=?mongo.getDB(dbName);??
- ??????????????
- ????????????GridFS?gridFS=?new?GridFS(db,collectionName);??
- ??????????????
- ????????????DBObject?query=new?BasicDBObject("_id",?id);??
- ????????????gridFS.remove(query);??
- ????????}?catch?(Exception?e)?{??
- ????????????e.printStackTrace();??
- ????????}??
- ???}??
- ?????
- ????
- ?
- ?
- ?
- ?
- ?
- ?
- ?
- ??
- ???public?void?deleteFileByIds(String[]?ids,String?dbName,String?collectionName){??
- ???????try?{??
- ?????????????
- ???????????Mongo?mongo?=getMongo();???
- ?????????????
- ???????????DB?db=?mongo.getDB(dbName);??
- ?????????????
- ???????????GridFS?gridFS=?new?GridFS(db,collectionName);??
- ???????????Map<String,String>?map?=?new?HashMap<String,String>();??
- ???????????for(int?i=0;i<ids.length;i++){??
- ???????????????
- ???????????????DBObject?query=new?BasicDBObject("_id",?ids[i]);??
- ???????????????gridFS.remove(query);??
- ???????????}???????????
- ???????}?catch?(Exception?e)?{??
- ???????????e.printStackTrace();??
- ???????}??
- ??}??
- ?????
- ????
- ?
- ?
- ?
- ?
- ?
- ?
- ??
- ???public?GridFSDBFile?getFileById(String?id,String?dbName,String?collectionName){??
- ???????GridFSDBFile?gridFSDBFile=null;??
- ???????try?{??
- ??????????????
- ????????????Mongo?mongo?=getMongo();???
- ??????????????
- ????????????DB?db=?mongo.getDB(dbName);??
- ??????????????
- ????????????GridFS?gridFS=?new?GridFS(db,collectionName);??
- ??????????????
- ????????????DBObject?query=new?BasicDBObject("_id",?id);??
- ????????????gridFSDBFile=gridFS.findOne(query);??
- ????????}?catch?(Exception?e)?{??
- ????????????e.printStackTrace();??
- ????????}??
- ?????????
- ???????return?gridFSDBFile;??
- ???}??
- ?????
- ????
- ?
- ?
- ?
- ?
- ?
- ??
- ???public?List<GridFSDBFile>?getAllFile(String?dbName,String?collectionName){??
- ???????List<GridFSDBFile>?gridFSDBFileList=null;??
- ???????try?{??
- ??????????????
- ????????????Mongo?mongo?=getMongo();???
- ??????????????
- ????????????DB?db=?mongo.getDB(dbName);??
- ??????????????
- ????????????GridFS?gridFS=?new?GridFS(db,collectionName);??
- ??????????????
- ????????????DBObject?query=new?BasicDBObject();??
- ????????????gridFSDBFileList?=?gridFS.find(query);??
- ????????}?catch?(Exception?e)?{??
- ????????????e.printStackTrace();??
- ????????}??
- ?????????
- ???????return?gridFSDBFileList;??
- ???}??
通过对GridFS结合java file类,实现了对各音频、视频、图片等数据在mongoDB上的存储,不可否认的是,作为NoSQL数据库mongoDB利用其自身独到之处被众多大型视频网站项目所青睐,GridFS便是其点睛之笔。
?
http://blog.csdn.net/daybreak1209/article/details/50471262