[英]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上進行過辯論 。 有兩種方法可以解決這個問題:
簡單地“保存”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.