`
lirig
  • 浏览: 237473 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

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

    博客分类:
  • Jave
阅读更多

在项目中要做图片上传功能,由于用了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处理一把,文件就恢复原样了.

       技术真要求精益求精,多思考,才能多领会.

 

10
3
分享到:
评论
6 楼 sghcel 2010-08-12  
以前传EXE文件的时候就发现了这个问题
5 楼 java_xh 2010-03-29  
哈哈,这个问题以前用Java切电影的时候发现了!
4 楼 lanmaokyle 2010-03-26  
受教了,又学到了一招。
3 楼 yjs200811 2010-03-22  
传方便了很多,
2 楼 mycybyb 2010-03-22  
晕,这么简单的问题。不好好反思自己的错误,居然怪到sun的头上了
1 楼 flyer2010 2010-03-21  
呵呵,你以前跟我们讲过这个。 while ((len = in.read(buffer)) > 0){write(byte[] b,int off,int len) 代替 write(byte[] b).

我们大部分的时候只是在用,都没有去读文档,刨根问底的精神不够。 哈哈,要向你学习。

相关推荐

    Java中FileOutputStream流的write方法

    write(byte[] b, int off, int len)方法用于将指定字节数组b中从偏移量off开始的len个字节写入到文件输出流中。该方法可以指定写入的起始位置和长度,从而实现灵活的写入操作。 例如,在testMethod2()方法中,我们...

    Student.java

    java集合类的文件,//Student s = new Student(); s = null;... void write(byte[] b,int off,int len) 写出某个范围的字节道数组b中 b 数据写出的数组 off 第一个写出字节在b中的偏移量

    Java中的字节流.

    - `public void read(byte[] b, int off, int len) throws IOException`:从流中读取`len`个字节到数组`b`中,从索引`off`处开始存放。 - **其他常用方法**: - `public int available() throws IOException`:...

    JavaIO总结.pdf

    OutputStream的API包括write(int b)、write(byte[] b)和write(byte[] b, int off, int len)三个方法,用于将数据写入输出流。 字符流常常用于读取文本类型的数据或字符串流的操作等等。字符流的API有Reader和Writer...

    Java IO字符流和字节流

    - **`public void write(byte[] b, int off, int len)`**:向输出流写入字节数组b中从下标off开始的len个字节。 - **`public void flush()`**:刷新输出流,强制写出所有缓冲的输出字节。 ##### 3. 字符流 字符流...

    2018版 04747 Java语言程序设计(一)七八九十章知识点总结

    * void write( byte [ ] b ,int off , int len): 将数组 b[ ]中从下标 off 开始的 len 个字节写入数据流 * void close(): 当结束对输出流的操作时应该将其关闭 * void flush(): 刷新此输出流并强制写出所有缓冲的...

    大学课程讲义-Java基础-IO

    * InputStream(典型实现:FileInputStream):int read()、int read(byte[] b)、int read(byte[] b, int off, int len) * Reader(典型实现:FileReader):int read()、int read(char[] c)、int read(char[] c, ...

    java数据流 I/O系统

    输出数据流的基类是`OutputStream`,其主要方法包括`write(int i)`用于写入单个字节,`write(byte b[])`和`write(byte b[], int off, int len)`用于写入字节数组的部分或全部内容。同样,`close()`方法用于关闭流,`...

    java解决压缩中文乱码

    public void write(byte[] b, int off, int len) throws IOException { super.write(b, off, len); } } public class UTF8ZipInputStream extends ZipInputStream { public UTF8ZipInputStream(InputStream in)...

    _Java数据流.ppt

    `write(int b)` 写入一个字节,`write(byte[] b)` 写入整个数组,而 `write(byte[] b, int off, int len)` 可以指定写入部分数组。 除了基本的字节流,Java 还提供了许多派生类,如 `FileInputStream` 和 `...

    Java 将文件转为字节数组知识总结及实例详解

    在这个过程中,`write(byte[] b, int off, int len)`方法用于写入字节数组的一部分,其中`off`是数组起始位置,`len`是需要写入的字节数。我们使用循环读取文件,每次读取1024字节,直到文件末尾。 3. **注意点:...

    2021-2022年收藏的精品资料软件工程师浅谈Java的输入输出流技术步骤说明.docx

    如read(),read(byte[] b)和read(byte[] b, int off, int len),而OutputStream类则提供了写入字节的方法,如write(int b),write(byte[] b)和write(byte[] b, int off, int len)。这些方法为字节级别的数据传输提供...

    java字节与字符

    - `public void write(byte[] b, int off, int len) throws IOException`:写入字节数组的一部分。 ##### 2.2 示例代码 以下示例展示了如何使用`FileOutputStream`来输出数据: ```java import java.io.File; ...

    Java中的字节流文件读取教程(一)

    InputStream中还有其他几个方法,如read(byte b[])、read(byte b[], int off, int len)、skip(long n)、close()、mark(int readlimit)、reset()、markSupported()等。这些方法都是用于读取文件的字节流, skip方法...

    IO流与异常

    - `public int read(byte[] b, int off, int len) throws IOException`:从输入流中读取一系列字节到字节数组的一部分。 - **其他方法**: - `mark(int readlimit)`:在输入流中放置一个标记。 - `reset()`:将...

    Java基础学习28.pdf

    常见的方法包括read(),read(byte[] b),read(byte[] b, int off, int len)等。 3. 字符流的使用方法 - 字符输出流(Writer)用于将数据写入到输出设备中。常见的方法包括write(String), write(char[]), write(int...

    JAVA语言与编程第8章Java输入输出系统.ppt

    - `write(byte[] b, int off, int len)`:写入部分字节数组。 - `flush()`:清空缓冲区,确保所有字节都被写出。 - `close()`:关闭流,释放资源。 **8.2 过滤流** 过滤流(FilterStream)是建立在基础流之上的流...

    浅谈Java的输入输出流

    - `void write(byte[] b, int off, int len)` 2. **Reader** 和 **Writer** - `Reader` 和 `Writer` 是基于字符流的基础类,用于处理字符数据。 - `Reader` 类提供了三个基本的方法: - `int read()` - `int ...

    FilterOutputStream 源码分析

    在 FilterOutputStream 中,最重要的是 `write(int b)` 和 `write(byte[] b, int off, int len)` 方法。这两个方法分别用于写入单个字节和字节数组到输出流。它们的默认实现会将操作委托给被包装的输出流。开发者...

Global site tag (gtag.js) - Google Analytics