【问题标题】:How to retrieve an zip file from oracle blob using java?如何使用 java 从 oracle blob 中检索 zip 文件?
【发布时间】:2020-05-28 05:24:35
【问题描述】:

我有一个存储在 Oracle 数据库表中的 zip 文件,该表由三个不同的 xml 文件组成。我想要做的是在我的本地文件系统中获取这个 zip 文件。为了检索这个 zip 文件,我在 java 代码下面写了:

package com.pack.IOT;

import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class Test2 {

    public static Connection con;
    public static PreparedStatement stmt;

    public static void main(String[] args) {

        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");           
            con = DriverManager.getConnection(url,uname,pwd);           
            stmt=con.prepareStatement("select * from FileStore");

            ResultSet rs=stmt.executeQuery();
            while (rs.next()) {
                InputStream is = rs.getBinaryStream(3);
                convert(is);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

        finally {
            try {
                stmt.close();
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
}

    }

    private static void convert(InputStream is) {

        FileOutputStream outputStream = null;
        File file = new File("C:\\Users\\nshaik\\Desktop\\IOTZip.zip");
        try {
        outputStream = new FileOutputStream(file);
        BufferedInputStream bis = new BufferedInputStream(is);
        ByteArrayOutputStream buf = new ByteArrayOutputStream();
        int result;

        result = bis.read();

        while (result != -1) {
            buf.write((byte) result);
            result = bis.read();
        }           
        outputStream.write(buf.toByteArray());
        System.out.println("File write success....");
        } 
        catch (IOException e) {
            e.printStackTrace();
        }
        finally {
        try {
            outputStream.close();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
  }
}

代码运行良好,但我看到一个错误“存档意外结束”,这个 zip 文件应该包含三个不同的文件,但我只看到一个文件,它的大小为零。

我不确定我做错了什么,非常感谢任何人的帮助。

【问题讨论】:

  • 这是an example 如何在数据库中执行此操作。您可能可以对其进行调整以在数据库之外执行此操作。
  • 为什么要将二进制数据转换为String(这可能会损坏它,因为并非所有字节都会产生有效字符),然后将该字符串转换回字节(这可能会再次丢失信息,因为到字符集约束)?将输入流中的字节直接写入文件,而无需转到字符串并返回字节。另外,你说内容是一个zip文件,那你为什么要把它写到一个扩展名为.xml的文件中呢?
  • @MarkRotteveel 谢谢,我更改了将字节转换为字符串的部分,反之亦然,现在代码工作正常,我能够获得所需的输出。

标签: java oracle jdbc blob java-io


【解决方案1】:

以下是上述要求的工作代码,

package com.pack.IOT;

import java.io.BufferedInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

public class Test2 {

    public static Connection con;
    public static PreparedStatement stmt;

    public static void main(String[] args) {

        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");           
            con = DriverManager.getConnection(url,uname,pwd);           
            stmt=con.prepareStatement("select * from FileStore");

            ResultSet rs=stmt.executeQuery();
            while (rs.next()) {
                InputStream is = rs.getBinaryStream(3);
                convert(is);
            }

        } catch (Exception e) {
            e.printStackTrace();
        }

        finally {
            try {
                stmt.close();
                con.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
}

    }

    private static void convert(InputStream is) {

        FileOutputStream outputStream = null;
        File file = new File("C:\\Users\\nshaik\\Desktop\\IOTZip.zip");
        try {
        outputStream = new FileOutputStream(file);
        BufferedInputStream bis = new BufferedInputStream(is);
        ByteArrayOutputStream buf = new ByteArrayOutputStream();
        int result;

        result = bis.read();

        while (result != -1) {
            buf.write((byte) result);
            result = bis.read();
        }           
        outputStream.write(buf.toByteArray());
        System.out.println("File write success....");
        } 
        catch (IOException e) {
            e.printStackTrace();
        }
        finally {
        try {
            outputStream.close();
        }
        catch (Exception e) {
            e.printStackTrace();
        }
    }
  }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-12-23
    • 1970-01-01
    • 2020-02-12
    • 2019-12-16
    • 1970-01-01
    • 2020-03-14
    • 2012-01-25
    相关资源
    最近更新 更多