#pre
前些天终于把文件塞进mongoDB里边了,然后开始考虑拉取
#代码好像没什么不对的
public static void test1() { GridFS gfs=new GridFS(new DB(new MongoClient(),"listentome")); DBCursor cur=gfs.getFileList(); int num=0; while(cur.hasNext()) { GridFSDBFile dbf=(GridFSDBFile)cur.next(); try { dbf.writeTo("E:/"+(num++)+".mp3"); } catch (IOException e) { e.printStackTrace(); } } }
#然而异常来了
Exception in thread "main" java.lang.IllegalStateException: No GridFS instance defined!
at com.mongodb.gridfs.GridFSDBFile.getChunk(GridFSDBFile.java:95)
at com.mongodb.gridfs.GridFSDBFile.writeTo(GridFSDBFile.java:88)
at com.mongodb.gridfs.GridFSDBFile.writeTo(GridFSDBFile.java:70)
at com.mongodb.gridfs.GridFSDBFile.writeTo(GridFSDBFile.java:56)
at com.listentome.DB.Operations.IDB.test1(IDB.java:112)
at com.listentome.DB.Operations.IDB.main(IDB.java:101)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
at com.mongodb.gridfs.GridFSDBFile.getChunk(GridFSDBFile.java:95)
at com.mongodb.gridfs.GridFSDBFile.writeTo(GridFSDBFile.java:88)
at com.mongodb.gridfs.GridFSDBFile.writeTo(GridFSDBFile.java:70)
at com.mongodb.gridfs.GridFSDBFile.writeTo(GridFSDBFile.java:56)
at com.listentome.DB.Operations.IDB.test1(IDB.java:112)
at com.listentome.DB.Operations.IDB.main(IDB.java:101)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134)
百度无果(←_←,反正我没找着,去
官方文档看了看,然而并没有发现什么)
看问题是说:在调用
GridFSDBFile的writeTo方法时发现没有定义
GridFS 的实例从而抛出异常
啊喂我这是从GridFS 里边取出来的= =
#看GridFSDBFile对应源码
private byte[] getChunk(int chunkNumber) { if(this.fs == null) { throw new IllegalStateException("No GridFS instance defined!"); } else { DBObject chunk = this.fs.getChunksCollection().findOne((new BasicDBObject("files_id", this.id)).append("n", Integer.valueOf(chunkNumber))); if(chunk == null) { throw new MongoException("Can\'t find a chunk! file id: " + this.id + " chunk: " + chunkNumber); } else { return (byte[])((byte[])chunk.get("data")); } } }
也就是说GridFSDBFile有一个内部的成员变量是fs,值是null
然而它是私有的(private),外部访问不到,所以不能通过setGridFS来解决
然而它是私有的(private),外部访问不到,所以不能通过setGridFS来解决
于是源码看到这里没路了←_←
#后来换了个方法,成功取出文件
public static void test2() { GridFS gfs=new GridFS(new DB(new MongoClient(),"listentome")); List<GridFSDBFile> list=gfs.find(new BasicDBObject()); //new BasicDBObject()是作为query部分传值 // 比如new BasicDBObject("name","K.")
try { int num=0; for(GridFSDBFile dbf :list) dbf.writeTo("E:/" + (num++) + ".mp3"); } catch (IOException e) { e.printStackTrace(); } }
#想了想
第一种方法是通过DBcursor获取到的GridFSDBFile,应该是在强转的时候把fs丢了←_←
第二种方法是直接获取到一个list<GridFSDBFile>,嗯,这是两者的区别
在mongodb数据库中,通过GridFS存入的文件是保存在两个地方:fs.files和fs.chunks
第一种方法获得的GridFSDBFile将无法读取chunks的内容←_←
第二种方法获得的GridFSDBFile却可以
第一种方法是通过DBcursor获取到的GridFSDBFile,应该是在强转的时候把fs丢了←_←
第二种方法是直接获取到一个list<GridFSDBFile>,嗯,这是两者的区别
在mongodb数据库中,通过GridFS存入的文件是保存在两个地方:fs.files和fs.chunks
第一种方法获得的GridFSDBFile将无法读取chunks的内容←_←
第二种方法获得的GridFSDBFile却可以