mysql表mtable中有个photo字段,格式为longbolb,在其中id=1的记录中的photo字段保存了n张不同的图片,请读取这一条记录并把这n张图片分开,保存到byte[][]格式的photos中,会出现只有第一张图片能显示,后面的显示空白,为什么请给出代码
时间: 2024-04-29 19:25:23 浏览: 63
此问题可能与读取longblob类型数据时未正确处理数据流有关,以下是可能的解决方案:
解决方案1:使用PreparedStatement的setBinaryStream方法将图片数据流写入photo字段,使用ResultSet的getBinaryStream方法读取数据流并保存到byte[][]中。
示例代码:
```java
//获取连接
Connection conn = DriverManager.getConnection(url, username, password);
//创建PreparedStatement对象
PreparedStatement ps = conn.prepareStatement("SELECT photo FROM mtable WHERE id = 1");
//执行查询
ResultSet rs = ps.executeQuery();
//读取数据并保存到byte[][]中
if (rs.next()) {
InputStream is = rs.getBinaryStream(1);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
byte[] buffer = new byte[1024];
int len;
while ((len = is.read(buffer)) != -1) {
baos.write(buffer, 0, len);
}
byte[] data = baos.toByteArray();
//按照图片个数分隔数据
List<byte[]> list = new ArrayList<>();
int startIndex = 0;
for (int i = 0; i < data.length; i++) {
if (data[i] == 0xFF && data[i+1] == 0xD8) {
byte[] pic = Arrays.copyOfRange(data, startIndex, i);
list.add(pic);
startIndex = i;
}
}
byte[][] photos = list.toArray(new byte[list.size()][]);
}
```
解决方案2:使用Statement的executeQuery方法查询数据并使用ResultSet的getBytes方法读取字节数据,再将字节数据转换为byte[][]。
示例代码:
```java
//获取连接
Connection conn = DriverManager.getConnection(url, username, password);
//创建Statement对象
Statement stmt = conn.createStatement();
//执行查询
ResultSet rs = stmt.executeQuery("SELECT photo FROM mtable WHERE id = 1");
//读取数据并保存到byte[][]中
if (rs.next()) {
byte[] data = rs.getBytes(1);
//按照图片个数分隔数据
List<byte[]> list = new ArrayList<>();
int startIndex = 0;
for (int i = 0; i < data.length; i++) {
if (data[i] == 0xFF && data[i+1] == 0xD8) {
byte[] pic = Arrays.copyOfRange(data, startIndex, i);
list.add(pic);
startIndex = i;
}
}
byte[][] photos = list.toArray(new byte[list.size()][]);
}
```
以上代码仅为示例,具体实现可能需要根据实际情况进行适当调整。
阅读全文