最后尝试关闭多个流
Trying to close multiple stream with finally
我有一个程序打开了3个数据流,但我不知道如何关闭它们,这里是程序的关闭部分。
finally {//cerrando muestras
try{
if(muestras!=null){
muestras.close();
}
}catch (IOException e) {
e.printStackTrace();
}finally {//cerrando salida
try{
if(salida!=null){
salida.close();
}
}catch (IOException e){
e.printStackTrace();
}
}
}
我想是因为我不能嵌套finally但我不知道任何其他方法,谢谢你的时间。
您应该使用 Java 7 中介绍的 try-with-resource 语句,而不是自行关闭流。考虑以下示例:
try (
BufferedReader br = new BufferedReader(new FileReader(file));
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(out))
) {
bufferedWriter.write(text);
} catch(IOException e) {
//log or propagate to the caller
}
观察如何不必手动关闭 BufferedReader
和 BufferedWriter
流。
如果您使用 java6 或更低版本,您可以使用 wrapper close()
。
public void closeStreams(Closeable c){
try{
c.close();
}
catch(IOException e){
}
finally{
// well noting here now..
}
}
你可以使用:
finally {//cerrando muestras
if(muestras!=null){
muestras.closeStreams();
}
if(salida!=null){
salida.closeStreams();
}
}
我通常最终会制作一个实用方法来做这类事情。
Stream muestras;
Stream salida;
...
finally {
closeAll( muestras, salida );
}
public class IoUtils
{
private IoUtils() {}
public static void closeAll( Closeable ... cls ) {
for( Closeable c : cls ) {
if( c != null ) try {
c.close();
} catch( IOException ex ) {
Logger.getLogger( IoUtils.class.getName() ).
log( Level.SEVERE, null, ex );
}
}
}
}
我有一个程序打开了3个数据流,但我不知道如何关闭它们,这里是程序的关闭部分。
finally {//cerrando muestras
try{
if(muestras!=null){
muestras.close();
}
}catch (IOException e) {
e.printStackTrace();
}finally {//cerrando salida
try{
if(salida!=null){
salida.close();
}
}catch (IOException e){
e.printStackTrace();
}
}
}
我想是因为我不能嵌套finally但我不知道任何其他方法,谢谢你的时间。
您应该使用 Java 7 中介绍的 try-with-resource 语句,而不是自行关闭流。考虑以下示例:
try (
BufferedReader br = new BufferedReader(new FileReader(file));
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter(out))
) {
bufferedWriter.write(text);
} catch(IOException e) {
//log or propagate to the caller
}
观察如何不必手动关闭 BufferedReader
和 BufferedWriter
流。
如果您使用 java6 或更低版本,您可以使用 wrapper close()
。
public void closeStreams(Closeable c){
try{
c.close();
}
catch(IOException e){
}
finally{
// well noting here now..
}
}
你可以使用:
finally {//cerrando muestras
if(muestras!=null){
muestras.closeStreams();
}
if(salida!=null){
salida.closeStreams();
}
}
我通常最终会制作一个实用方法来做这类事情。
Stream muestras;
Stream salida;
...
finally {
closeAll( muestras, salida );
}
public class IoUtils
{
private IoUtils() {}
public static void closeAll( Closeable ... cls ) {
for( Closeable c : cls ) {
if( c != null ) try {
c.close();
} catch( IOException ex ) {
Logger.getLogger( IoUtils.class.getName() ).
log( Level.SEVERE, null, ex );
}
}
}
}