簡體   English   中英

在Java中抑制運行時控制台警告的最佳方法是什么?

[英]What's the best way to suppress a runtime console warning in Java?

我正在使用org.apache.commons.httpclient.methods.PostMethod類的getResponseBody()方法。 但是,我總是在運行時收到一條寫入控制台的消息:

警告:要緩沖大型或未知大小的響應體。 建議使用getResponseBodyAsStream。

在代碼中我必須將響應寫入一個字節數組,所以它應該是我應該使用的getResponseBody()方法。 但是有一種簡單的方法可以抑制警告信息,所以我不必每次都看它嗎?

如果是編譯器錯誤,我會使用@SuppressWarnings注釋,但這不是編譯時問題; 它發生在運行時。 此外,我可以使用getResponseBodyAsStream來寫入ByteArrayOutputStream,但這似乎是一種解決警告的方法(額外的代碼行來執行getResponseBody()已經為我做的事情)。

我的猜測是答案涉及System.out或System.err操作,但是有一個很好的方法嗎?

如果要干凈地停止此日志條目,則會有一個可調整的最大值來觸發警告。 我看到這個看代碼

        int limit = getParams().getIntParameter(HttpMethodParams.BUFFER_WARN_TRIGGER_LIMIT, 1024*1024);
        if ((contentLength == -1) || (contentLength > limit)) {
            LOG.warn("Going to buffer response body of large or unknown size. "
                    +"Using getResponseBodyAsStream instead is recommended.");
        }

HttpMethodBase.setParams()看起來像是將HttpMethodParams.BUFFER_WARN_TRIGGER_LIMIT設置為所需值的位置。

當httpClient不知道返回數據的長度時,應該在服務器端設置content-length屬性時發出警告

response.addHeader("Content-Type", "text/html; charset=utf-8");
response.addHeader("Content-Length", String.valueOf(output.getBytes("utf8").length));

在那之后,那個警告應該消失

我建議你按照警告的建議做,並使用流而不是字節數組。 如果您嘗試推送的響應特別大(假設它是一個大文件),您將把它全部加載到內存中,這將是一件非常糟糕的事情。

你最好不要使用流。

也就是說,你可以通過暫時替換System.err或System.out來破解它。 它們只是PrintStream對象,可以使用setOut和setErr方法進行設置。

PrintStream oldErr = System.err;
PrintStream newErr = new PrintStream(new ByteArrayOutputStream());
System.setErr(newErr);

// do your work

System.setErr(oldErr);

編輯:

我同意最好使用流,但就像現在一樣,我需要放置響應的目標API是一個字節數組。 如有必要,我們可以對API進行重構,以便它可以獲取流; 那會更好。 警告肯定是有原因的。

如果您可以修改API,請執行此操作。 在這種情況下,流處理是最好的方法。 如果你不能因內部壓力或其他原因,去@John M的路線並抽出BUFFER_WARN_TRIGGER_LIMIT - 但要確保你有一個已知的contentLength,甚至那條路線也會失敗。

庫是通過log4j輸出的嗎? 如果是這樣,編輯log4j.properties以將此類的輸出設置為“ERROR”將起作用,例如

log4j.logger.org.apache.commons.httpclient.methods.PostMethod=ERROR

這個問題已經在ASF JIRA上進行過辯論 有兩種方法可以解決這個問題:

  • BUFFER_WARN_TRIGGER_LIMIT設置更高的值。 足夠高的值更有可能抑制警告; 然而,這違背了警告本身的目的。 如果要緩存大量數據以便最終在一次傳遞中進行解析,則最好在處理數組之前將數據從流讀取到數組中。
  • 如果您對ERROR或FATAL感到滿意,請將HttpClient的日志記錄級別設置為更高的值。

簡單地“保存”stderr消息,然后在完成主任務后打印它們

PrintStream origErr = System.err;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PrintStream newErr = new PrintStream(baos);
System.setErr(newErr);

====== do stuff ======

System.setErr(origErr);
System.err.print(baos);

假設警告寫入stderr,您可以始終通過將stderr傳遞給/dev/null或系統中的等效項來禁止警告。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM