我从服务器获取图像作为 InputStream,然后将其保存到 mySQL 数据库。它在我使用 Thread.sleep(5000);
时有效。但是,如果我不使用它,则没有图片会保存到数据库中,或者只有一张图片和一半或更少。所以我知道程序需要时间将图像写入数据库,但需要多少时间?这就是问题,我想确切地知道它何时将图像写入数据库并可以开始下一张图像。下面是我的代码:
ResultSet rs = stmt.executeQuery(query);
while (rs.next()) {
int ID = rs.getInt(1);
String myName = rs.getString(2);
try {
String myCommand = "take picture and save /mydir/mydir2/mydir3" + myName + ".png";
telnet.sendCommand(myCommand); // Here taking a picture via telnet
// Thread.sleep(5000);// If I uncomment this line it works
String sqlCommand = "UPDATE my_table SET Picture = ? WHERE ID ='" + ID +"';";
PreparedStatement statement = conn.prepareStatement(sqlCommand);
String ftpUrl = "ftp://"+server_IP+"/mydir/mydir2/mydir3" + myName + ".png;type=i";
URL url = new URL(ftpUrl);
URLConnection connUrl = url.openConnection();
//Thread.sleep(5000); // If I uncomment this line, it works too.
InputStream inputStreamTelnet = connUrl.getInputStream();
statement.setBlob(1, inputStreamTelnet);
int row = statement.executeUpdate();
if (row > 0) {
System.out.println("A picture was inserted into DB.");
System.out.println("Value of row(s) : " + row);
}
} catch (Exception e) {
e.printStackTrace();
}
} // End of while
我希望将 waiting(sleep) 放在 InputStream inputStreamTelnet = connUrl.getInputStream();
之后,但是当我将 sleep 放在这一行之后时它不起作用。它仅在 sleep 之前有效。有人能解释一下为什么吗,我想避免使用 Thread.sleep(5000);
而是想等待准确的时间或根本不等待,这将使程序更快,也可能有保存图片可能需要 5 秒以上的时间,或者保存图片不需要时间但打开 url 连接。当我取消注释程序运行的其中之一时,代码上有 2 条 sleep 线(成功将图像保存到 mysql 数据库)。我还在服务器上验证了图像存在,但最后我没有在 mysql 数据库中看到它们。
更新:我删除了 try block 和 telnet 的东西现在它不需要等待就可以工作但是我真的需要 telnet 的东西......
更新 2:检查我的 telnet 类后发现我忘记应用我对单行所做的更改...现在它无需等待即可工作!
最佳答案
嗯,我在 JDK 1.7.0_67/PostgreSQL 9.2 上测试了我的代码,它运行良好:
public class ImageLoader {
private static final int START_IMAGE_ID = 1;
private static final int END_IMAGE_ID = 1000;
private static final String IMAGE_URL = "http://savepic.net/%d.jpg";
public static void main(String[] args) throws SQLException, IOException {
Connection connection = DriverManager.getConnection("jdbc:postgresql://localhost:5432/test", "username", "password");
PreparedStatement imageStatement = connection.prepareStatement("INSERT INTO public.image VALUES(?, ?)");
for (int i = START_IMAGE_ID; i <= END_IMAGE_ID; i++) {
String imageUrl = String.format(IMAGE_URL, i);
URL url = new URL(imageUrl);
URLConnection urlConnection = url.openConnection();
imageStatement.setLong(1, i);
imageStatement.setBytes(2, read(urlConnection.getInputStream()));
int count = imageStatement.executeUpdate();
if (count != 1) {
throw new IllegalStateException("Image with ID = " + i + " not inserted");
} else {
System.out.println("Image (" + imageUrl + ") saved to database");
}
}
imageStatement.close();
connection.close();
}
private static byte[] read(InputStream inputStream) throws IOException {
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(1 << 15); // assume image average size ~ 32 Kbytes
BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
byte[] buffer = new byte[1 << 10];
int read = -1;
while ((read = bufferedInputStream.read(buffer)) != -1) {
byteArrayOutputStream.write(buffer, 0, read);
}
return byteArrayOutputStream.toByteArray();
}
}
关于java - 从服务器获取图像并保存到 MySQL DB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26892076/