13

FileNotFoundException는, 모든 경우에 슬로우됩니다. 파일명이 무효 인 경우뿐만 아니라, e. 지. 권한은 파일을 만들거나 읽을 수 있도록 허용하지 않습니다 :java.io.FileNotFoundException의 원인을 검출한다

java.io.FileNotFoundException: \\server\share\directory\test.csv (Anmeldung fehlgeschlagen: unbekannter Benutzername oder falsches Kennwort) 
    at java.io.FileOutputStream.open(Native Method) 
    at java.io.FileOutputStream.<init>(FileOutputStream.java:179) 
    at java.io.FileOutputStream.<init>(FileOutputStream.java:131) 
    at java.io.FileWriter.<init>(FileWriter.java:73) 

위의 예는 독일의 Windows가 잘못된 사용자 이름이나 암호에 대해 불평을 보여줍니다.

에 약간 더 세분화 된 정보를 얻기 위해 예외 메시지를 구문 분석하지 않는 방법이 있습니까? 정확히 예외가 발생 했습니까? 메시지 구문 분석의 문제점은 다양한 로케일에서 메시지가 다양하다는 것입니다.

답변

10

FileOutputStream을 만들기 전에 파일 존재/읽기 - 쓰기 권한을 직접 확인하십시오.

File test_csv = new File("\\server\share\directory\test.csv"); 

if (test_csv.exists() && test_csv.canWrite()) 
{ 
    // Create file writer 
    ... 
} 
else 
{ 
    // notify user 
    ... 
} 

새 파일을 만들어야 할 경우 대상 파일의 읽기/쓰기 권한을 확인해야하는 경우가 있습니다.

File test_csv = new File("\\server\share\directory\test.csv"); 
File parent_dir = test_csv.getParentFile() 

if (parent_dir.exists() && parent_dir.canWrite()) 
{ 
    // Create file writer 
    ... 
} 
else 
{ 
    // notify user 
    ... 
} 
+0

D' Oh! 때때로 인생은 쉬울 수 있습니다. 내 눈을 분명히 열어 주셔서 감사합니다. –

+1

조심하십시오. 이 메소드의 반환 결과에 영향을 줄 수있는 버그가있는 것 같습니다. 디렉토리가 사용자 정의 또는 시스템 디렉토리이거나 특정 유형의 네트워크 공유에있는 경우 잘못된 결과가 발생할 수 있습니다. –

+0

분명히 나는 ​​http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4939819에 의해 조금 이해가된다. Windows에서 사용자의 홈 디렉토리 (문서 및 설정 ...)가 쓰기 가능하지 않다는 것을 알려줄 것이다. 임시 해결책 : 상위 폴더에서 임시 파일을 작성하고 성공하면 즉시 삭제하십시오. IOException이 throw되면 실제로 작성할 수 없습니다. –

1

한 가지 방법은 실제 예외 유형을 살펴 보는 것입니다. docs에서 볼 수 있듯이 세밀한 정보를 제공하는 많은 하위 클래스가 있습니다.

그러나, 아마도 그렇게까지 멀지는 않을 것입니다. 대부분의 확인 된 예외와 마찬가지로 일반적으로 예외를 기록 /보고하고이를 수정하는 방법에 대한 선택을 사용자에게 요청하는 것이 좋습니다.

+0

문제는 일반적인 IOException이 아닌 FileNotFoundException입니다. "File Not Found"또는 "Generic Error"보다 나은 사용자 메시지를 표시하여 사용 권한 문제를 사용자에게 알려주고 싶습니다. –

+0

내 실수 - IOException을 읽습니다. 불행하게도 자바 예외는 POSIX 에러 코드와 같은 추가 정보를 거의 가지고 있지 않으며, 많은 경우 이름과 거의 관계가없는 조건을 커버하기 위해 확장되어있다. (때로는 예외 타입에 POSIX 코드를 할당하는 경우가있다. 게으름으로 인해). – kdgregory

2

파일을 읽기 전에 java.io.File 개체를 사용하여 파일의 속성을 볼 수 있습니다. 사용자가 파일을 읽을 수 있는지 여부를 결정하는 데 사용할 수있는 canRead 메소드가 있습니다.

관련 문제