将 java.io.inputstream 转换为 java.sql.blob

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/27934293/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-11-02 12:39:44  来源:igfitidea点击:

convert java.io.inputstream to java.sql.blob

java

提问by CodeMed

How do I convert a java.io.inputstreamto a java.sql.blobusing pure java?

如何使用纯 Java将 a 转换java.io.inputstream为 a java.sql.blob

EDIT:

编辑:

In response to tbodt's suggestions, I ran the following through the eclipse debugger. The debugger shows that myinputstreamhas content, but that blobremains nullat the end of the code. What do I need to do to fix this?

为了响应 tbodt 的建议,我通过 eclipse 调试器运行了以下内容。调试器显示myinputstream有内容,但blob保留null在代码的末尾。 我需要做什么来解决这个问题?

byte[] contents;
ByteArrayOutputStream output = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int count;
while ((count = myinputstream.read(buffer)) != -1){output.write(buffer, 0, count);}//debugger says myinputstream has blksize 16384, buffcount 12742, and max 127394 here
contents = output.toByteArray();
Blob blob = null;
try {blob = new SerialBlob(contents);} 
catch (SerialException e) {e.printStackTrace();}
catch (SQLException e) {e.printStackTrace();}

someObject.setSomeBlobProperty(blob);//debugger says blob is null here

I also ran the IOUtilsapproach through the debugger, but got the exact same results, with a nullblobbut a populated myinputstream. How can I fix this?

我还IOUtils通过调试器运行了该方法,但得到了完全相同的结果,nullblob但是一个填充的myinputstream. 我怎样才能解决这个问题?

Blob blob = null;
try {
    blob = new SerialBlob(IOUtils.toByteArray(myinputstream));//debugger says myinputstream has contents here.
    someObject.setSomeBlobProperty(blob);//debugger says blob is null here
} 
catch (SerialException e) {e.printStackTrace();}
catch (SQLException e) {e.printStackTrace();}

In both cases, the debugger says myinputstreamhas blksize16384, buffcount12742, and max127394 at the indicated locations, despite blobremaining null. I also checked the underlying mysqldatabase after running this code and confirmed that the blob field is empty.

在这两种情况下,调试器说myinputstreamblksize16384,buffcount12742和max127394在指定的位置,尽管blob剩余nullmysql运行此代码后,我还检查了底层数据库,并确认 blob 字段为空。

EDIT#2

编辑#2

I then ran the following through the eclipse debugger, which showed that the byte[]called contentremained empty after the attempts to populate it. So the resulting blobis empty, while the inputstreamdoes indeed continue to have the same content values as shown in edit#1 above:

然后我通过 eclipse 调试器运行以下命令,这表明在尝试填充它之后byte[]被调用的对象content仍然是空的。所以结果blob是空的,而inputstream确实继续具有与上面编辑#1 中所示相同的内容值:

Blob blob = null;
byte[] content = IOUtils.toByteArray(myinputstream);
try {
    blob = new SerialBlob(content);//debugger says content is empty here
    someObject.setSomeBlobProperty(blob);//debugger says blob is empty here.
}//debugger says myinputstream has the same values as in edit#1
catch (SerialException e) {e.printStackTrace();}
catch (SQLException e) {e.printStackTrace();}

回答by tbodt

The easy way:

简单的方法:

contents = IOUtils.toByteArray(in);

But for that, you need Apache Commons IO, which might be hard to add. If you don't want to use it, or can't, here's one way of doing it yourself;

但为此,您需要 Apache Commons IO,这可能很难添加。如果你不想使用它,或者不能使用它,这里有一种自己做的方法;

ByteArrayOutputStream output = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int count;
while ((count = input.read(buffer)) != -1)
    output.write(buffer, 0, count);
contents = output.toByteArray();

回答by Angel O. Flores Torres

You can use the same:

您可以使用相同的:

Blob xmlForSign=null;
xmlForSign.getBinaryStream();

this method getBinaryStream() return an Inputfilestream.

这个方法 getBinaryStream() 返回一个 Inputfilestream。