ITPub博客

首页 > Linux操作系统 > Linux操作系统 > java中write(byte[] b)与write(byte[] b,int off,int len)区别

java中write(byte[] b)与write(byte[] b,int off,int len)区别

原创 Linux操作系统 作者:lirig 时间:2009-09-06 20:52:17 0 删除 编辑
在项目中要做图片上传功能,由于用了struts2 文件上传方便了很多,在actoin中增加如下方法就可以了:
private static final int BUFFER_SIZE = 16 * 1024;
private static void copy(File src, File dst) {
        try {
            InputStream in = null;
            OutputStream ut = null;
            try {
                in = new BufferedInputStream(new FileInputStream(src), BUFFER_SIZE);
                ut = new BufferedOutputStream(new FileOutputStream(dst), BUFFER_SIZE);
                byte[] buffer = new byte[BUFFER_SIZE];
                while (in.read(buffer) > 0) {
                    out.write(buffer);
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                if (null != in) {
                    in.close();
                }
                if (null != out) {
                    out.close();
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

文件上传很简单就实现了,可是突然我发现上传的文件都比原来大十几K.由于系统用户量很大,如果有一百万张,那占的空间可非常大了,查看jdk文档,其中在BufferedOutputStream文档中有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) 方法,不过该方法不会影响文件.当我用MagickImage处理一把,文件就恢复原样了.
       心想技术真要求精益求精,多思考,才能多领会.

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/10594357/viewspace-614058/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: linux 下修复 grub
请登录后发表评论 登录
全部评论

注册时间:2009-08-31

  • 博文量
    9
  • 访问量
    16628