请教一个Java IO方面的问题
说明:第一次做这样的东西,对Java IO理解也不太深,遇到大问题了,特地发帖请教大牛!
问题描述:
用户上传一个图片文件,我这边用request.getInputStream() 得到图片内容,用 FileOutputStream写到文件里成功
我直接把这个流给一个资源类,让其将内容转换成byte[]数组,使用的方式是bufferedInputStream 的read()方法,一个一个读,读到一个StringBuilder容器里,然后直接getbytes()
下一步 存到数据库,就把那个byte[]数组写道数据库里,查看是一连串数字
解析:
从数据库中取出这个byte[]数组,然后用一个BufferedOutputStream写道文件里,并没有像我想象的那样可以在次转回来
我也知道这种方式不行,但我没有想到合适的方法,这里面是不是涉及到一个编码问题?图片文件传过来的时候是字符流,然后我把它转化成了字节流,在数据库看到的是数字,但是先前传过来的时候是字符,我用记事本打开那文件也是字符,现在打开是数字了
还有一个问题是解析的时候,竟然报找不到文件的错误,File类不是如果文件不存在的话就会自动创建吗?现在我必须先创建这个空文件,才能把数据写到这里面
从数据大小来看,现在转换之后比原先大很多了
有点乱,不知道描述清楚了没有,毕业设计呀,请教大牛~~~
------解决方案-------------------- 一般将大文件存放到数据库中是不推荐的.你可以将
文件路径 存放到数据库中.
文件放在指定的系统文件夹中 .
还有,每个数据库的默认字符集不同,转换的时候首先设置一个数据库的字符集和IDE(开发工具)的字符集相同.
------解决方案-------------------- 图片文件传输要以字节流才可以的吧
------解决方案-------------------- 找不到文件,十之八九是路径问题。LZ可以打印下你的文件路径,看看是不是对的。
------解决方案-------------------- 二进制转换成文本肯定是不行的,你这样的话 byte[] b = new byte[in.available()]; in.read(b); 不过把所有内容读内存中不推荐。
PreparedStatement.setBlob(int, InputStream) 方法可以直接传个InputStream进去
------解决方案-------------------- 我直接把这个流给一个资源类,让其将内容转换成byte[]数组,使用的方式是bufferedInputStream 的read()方法,一个一个读,读到一个StringBuilder容器里,然后直接getbytes()
问题出在这里,不能用getbytes[]获得字节数组,。
假如 文件中有这样一段字节 [ 65,66,67], 放到StringBuilder中就变成 656667 这样一个字符串了, 然后getbytes[] 又会将 656667中每一个字符转成对应的字节,就变成 [54, 53, 54, 54, 54, 55] 这样的字节数组了
和文件中的字节数据差了一个筋斗了
------解决方案-------------------- 一段演示代码,仅供参考
import java.util.Arrays;
public class Test {
public static void main(String[] args) {
byte[] b = {65,66,67};
StringBuilder sb = new StringBuilder();
System.out.println("原来字节数组:"+Arrays.toString(b));
for (int i = 0; i < b.length; i++) {
sb.append(b[i]);
}
System.out.println("append到StringBuilder中的字符串:"+sb.toString());
System.out.println("新的字节数组:"+Arrays.toString(sb.toString().getBytes()));
}
} ------解决方案-------------------- 引用: 二进制转换成文本肯定是不行的,你这样的话 byte[] b = new byte[in.available()]; in.read(b); 不过把所有内容读内存中不推荐。
PreparedStatement.setBlob(int, InputStream) 方法可以直接传个InputStream进去
二进制转换成文本肯定是不行的 +1
但是这里给出的建议……
尽量不要依赖 in.available()
不过这里的思路是对的。
如果读之前不确定byte[]会有多大,可以使用 ByteArrayOutputStream,具体用法去查API,很简单。