一、文件系统
先简单的介绍一下文件系统和分布式文件系统
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文件中。
- <dependencies>
- <dependency>
- <groupId>org.mongodb</groupId>
- <artifactId>mongodb-driver</artifactId>
- <version>3.2.0</version>
- </dependency>
- </dependencies>
(3)创建数据库连接、文件上传下载操作
- 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查询、遍历查询所有文件列表、删除等方法。
-
-
-
-
-
- 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