最近在研究文件上传到数据库的功能,我用的是内存流法,就是将二进制数据直接存储在数据库中但是我在读取的时候出现了问题,将数据读出并创建文件的时候,新创建的文件里只有类似 [B@84abc9 的数据,这个是为什么呢?我的文件大小为65,但是读取的时候只有9个字节,请求高人的指点,郁闷中...
你的代码写错了,贴出来看看吧
######老师,我把代码贴下边了...帮忙看看吧...谢谢你了######晕 再晕 还得晕 把文件保存到数据库中 ######
public static void main(String args[]) { byte a[] = null;// **将测试文件test.doc读入此字节数组 File file1 = new File("D:/test.txt"); File file2 = new File("D:/aa.txt");// 从blob读出的信息写入该文件,和源文件进行对比测试 PDMDataBase db = new PDMDataBase(); try { FileInputStream fin = new FileInputStream(file1); FileOutputStream fout = new FileOutputStream(file2); int flen = (int) file1.length();// 读入文件的字节长度 System.out.println("file length:" + flen); a = new byte[flen]; int i = 0; int itotal = 0; // 将文件读入字节数组 for (; itotal < flen; itotal = i + itotal) { i = fin.read(a, itotal, flen - itotal); } fin.close(); System.out.println("read itotal:" + itotal); String strSQL = null; // 初始化数据库的blob一定要用empty_blob()初始化 strSQL = "insert into UploadFiles(id,[content])" + "values('11',0)"; db.ExecuteSQL(strSQL); // 插入其它数据后,定位BLOB字段 strSQL = "select [content] from UploadFiles where id='11'"; ResultSet rs = db.ExecuteQuerySQL(strSQL); if (rs.next()) { Blob blob = rs.getBlob("content");// 得到blob字段 int j = blob.setBytes(1, a);// 将字节数组写入字段 strSQL = "update UploadFiles set content =(convert(varbinary(800),'" + a + "'))" + " where id='11'"; db.ExecuteSQL(strSQL); System.out.println("j:" + j); } System.out.println("insert into ok"); byte b[] = null;// 保存从blob读出的字节 strSQL = "select [content] from UploadFiles where id='11'"; rs = db.ExecuteQuerySQL(strSQL); if (rs.next()) { Blob blob2 = rs.getBlob("content"); System.out.println("blob2 length:" + blob2.length()); b = blob2.getBytes(1, flen);// 从blob取出字节流数据 System.out.println("b length:" + b.length); } // 将从blob读出的字节写入文件 fout.write(b, 0, b.length); fout.close(); System.out.println("write itotal:" + b.length); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } }
假设必须存在数据库中的话我会这么做:
最新读取生成文件部分的代码:(麻烦大家帮忙看看呀,也请红薯老师给看看呀,这个问题纠结好长时间了,不知道为什么就是没办法成功的写到文件中去,写进去的只有 [B@84abc9 这种东西)
String strSQL = "";
byte data[] = new byte[] {};
File file = null;
FileOutputStream fos = null;
InputStream in = null;
PDMDataBase db = new PDMDataBase();
ResultSet rs = null;
strSQL = "select * from UploadFiles where id ='10'";
rs = db.ExecuteQuerySQL(strSQL);
try {
while (rs.next()) {
file = new File("D:/" + rs.getString("filename"));
data = rs.getBytes("files");
if (!file.exists()) {
file.createNewFile();// 如果文件不存在,创建
}
fos = new FileOutputStream(file);
int size = 0;
if (data.length > 0) {
fos.write(data, 0, data.length);
System.out.println("********************");//输出正常
} else {
while ((size = in.read(data)) != -1) {
fos.write(data, 0, size);
}
in.close();
}
fos.close();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
######这段代码执行完之后写入文件中的仍然是图中那种效果,请大家帮帮忙啊,@红薯老师,帮忙给看一下吧。。。感激感激感激......######你存错了,不应该int j = blob.setbytes(1,a),这里不应该存a,而是将a里面的字节码转成字符串再保存,取出来再转回去成byte[]
######谢谢你的热心回答,你的回答中“而是将a里面的字节码转成字符串再保存,取出来再转回去成byte[]”我不是很明白,能说的具体点吗?如果能有代码示例就更好了。非常的感谢......######非常感谢各位的帮忙,我现在终于发现问题所在了,我做了一个测试,这个测试没有跟数据库关联,我先读取出文件,把我读取到的数据放到了byte[]数组中,然后,我直接进行的把读取数组然后读到文件中,这样是没有任何错误的,但是只要读取文件-->放到数据库--->读入文件,文件中就会读入一串这个[B@61de33
######不过还没有解决,还是希望大家能帮忙解决一下,谢谢######解决了,谢谢大家的帮助版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。