📄 streamhandler.java
字号:
* platform encoding. However, java.io.OutputStreamWriter needs * another constructor for the default platform encoding, passing * null would throw an exception. */ if (encoding == null) writer = new OutputStreamWriter(out); else writer = new OutputStreamWriter(out, encoding); } } /** * Changes the output stream to which this handler publishes * logging records. * * @throws SecurityException if a security manager exists and * the caller is not granted the permission to control * the logging infrastructure. * * @throws NullPointerException if <code>out</code> * is <code>null</code>. */ protected void setOutputStream(OutputStream out) throws SecurityException { LogManager.getLogManager().checkAccess(); /* Throw a NullPointerException if out is null. */ out.getClass(); try { changeWriter(out, getEncoding()); } catch (UnsupportedEncodingException ex) { /* This seems quite unlikely to happen, unless the underlying * implementation of java.io.OutputStreamWriter changes its * mind (at runtime) about the set of supported character * encodings. */ throw new RuntimeException(ex.getMessage()); } } /** * Publishes a <code>LogRecord</code> to the associated output * stream, provided the record passes all tests for being loggable. * The <code>StreamHandler</code> will localize the message of the * log record and substitute any message parameters. * * <p>Most applications do not need to call this method directly. * Instead, they will use use a {@link Logger}, which will create * LogRecords and distribute them to registered handlers. * * <p>In case of an I/O failure, the <code>ErrorManager</code> * of this <code>Handler</code> will be informed, but the caller * of this method will not receive an exception. * * <p>If a log record is being published to a * <code>StreamHandler</code> that has been closed earlier, the Sun * J2SE 1.4 reference can be observed to silently ignore the * call. The GNU implementation, however, intentionally behaves * differently by informing the <code>ErrorManager</code> associated * with this <code>StreamHandler</code>. Since the condition * indicates a programming error, the programmer should be * informed. It also seems extremely unlikely that any application * would depend on the exact behavior in this rather obscure, * erroneous case -- especially since the API specification does not * prescribe what is supposed to happen. * * @param record the log event to be published. */ public void publish(LogRecord record) { String formattedMessage; if (!isLoggable(record)) return; if (streamState == STATE_FRESH) { try { writer.write(formatter.getHead(this)); } catch (java.io.IOException ex) { reportError(null, ex, ErrorManager.WRITE_FAILURE); return; } catch (Exception ex) { reportError(null, ex, ErrorManager.GENERIC_FAILURE); return; } streamState = STATE_PUBLISHED; } try { formattedMessage = formatter.format(record); } catch (Exception ex) { reportError(null, ex, ErrorManager.FORMAT_FAILURE); return; } try { writer.write(formattedMessage); } catch (Exception ex) { reportError(null, ex, ErrorManager.WRITE_FAILURE); } } /** * Checks whether or not a <code>LogRecord</code> would be logged * if it was passed to this <code>StreamHandler</code> for publication. * * <p>The <code>StreamHandler</code> implementation first checks * whether a writer is present and the handler's level is greater * than or equal to the severity level threshold. In a second step, * if a {@link Filter} has been installed, its {@link * Filter#isLoggable(LogRecord) isLoggable} method is * invoked. Subclasses of <code>StreamHandler</code> can override * this method to impose their own constraints. * * @param record the <code>LogRecord</code> to be checked. * * @return <code>true</code> if <code>record</code> would * be published by {@link #publish(LogRecord) publish}, * <code>false</code> if it would be discarded. * * @see #setLevel(Level) * @see #setFilter(Filter) * @see Filter#isLoggable(LogRecord) * * @throws NullPointerException if <code>record</code> is * <code>null</code>. */ public boolean isLoggable(LogRecord record) { return (writer != null) && super.isLoggable(record); } /** * Forces any data that may have been buffered to the underlying * output device. * * <p>In case of an I/O failure, the <code>ErrorManager</code> * of this <code>Handler</code> will be informed, but the caller * of this method will not receive an exception. * * <p>If a <code>StreamHandler</code> that has been closed earlier * is closed a second time, the Sun J2SE 1.4 reference can be * observed to silently ignore the call. The GNU implementation, * however, intentionally behaves differently by informing the * <code>ErrorManager</code> associated with this * <code>StreamHandler</code>. Since the condition indicates a * programming error, the programmer should be informed. It also * seems extremely unlikely that any application would depend on the * exact behavior in this rather obscure, erroneous case -- * especially since the API specification does not prescribe what is * supposed to happen. */ public void flush() { try { checkOpen(); if (writer != null) writer.flush(); } catch (Exception ex) { reportError(null, ex, ErrorManager.FLUSH_FAILURE); } } /** * Closes this <code>StreamHandler</code> after having forced any * data that may have been buffered to the underlying output * device. * * <p>As soon as <code>close</code> has been called, * a <code>Handler</code> should not be used anymore. Attempts * to publish log records, to flush buffers, or to modify the * <code>Handler</code> in any other way may throw runtime * exceptions after calling <code>close</code>.</p> * * <p>In case of an I/O failure, the <code>ErrorManager</code> * of this <code>Handler</code> will be informed, but the caller * of this method will not receive an exception.</p> * * <p>If a <code>StreamHandler</code> that has been closed earlier * is closed a second time, the Sun J2SE 1.4 reference can be * observed to silently ignore the call. The GNU implementation, * however, intentionally behaves differently by informing the * <code>ErrorManager</code> associated with this * <code>StreamHandler</code>. Since the condition indicates a * programming error, the programmer should be informed. It also * seems extremely unlikely that any application would depend on the * exact behavior in this rather obscure, erroneous case -- * especially since the API specification does not prescribe what is * supposed to happen. * * @throws SecurityException if a security manager exists and * the caller is not granted the permission to control * the logging infrastructure. */ public void close() throws SecurityException { LogManager.getLogManager().checkAccess(); try { /* Although flush also calls checkOpen, it catches * any exceptions and reports them to the ErrorManager * as flush failures. However, we want to report * a closed stream as a close failure, not as a * flush failure here. Therefore, we call checkOpen() * before flush(). */ checkOpen(); flush(); if (writer != null) { if (formatter != null) { /* Even if the StreamHandler has never published a record, * it emits head and tail upon closing. An earlier version * of the GNU Classpath implementation did not emitted * anything. However, this had caused XML log files to be * entirely empty instead of containing no log records. */ if (streamState == STATE_FRESH) writer.write(formatter.getHead(this)); if (streamState != STATE_CLOSED) writer.write(formatter.getTail(this)); } streamState = STATE_CLOSED; writer.close(); } } catch (Exception ex) { reportError(null, ex, ErrorManager.CLOSE_FAILURE); } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -