zoukankan      html  css  js  c++  java
  • java中write(byte[] b)与write(byte[] b,int off,int len)区别

    public static void copyInputStreamT0OutputStream(InputStream in, OutputStream out) {
    byte[] buffer = new byte[1024];
    if (null != in) {
    try {
          while (true) {
          int len = 0;
          if ((len = in.read(buffer)) == -1) {
                    out.flush();
                    return;
            }
           out.write(buffer, 0, len);

          out.write(buffer);
        }

      } catch (Exception e) {
           e.printStackTrace();
       }

      }

    }

       方法一:

          public int read(byte[] b)


    方法二:


    public int read(byte[] b ,int off,int len)
    这个方法是从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中

    如果文件大于1024字节,就一次读1024个字节,然后写出,写出后在读剩下的,依次循环输出,

    发现上传的文件,使用方法一总是比方法二大十几K

    查看jdk文档,文档中有write(byte[] b, int off, int len)和write(byte[] b).其中write(byte[ ] b,int off,int len)注释为:

           将指定 byte 数组中从偏移量off开始的len个字节写入此缓冲的输出流。一般来说,此方法将给定数组的字节存入此流的缓冲区中,根据需要将该缓冲区刷新,并转到底层输出流。但是,如果请求的长度至少与此流的缓冲区大小相同,则此方法将刷新该缓冲区并将各个字节直接写入底层输出流。因此多余的BufferedOutputStream将不必复制数据。

           果然我试了write(byte[ ] b,int off,int len)方法文件没有变大.查看源码.最后发现write(byte[ ]) 是调用了write(byte[] b,int off,int len),其中len总是数组的长度.

        问题就出在这里.在最后一次写入流时,len一般不会为读入字节的长度.除非文件大小刚好被BUFFER_SIZE整除.而通过 while ((len = in.read(buffer)) > 0){write(byte[] b,int off,int len) ,其中len为实际读入流的字节长度.所以这个方法不会增加文件大小,不会把多余的字节写进去.

           也不知道为什么sun在java中增加了write(byte[] b) 方法,不过该方法不会影响文件

    
    
    
  • 相关阅读:
    idea 管理java 多module的工程
    协程与函数线程异步的关系
    HDU 5640 King's Cake【模拟】
    逻辑运算
    Silverlight 学习笔记——布局 Evil 域 博客园
    ExtJS 日期格式问题
    偏方收藏(此信息为本人收藏,安全性无法验证,使用后产生的一些后果自负)
    form和column:extJS的布局
    Sqlserver 通用存储过程分页
    Ext中TreePanel控件和TabPanel控件搭配测试
  • 原文地址:https://www.cnblogs.com/renyuanwei/p/9208304.html
Copyright © 2011-2022 走看看