방금 Java 파일 시스템 API를 사용하여 이진 파일을 복사하는 데 사용되는 다음 기능을 사용했습니다. 원래 소스는 웹에서 왔지만 try/catch/finally 절을 추가하여 기능이 끝나기 전에 버퍼 스트림이 닫히고 (따라서 OS 리 소스가 해제 됨) 문제가 발생하면이를 해제해야합니다.RAII in Java ... 자원 처분은 항상 너무 못생긴가요?
public static void copyFile(FileOutputStream oDStream, FileInputStream oSStream) throw etc...
{
BufferedInputStream oSBuffer = new BufferedInputStream(oSStream, 4096);
BufferedOutputStream oDBuffer = new BufferedOutputStream(oDStream, 4096);
try
{
try
{
int c;
while((c = oSBuffer.read()) != -1) // could throw a IOException
{
oDBuffer.write(c); // could throw a IOException
}
}
finally
{
oDBuffer.close(); // could throw a IOException
}
}
finally
{
oSBuffer.close(); // could throw a IOException
}
}
지금까지 내가 그것을 이해
, 나는 다음의 첫 번째 close()
잘 던질 수 있기 때문에 마지막 절에서 두 close()
을 넣어 수 없습니다
나는 패턴을 표시하는 기능을 손질 두 번째는 실행되지 않습니다.
저는 C#이 을 가지고 있음을 알고 있습니다. using
키워드로이 패턴을 처리했던 패턴을 처리했습니다.
void copyFile(FileOutputStream & oDStream, FileInputStream & oSStream)
{
BufferedInputStream oSBuffer(oSStream, 4096);
BufferedOutputStream oDBuffer(oDStream, 4096);
int c;
while((c = oSBuffer.read()) != -1) // could throw a IOException
{
oDBuffer.write(c); // could throw a IOException
}
// I don't care about resources, as RAII handle them for me
}
내가 모르는 뭔가가, 나 정말 자바 추하고 비 대한 코드를 생성해야합니까 오전 :
은 난 (자바와 같은 API를 사용하여) 같은 더 나은 C++ 코드를했을 뭔가를 알고 단지 버퍼 된 스트림의 close()
메서드에서 예외를 처리하기 위해?
편집을 (... 어디 선가 틀렸다 알려주세요) : 그것은 나인가, 또는이 페이지를 업데이트 할 때, 나는 모두 질문을보고 모든 해답은 하나의 점으로 감소 몇 분 동안? 익명을 유지하면서 누군가 자신을 너무 즐기고 있습니까?
는 편집 2 : http://illegalargumentexception.blogspot.com/2008/10/java-how-not-to-make-mess-of-stream.html
편집 : 3 : 맥도웰의 링크를, 내가 유사한 패턴의 자바 7에 대한 제안에 하락 맥도웰 내가 여기에 언급했다 느꼈다 매우 흥미로운 링크를 제공 C#을 사용하여 패턴 : http://tech.puredanger.com/java7/#resourceblock. 내 문제가 명시 적으로 설명됩니다. 분명히 Java 7 do
을 사용해도 문제가 남아 있습니다.
나의 잘못된 답변입니다. Java에서 RAII를 수행하는 방법을 실제로 파악하고 있는지 또는 단순히 Java에서 입력 스트림의 데이터를 출력 스트림으로 복사하는 방법을 알지 못했습니다. – Alexander
문제 없음 ... 사실, 나는 깨끗하고 효율적인 복사본을 만드는 방법을 모르고있다 ... :-p ... – paercebal
첫 번째 목록에는 8 줄, 두 번째 줄에는 2 줄의 코드를 저장할 수있다. Java 코드 규칙을 사용할지 여부를 나열합니다. 이 경우이 코드는 그렇게 추한 것은 아닙니다. – msangel