限制PrintStream中写入的字节数

时间:2012-01-29 00:30:05

标签: java security

我正在运行一些不安全的代码,我已将stdoutstderr个流设置为FileStream包含在PrintStream中。 (必须重定向标准输出/错误。)

有没有办法配置那些重定向的FileStream s / PrintStream来设置写入的最大值为10 MB,例如,

while (true) System.out.write("lots of bytes");

不会将过多的数据写入服务器的磁盘。

代码 的时间限制是15秒,但我想在这里单独一名警卫。

2 个答案:

答案 0 :(得分:2)

一种方法是定义一个FilterOutputStream来包装文件流,它保留一个内部计数器,它在每个write递增,并在达到设定的阈值后开始投掷Exceptions或者只是忽略了写作。

有些事情:

import java.io.*;
class LimitOutputStream extends FilterOutputStream{

    private long limit;

    public LimitOutputStream(OutputStream out,long limit){
        super(out);
        this.limit = limit;
    }

    public void write(byte[]b) throws IOException{ 
        long left = Math.min(b.length,limit);
        if (left<=0)
            return;
        limit-=left;
        out.write(b, 0, (int)left);
    }

    public void write(int b) throws IOException{
        if (limit<=0)
            return;
        limit--;
        out.write(b);
    }

    public void write(byte[]b,int off, int len) throws IOException{
        long left = Math.min(len,limit);
        if (left<=0)
            return;
        limit-=left;
        out.write(b,off,(int)left);
    }  
}

答案 1 :(得分:1)

我有类似的任务,但从DB读取InputStreams并制作了一个小方法。 不想成为明显上尉,但它也可以用于像FileInputStream这样的inpustream:)


public static void writeBytes2File(InputStream is, String name,long limit) {
    byte buf[] = new byte[8192];
    int len = 0;
    long size = 0;
    FileOutputStream fos = null;
    try {
        fos = new FileOutputStream(name);  
        while ((len = is.read(buf)) != -1) {
            fos.write(buf, 0, len);
            size += len;
            if (size > limit*1024*1024) {
                System.out.println("The file size exceeded " + size + " Bytes ");
                break;
            }
        }   
        System.out.println("File written: " +name);
    }
catch (FileNotFoundException fnone) {
    fnone.printStackTrace();
    }
    catch (IOException ioe) {
    ioe.printStackTrace();
    }
    finally {
        try {
            if(is!=null){is.close();}
            if (fos != null) {fos.flush();fos.close();
            }       
        } catch (Exception e) {
    e.printStackTrace();
        }
    }        
}

希望有人觉得它很有用。