MongoDB 取出文件遇到异常

来源:互联网 发布:僵尸网络的主要特征是 编辑:程序博客网 时间:2024/05/23 11:52
#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)
     百度无果(←_←,反正我没找着,去官方文档看了看,然而并没有发现什么)
     看问题是说:在调用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来解决
于是源码看到这里没路了←_←

#后来换了个方法,成功取出文件
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却可以



0 0
原创粉丝点击