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

如何使用java从oracle blob检索zip文件?,java,oracle,jdbc,blob,java-io,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.

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

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