问题:
使用BufferedReader和BufferedWriter从一个地方读取到另一个地方后,无法打开,并且图片大小比原来的图片要大。
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(new FileInputStream(new File("C:\\Users\\acer\\Desktop\\loginbg.jpg"))));
String string = "";
String len = "";
while ((len = bufferedReader.readLine()) != null) {
string += len;
}
BufferedWriter bufferedWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File("C:\\Users\\acer\\Desktop\\a\\mzd.jpg")), "utf-8"));
bufferedWriter.write(string);
bufferedReader.close();
bufferedWriter.flush();
bufferedWriter.close();
发现:
随后使用了FileInputStream和FileOutputStream读取图片,发现图片可以打开了。
FileInputStream inputStream = new FileInputStream(new File("C:\\Users\\acer\\Desktop\\loginbg.jpg"));
OutputStream outputStream = new FileOutputStream(newFile("C:\\Users\\acer\\Desktop\\a\\mzd.jpg"));
int len = 0;
//byte[] bytes = new byte[inputStream .available()];
byte[] bytes = new byte[1024];
while ((len = inputStream.read(bytes)) != -1) {
outputStream.write(bytes);
outputStream.flush();
}
outputStream.close();
inputStream.close();
分析:
我猜想可能的原因:(可能不对,仅供参考!!!)
1、FileInputStream 到BufferedReader 之间可以设置编码,有可能是编码的改变,是图片无法打开。
2、bufferedReader.readLine()方法读取了多余的空白字符,使得写出的图片中的字符变多,从而导致图片无
法打开,因为读完后图片确实变大了。
3、string += len中字符串拼接出错。
总结:
一、字符流是官方对字节流的一种封装,一种简化,其目的为了令开发者更加好的读取文本。
二、FileOutputStream和FileInputStream :
1、属于字节流。
2、能设置是否覆盖原来的内容,true表示不覆盖,接着写;false表示覆盖,重写
三、OutputStreamWriter和InputStreamReader:
1、属于字符流。
2、能设置文件读写编码。
四、BufferedWriter 和BufferedReader:
1、属于字符流
2、提供缓存区,效率高,读满缓冲区返回
五、bufferedReader.readLine():
1、如果不指定buffer大小,则readLine()使用的buffer有8192个字符。
2、在达到buffer大小之前,只要是在换行符前的,全部都读取,包括空的字符。(这里可以看一下readLine的源码)
3、readLine方法在遇到终止符、数据流发生异常或者另一端被close()掉时,才会返回null值。
4、如果读不到换行符,尤其是socket编程中,readLine阻塞将变成家常便饭。
六、byte[] bytes = new byte[1024]
byte[] bytes = new byte[1024]表示1M大小的字节数组,但是如果图片的大小超过1M的话,也许就是执行两个或者多
个while,也许读取的图片也无法打开(个人猜想)。我建议使用byte[] bytes = new byte[inputStream .available()],
其中的inputStream .available()表示图片有多大就定义多大的字节数组,这样既能节约内存,又能保证图片正确读出,
但是存在的隐患就是图片太大,造成内存溢出的现象。
七、用字符流读取图片是一种自己给自己挖坑然后跳进去再想办法跳出来的行为。