关于Java中FileOutputStream的一点细节问题

来源:互联网 发布:人工智能要从娃娃抓起 编辑:程序博客网 时间:2024/05/18 08:04

今日没有太多工作,闲暇之余随便看了一下Apache的Http请求,想更多的了解一下HttpClient的使用,结果出了一个让本人很费解的事情,我将请求的结果写入到本地的txt文件中,可结果重视比预期的多了很多内容,好像前面的一部分内容重复写了一遍。开始使用的是BufferedInputStream和BufferedOutputStream,以为是这两个不适合文本的读写,于是换成了FileInputStream和FileOutputStream,可结果还是一样,下面看一下有问题的代码:

HttpEntity httpEntity=response.getEntity();InputStream inputStream=httpEntity.getContent();BufferedInputStream bufferedInputStream=new BufferedInputStream(inputStream);BufferedOutputStream bufferedOutputStream=new BufferedOutputStream(new FileOutputStream("D://getUserList.txt"));int available=bufferedInputStream.available();byte[] buffer=new byte[1024*8];int read=bufferedInputStream.read(buffer);while(read!=-1){bufferedOutputStream.write(buffer);read=inputStream.read(buffer);}bufferedOutputStream.flush();bufferedOutputStream.close();bufferedInputStream.close();inputStream.close();

上面的bufferedOutputStream.write(buffer)这句是关键,他会将buffer中所有的内容都写入到txt文件中,之所以这样写,是因为开始我没有正确理解bufferedInputStream.read(buffer),我以为bufferedInputStream在将内容读入到buffer之前,会将buffer清空,但是事实不是这样的,看一下这个源码,read(buffer)最终调用的是下面的方法:

    public int read(byte b[], int off, int len) throws IOException {        if (b == null) {            throw new NullPointerException();        } else if (off < 0 || len < 0 || len > b.length - off) {            throw new IndexOutOfBoundsException();        } else if (len == 0) {            return 0;        }        int c = read();        if (c == -1) {            return -1;        }        b[off] = (byte)c;        int i = 1;        try {            for (; i < len ; i++) {                c = read();                if (c == -1) {                    break;                }                b[off + i] = (byte)c;            }        } catch (IOException ee) {        }        return i;    }

看这一句:

 b[off + i] = (byte)c;

原来他是从buffer的0开始写的,在写之前,buffer是有内容的,是上一次读取的内容,所以,最后在写入到txt文件时,会有上一次剩余的内容被写进去。最后发现,解决这个问题很简单,多传两个参数就OK了:
bufferedOutputStream.write(buffer,0,flag);
这个flag就是read(buffer)时返回的值,这个是本次读取内容的长度。

OK,很是舒服啊,哈哈,虽然很简单,但之前一直没有深入的理解,在网上也有很多工具类,直接拿来用,也没有仔细阅读,这是个很不好的习惯,不过我已经慢慢纠正这个了,不会再随便copy别人的代码了,因为这习惯很不好,很容易出错。

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 183页中文 yellow中文字幕最新域名 超超人人中文字免幕费中文字幕 绝对中学生超卡哇视频 一频道中文字幕无线观看 一道中文不卡视频 中国中文字幕无线观看局域网 学妹开庖处疼流泪小说下载 学妹开庖处疼流泪视频网站 学生的母亲字幕中文翻译视频 中文不卡视频在线播放复古 学妹开庖处疼流泪视频 视频g 学妹开庖处疼流泪t 学妹开庖处疼流泪图新闻 学妹开庖处疼流泪漫画小说 学妹开庖处疼流泪高清 学妹开庖处疼流泪网站 039 年轻的老师3中文字中幕中国人 学妹开庖处疼流泪t小说 学妹开庖处疼流泪视频 视频中国 学妹开庖处疼流泪音频 中文字字视频人人 学妹开庖处疼流泪小说txt 学妹开庖处疼流泪视频 手机 视频字幕中文翻译 五姑娘中文视频版 小护土叫得太完整视频中文 上了瘾中文版视频 按摩院里的中国姑娘电影 五姑娘视频网搜 架起乳白腿一深一浅 9老师啪国线自产 老师你的水又多又甜视频 91国偷自产短视频网站 在卫生间里就做的视频 家庭毋HH伦s线播放中文字版 视频精二区 中文字 美国式 柰忌轧伦中文 二十三又嫩水又多 家庭毋HH伦s中文字幕 毋HH伦中文字幕视频