将数据写入文件

时间:2016-04-04 21:12:06

标签: java

我发现这个例子是如何从PostgreSQL读取二进制文件的。

conn.setAutoCommit(false);

        // Get the Large Object Manager to perform operations with
        LargeObjectManager lobj = ((org.postgresql.PGConnection) conn).getLargeObjectAPI();

        ps = conn.prepareStatement("SELECT FILE FROM KNOWLEDGEBASE_FILES WHERE ID = ?");
        ps.setInt(1, 333);
        ResultSet rs = ps.executeQuery();
        while (rs.next())
        {
            // Open the large object for reading
            long oid = rs.getLong(1);
            LargeObject obj = lobj.open(oid, LargeObjectManager.READ);

            // Read the data
            byte buf[] = new byte[obj.size()];
            obj.read(buf, 0, obj.size());
            // Do something with the data read here


            FileChannel rwChannel = new RandomAccessFile("License_Agreement.pdf", "rw").getChannel();
            ByteBuffer wrBuf = rwChannel.map(FileChannel.MapMode.READ_WRITE, 0, buffer.length * number_of_lines);
            for (int i = 0; i < obj.size(); i++)
            {
                wrBuf.put(obj);
            }

            // Close the object
            obj.close();
        }
        rs.close();
        ps.close();

        // Finally, commit the transaction.
        conn.commit();

如何使用NIO将数据写入文件?

在此行wrBuf.put(obj);我收到错误:

找不到合适的put方法(LargeObject)     方法ByteBuffer.put(byte)不适用       (参数不匹配; LargeObject无法转换为byte)     方法ByteBuffer.put(ByteBuffer)不适用       (参数不匹配; LargeObject无法转换为ByteBuffer)     方法ByteBuffer.put(byte [])不适用       (参数不匹配; LargeObject无法转换为byte [])

1 个答案:

答案 0 :(得分:1)

您可以使用LargeObject::getInputStream

import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.StandardCopyOption;
//...
while (rs.next())
{
    long oid = rs.getLong(1);
    LargeObject obj = lobj.open(oid, LargeObjectManager.READ);
    Path targetPath = FileSystems.getDefault().getPath("License_Agreement.pdf");
    Files.copy(obj.getInputStream(), targetPath, StandardCopyOption.REPLACE_EXISTING);
    obj.close();
}