java - 如何使用 java 从 oracle blob 检索 zip 文件?

标签 java oracle jdbc blob java-io

我有一个存储在 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 文件应包含三个不同的文件,但我只看到一个文件,且其大小为零。

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

最佳答案

下面是满足上述要求的工作代码,

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();
        }
    }
  }
}

关于java - 如何使用 java 从 oracle blob 检索 zip 文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60191974/

相关文章:

oracle - 如何在数据类型为 xmltype 的列上使用 ora_hash

php - Oracle 11g PHP oci_connect 失败 OCIEnvNlsCreate()

java - 如果Java生产代码中不存在,则创建数据库表并在JUnit中确认

java - 我们如何访问多维数组

java - 在 Java Web 中使用 Jena Api...未知异常

java - 请帮我理解以下代码中的 'assign'方法

sql - 虚拟列 - 在 View 中使用它 (Oracle)

java - Chronicle Map 2 containsKey 不起作用

java - 如何在 Java 中为具有组合键的表编写删除 SQL 语句?

java - JDBC MySQL 连接器