2012-01-29 6 views
0

私はstdoutstderrストリームをFileStreamのストリームをPrintStreamにラップするように設定した安全でないコードを実行しています。 (標準出力/エラーがリダイレクトされなければならない。)PrintStreamに書き込まれるバイト数の制限

10メガバイトが書き込ま言うの最大値を設定するものリダイレクトFileStream S/PrintStream Sを構成する方法があり、すなわち例えば、

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

そうサーバーのディスクに大量のデータを書き込むことはありません。

コードに15秒の制限がありますが、ここでは別のガードをご希望です。それを行うには

+0

'FileOutputStream'をサブクラス化しないでください。 (どのように安全でないコードの時間を制限していますか?) –

+0

@ TomHawtin-tackline 'FileOutputStream'をサブクラス化するのはどうですか? (私は@ Vladのソリューションを使用していますが...);私はちょうどBASHスクリプトを使用しています。 –

+0

誰かが来て、余計なメソッドを追加して、無効なコードを上書きすることができます。 (整数のオーバーフローも注意してください。) –

答えて

2

一つの方法は、あなたはそれがすべてのwriteにインクリメントし、設定されたしきい値に達した後、Exceptionsを投げ起動するか、単に書き込みを無視することを内部カウンタを保持でファイルストリームを、ラップFilterOutputStreamを定義することです。線に沿って

何か:

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から、入力ストリームを読み込み、小さな方法を作りました。 は明らかなキャプテンにしたくないが、それはあまりにもFileInputStreamのようなinpustreamsで使用することができます:)


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(); 
     } 
    }   
} 

は、誰かがそれが役に立つかもしれません願っています。

関連する問題