我正在运行一些不安全的代码,我已将stdout
和stderr
个流设置为FileStream
包含在PrintStream
中。 (必须重定向标准输出/错误。)
有没有办法配置那些重定向的FileStream
s / PrintStream
来设置写入的最大值为10 MB,例如,
while (true) System.out.write("lots of bytes");
不会将过多的数据写入服务器的磁盘。
代码 的时间限制是15秒,但我想在这里单独一名警卫。
答案 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();
}
}
}