Hello,
Please let me know if this is not the proper group to post to, and if
this question has been answered in the past please forgive me, I
couldn't seem to find it.
I have a process that puts a file into a image column in SQL Server.
This runs very well and fast on a 2 megabyte file. Here is the code I
use.
CallableStatement call = mConnection.getCallableStatement("{call
spInsertWebFile (?,?,?,?,?,?,?,?,?,?)}");
call.setInt(index++, this.SiteNumber);
call.setInt(index++, this.SiteRevision);
call.setString(index++, sf.getDestinationFile());
call.setDate(index++, new java.sql.Date(f.lastModified()));
call.setLong(index++, f.length());
call.setString(index++, this.BatchRevisedBy);
call.setString(index++, mil.dla.dlis.wds.DateFormat.format(now));
call.setInt(index++, 0);
call.setBinaryStream(index++, (InputStream)new FileInputStream(f),
(int)f.length());
call.registerOutParameter(index, java.sql.Types.INTEGER);
call.execute();
I will say it uploads the file in about 10 seconds. Now when I
download I can't seem to find \such an efficient manner as this. I
have to use a loop to read some bytes from the OutputStream and then
write them to the FileInputStream. This method takes about 40 seconds.
byte[] input = new byte[blockSize];
int count=0;
int ret=0;
java.io.InputStream in = rs.getBinaryStream("file_data");
int size = rs.getInt("File_size");
String fullpath = path;
int off=0;
if (! System.getProperty("os.name").equalsIgnoreCase("wi ndows"))
fullpath = fullpath.replace('\\','/');
java.io.File f = new java.io.File(fullpath);
if (f.exists()) f.delete();
java.io.FileOutputStream out = new
java.io.FileOutputStream(fullpath);
while (size > 0)
{
count++;
if (size < blockSize)
input = new byte[size];
ret = in.read(input);
out.write(input);
size -= ret;
}
out.close();
Is there a more efficient way? I have tied just reading the whole file
into a byte array but as you can imagine that uses a lot of memory. I
have also tried different block sizes like 128k, 256k and the default
of 64k.
thanks,
Tyson
|