MongoDB 取出文件遇到异常

#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 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,嗯,这是两者的区别
     在mongodb数据库中,通过GridFS存入的文件是保存在两个地方:fs.files和fs.chunks
第一种方法获得的GridFSDBFile将无法读取chunks的内容←_←
第二种方法获得的GridFSDBFile却可以



你可能感兴趣的:(MongoDB学习笔记)