001 /* 002 * Copyright (C) 2007 Google Inc. 003 * 004 * Licensed under the Apache License, Version 2.0 (the "License"); 005 * you may not use this file except in compliance with the License. 006 * You may obtain a copy of the License at 007 * 008 * http://www.apache.org/licenses/LICENSE-2.0 009 * 010 * Unless required by applicable law or agreed to in writing, software 011 * distributed under the License is distributed on an "AS IS" BASIS, 012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 013 * See the License for the specific language governing permissions and 014 * limitations under the License. 015 */ 016 017 package com.google.common.io; 018 019 import com.google.common.annotations.Beta; 020 021 import java.io.Flushable; 022 import java.io.IOException; 023 import java.util.logging.Level; 024 import java.util.logging.Logger; 025 026 /** 027 * Utility methods for working with {@link Flushable} objects. 028 * 029 * @author Michael Lancaster 030 * @since 1 031 */ 032 @Beta 033 public final class Flushables { 034 private static final Logger logger 035 = Logger.getLogger(Flushables.class.getName()); 036 037 private Flushables() {} 038 039 /** 040 * Flush a {@link Flushable}, with control over whether an 041 * {@code IOException} may be thrown. 042 * 043 * <p>If {@code swallowIOException} is true, then we don't rethrow 044 * {@code IOException}, but merely log it. 045 * 046 * @param flushable the {@code Flushable} object to be flushed. 047 * @param swallowIOException if true, don't propagate IO exceptions 048 * thrown by the {@code flush} method 049 * @throws IOException if {@code swallowIOException} is false and 050 * {@link Flushable#flush} throws an {@code IOException}. 051 * @see Closeables#close 052 */ 053 public static void flush(Flushable flushable, boolean swallowIOException) 054 throws IOException { 055 try { 056 flushable.flush(); 057 } catch (IOException e) { 058 logger.log(Level.WARNING, 059 "IOException thrown while flushing Flushable.", e); 060 if (!swallowIOException) { 061 throw e; 062 } 063 } 064 } 065 066 /** 067 * Equivalent to calling {@code flush(flushable, true)}, but with no 068 * {@code IOException} in the signature. 069 * 070 * @param flushable the {@code Flushable} object to be flushed. 071 */ 072 public static void flushQuietly(Flushable flushable) { 073 try { 074 flush(flushable, true); 075 } catch (IOException e) { 076 logger.log(Level.SEVERE, "IOException should not have been thrown.", e); 077 } 078 } 079 }