2013-03-09 2 views
3

Я пытаюсь написать функцию, которая возвращает поток ввода файла. Это выглядит примерно так:Как изящно обрабатывать FileNotFoundexception в java

public FileInputStream getFileInputStream() { 
    File file; 
    try { 
     file = new File("somepath"); 
    } catch (Exception e) { 
    } 
    FileInputStream fInputStream = new FileInputStream(file); 
    return fInputStream; 
} 

Так вот моя проблема - очевидно, что файл не создается в случае исключения. Но мне нужен файловый объект для создания экземпляра FileInputStream. Я как бы потерялся здесь, как я могу обработать исключение, сохраняя при этом действительный объект FileInputStream?

+0

Все, что подвержено исключительным поведением, должно быть завернуто в блок «try ... catch». Это уменьшит вашу проблему. – Makoto

+1

'new File (« somepath »)' никогда не будет генерировать исключение (хотя теоретически может возникнуть ошибка). Почему вы «попробуете»? – cheeken

+0

@cheeken прав - единственным исключением, которое может возникнуть при создании файла, было бы исключение NullPointerException, и это уменьшилось с помощью статической строки в качестве конструктора. – Makoto

ответ

10

Это идея дальнейшего исключения. Просто отбросьте исключение на вызывающего.

public FileInputStream getFileInputStream() throws FileNotFoundException 
{ 
    File file = new File("somepath"); 
    FileInputStream fInputStream = new FileInputStream(file); 
    return fInputStream; 
} 

Таким образом, вызывающий абонент должен его обработать. Это самый чистый способ работы с ним.

Примечание: Вы должны знать, что создание объекта File никогда не вызовет исключение. Это экземпляр FileInputStream, который может вызвать исключение.

+3

Я бы выбрал FileNotFoundException, так как нет необходимости расширять тип. –

+0

Я только что чему-то научился. Спасибо огромное! – Kai

4

Используйте File.exists(), он проверяет, что вы можете что-то сделать с файлом.

UPD (Java FileOutputStream Create File if not exists):

File yourFile = new File("score.txt"); 
if(!yourFile.exists()) { 
    yourFile.createNewFile(); 
} 
FileOutputStream oFile = new FileOutputStream(yourFile, false); 
+1

@ Макото Нет, это неправильно. –

+0

@ Макото: Это неправда. Файл создается, когда вы открываете выходной поток для него * или * вызывают 'File.createNewFile()'. –

+0

http://stackoverflow.com/questions/9620683/java-fileoutputstream-create-file-if-not-exists – Mikhail

0

Вот код, я использую. Вам это может показаться интересным.

public static final Charset UTF_8 = Charset.forName("UTF-8"); 

/** 
* Provide a normalised path name which can contain SimpleDateFormat syntax. 
* <p/> 
* e.g. 'directory/'yyyyMMdd would produce something like "directory/20130225" 
* 
* @param pathName to use. If it starts or ends with a single quote ' treat as a date format and use the current time 
* @return returns the normalise path. 
*/ 
public static String normalisePath(String pathName) { 
    if (pathName.startsWith("'") || pathName.endsWith("'")) 
     return new SimpleDateFormat(pathName).format(new Date()); 
    return pathName; 
} 

/** 
* Convert a path to a Stream. It looks first in local file system and then the class path. 
* This allows you to override local any file int he class path. 
* <p/> 
* If the name starts with an =, treat the string as the contents. Useful for unit tests 
* <p/> 
* If the name ends with .gz, treat the stream as compressed. 
* <p/> 
* Formats the name with normalisePath(String). 
* 
* @param name of path 
* @return as an InputStream 
* @throws IOException If the file was not found, or the GZIP Stream was corrupt. 
*/ 
public static InputStream asStream(String name) throws IOException { 
    String name2 = normalisePath(name); 
    // support in memory files for testing purposes 
    if (name2.startsWith("=")) 
     return new ByteArrayInputStream(name2.getBytes(UTF_8)); 
    InputStream in; 
    try { 
     in = new FileInputStream(name2); 
    } catch (FileNotFoundException e) { 
     in = Reflection.getCallerClass(3).getClassLoader().getResourceAsStream(name2); 
     if (in == null) 
      throw e; 
    } 
    if (name2.endsWith(".gz") || name2.endsWith(".GZ")) 
     in = new GZIPInputStream(in); 
    in = new BufferedInputStream(in); 
    return in; 
}