001/* 002 * Copyright (C) 2007 The Guava Authors 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 017package com.google.common.io; 018 019import com.google.common.annotations.Beta; 020 021import java.io.Flushable; 022import java.io.IOException; 023import java.util.logging.Level; 024import java.util.logging.Logger; 025 026/** 027 * Utility methods for working with {@link Flushable} objects. 028 * 029 * @author Michael Lancaster 030 * @since 1.0 031 */ 032@Beta 033public 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 if (swallowIOException) { 059 logger.log(Level.WARNING, 060 "IOException thrown while flushing Flushable.", e); 061 } else { 062 throw e; 063 } 064 } 065 } 066 067 /** 068 * Equivalent to calling {@code flush(flushable, true)}, but with no 069 * {@code IOException} in the signature. 070 * 071 * @param flushable the {@code Flushable} object to be flushed. 072 */ 073 public static void flushQuietly(Flushable flushable) { 074 try { 075 flush(flushable, true); 076 } catch (IOException e) { 077 logger.log(Level.SEVERE, "IOException should not have been thrown.", e); 078 } 079 } 080}