java将inputStream转换为base64字符串

java将inputStream转换为base64字符串,java,string,base64,inputstream,Java,String,Base64,Inputstream,有一种方法可以将inputStream转换为字符串,并将其编码为base64,对吗? 在我的函数中,我获取InputStream参数,需要将其插入Oracle数据库表中的BLOB字段。有办法吗?(我的数据库对象包含用于保存图像的字符串字段,但我找不到任何方法将inputStream转换为base64格式的字符串) 谢谢大家! 最简单的方法是使用apache commons: String result= IOUtils.toString(inputStream, ENCODING); 从文件

有一种方法可以将inputStream转换为字符串,并将其编码为base64,对吗? 在我的函数中,我获取InputStream参数,需要将其插入Oracle数据库表中的BLOB字段。有办法吗?(我的数据库对象包含用于保存图像的字符串字段,但我找不到任何方法将inputStream转换为base64格式的字符串)
谢谢大家!

最简单的方法是使用apache commons:

String result= IOUtils.toString(inputStream, ENCODING); 
从文件中:

toString(字节[]输入,字符串编码) 使用指定的字符编码将字节[]的内容作为字符串获取

然后在Base64中编码/解码:

// Encode 
String resultBase64Encoded = Base64.getEncoder().encodeToString(result.getBytes("utf-8"));


// Decode
byte[] asBytes = Base64.getDecoder().decode(resultBase64Encoded);
String resultAsStringAgain= String(asBytes, "utf-8")
注意:我假设您使用JDK 8进行编码/解码部分

显然OP只想将InputStream持久化到DB。您可以直接使用JDBC执行此操作:

InputStream inputStream = ......;
String sql = "INSERT INTO TABLE_NAME(COLUMN_NAME) values (?)";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setBlob(1, inputStream);
statement.executeUpdate();

您可以使用Base64 API尝试类似的方法

InputStream finput = new FileInputStream(file);
byte[] imageBytes = new byte[(int)file.length()];
finput.read(imageBytes, 0, imageBytes.length);
finput.close();
String imageStr = Base64.encodeBase64String(imageBytes);
使用以下命令:


正如我提到的,您不应该对二进制数据使用
字符串。base64编码的数据可以存储为字符串。但由于您的数据库列是一个blob,我将继续使用
字节[]

使用IOUtils从
输入流中获取
字节[]

byte[] bytes = IOUtils.toByteArray(yourInputStream);
byte[] encoded = java.util.Base64.getEncoder().encode(bytes);
然后将其写入数据库。使用jdbc和PreparedStatement编写blob如下所示:

yourPreparedStatement.setBytes(nIndex, encoded);

有一种很好的方法可以做到这一点,那就是使用将InputStream转换为
字节数组

类似于

    InputStream is;
    byte[] bytes = IOUtils.toByteArray(is);
    String encoded = Base64.getEncoder().encodeToString(bytes);
在这里,您可以使用
Base64
字节数组
转换为
字符串

示例代码

    InputStream is;
    byte[] bytes = IOUtils.toByteArray(is);
    String encoded = Base64.getEncoder().encodeToString(bytes);

现在你可以使用你的
字符串了

你试过什么了吗?如果输入流包含图像数据,请不要使用
字符串
,但要使用
字节[]
。好的,这是什么意思?我需要将此字段更改为字节[]?如何从inputStream将其转换为字节[]?谢谢新FileInputStream需要获取文件-我没有文件名。。。。我需要设置inputStream…只要您有inputStream就可以了。您可以使用前面提到的logicBase64.DEFAULT-get compilation error-DEFAULT is not字段。我需要做什么?@f1sh我知道,但这是OP要求的。那么我能做什么?在将图像数据插入DB blob之前,我应该将其放在何处?@foo如果您只想将InputStream保存到DB中,您可以直接执行,而无需将其转换为任何其他内容…@foo请参阅我关于如何将InputStream作为blob直接持久化到DBTo mee的更新答案。这是一种更节省内存的方式,字节[]在被接受的答案中,你会吃掉它。您不需要临时空间来持久化流。我需要添加哪个导入?