对Java数据流的操作

类似这样的代码:

InputStream inputStream = null;
try {
    inputStream  =file.getInputStream();
    byte[] bs = new byte[inputStream.available()];
    inputStream.read(bs);
    File files = new File("a.log");

    OutputStream outputStream = new FileOutputStream(files);
    outputStream.write(bs);
    outputStream.close();

肯定是能工作的。但是,把输入流全部读入内存再写入文件流的做法,是不好的。如果是单机程序或者是随手写的小应用问题不大。在服务器端,用于对上传文件的处理,则会造成内存的较大抖动。对内存的时候完全依赖用户上传文件的大小。

应该通过缓存,把上传文件消耗的内存大小锁定在固定值,这样内存是平稳的,可能会随着用户并发数的增加而扩大,但是不会因为个把大文件而造成内存的陡涨。

写了个示例:

package com.easymorse.inputstream;

import java.io.FileOutputStream;
import java.io.InputStream;

public class InputStreamDemo {

    /**
     * @param args
     * @throws Exception
     */
    public static void main(String[] args) throws Exception {
        InputStream inputStream = InputStreamDemo.class
                .getResourceAsStream("p.png");// 模拟得到一个输入流
        int bufferSize = 1024;//缓存大小
        byte[] data = new byte[bufferSize];
        FileOutputStream outputStream = new FileOutputStream("cp.png");
        for (int i = inputStream.read(data); i > 0; i = inputStream.read(data)) {
            outputStream.write(data, 0, i);
        }
        outputStream.close();
        inputStream.close();
    }

}

 

源代码见:

http://easymorse.googlecode.com/svn/trunk/inputstream.demo/

PDF    发送文章为PDF   

这篇文章上的评论的 RSS feed TrackBack URI

Leave a Reply