我正在嘗試使用在blob列後面的字段中找到的值從blob中提取文件。我的解決方案有效,但速度很慢。從Oracle blob字段提取文件;
我在大約1小時內提取了169MB(727個不同的文件)。這大概是每分鐘12個文件。 大部分文件通常在5KB到50KB之間,但有時可能大到2MB。我正在使用本地Oracle數據庫。
有什麼我可以做的,使我的代碼更有效率?如果不是,還有哪些其他因素可能會影響流程的速度?以下是該方法的代碼:
public void beginExtraction(String FileOutDir, String blobSQL,
String fileSuffix, Connection conn) {
if ((FileOutDir != null) && (blobSQL != null) && (conn != null)) {
PreparedStatement selBlobs = null;
FileOutputStream fos = null;
if (conn != null) {
if (blobSQL != null) {
try {
selBlobs = conn.prepareStatement(blobSQL);
ResultSet rs = selBlobs.executeQuery();
int cols = rs.getMetaData().getColumnCount();
while (rs.next()) {
Blob blob = rs.getBlob(1);
InputStream is = blob.getBinaryStream();
String filepath = "";
filepath += FileOutDir + "/";
for (int c = 2; c <= cols; c++) {
filepath += rs.getObject(c).toString() + "_";
}
filepath = filepath.substring(0,
filepath.length() - 1);
filepath += fileSuffix;
fos = new FileOutputStream(filepath);
int b = 0;
while ((b = is.read()) != -1) {
fos.write(b);
}
}
selBlobs.close();
fos.close();
} catch (Exception e) {
JOptionPane.showMessageDialog(gui, e.toString());
}
}
}
} else {
if (conn == null) {
JOptionPane.showMessageDialog(gui,
"You have not selected a database.");
} else {
if (FileOutDir == null) {
JOptionPane.showMessageDialog(gui,
"You have not chosen a directory for your files.");
} else {
if (blobSQL == null) {
JOptionPane.showMessageDialog(gui,
"Please insert an SQL statement.");
}
}
}
}
}
也許嘗試使用緩衝輸入和輸出流? –
不是緩衝輸入和緩衝輸出與輸入和輸出相同,但具有更多功能? – Native
緩衝的輸入和輸出使讀取和寫入緩衝的操作,所以他們應該更快地讀取和寫入 - 而不是讀取和逐字節寫入,你可以做它塊。試一試。 –