2016-12-03 4 views
1

Есть ли способ, которым я могу получить файл, который он записывает в случае FileWirter. У меня нет ссылки на объект File со мной.Получить файл, написанный FileWriter в Java

public class JobResponseWriter extends FileWriter{ 
    public JobResponseWriter(Job job) throws IOException { 
     super(File.createTempFile("JobResponse" + job.getId() ,"tmp")); 
    } 

    public void writeLn(String str) throws IOException { 
     super.write(str + "\n"); 
    } 
} 

Как получить файл, созданный в этом случае. Я получаю доступ к файлу только после закрытия записи. Но я не хочу сохранять отдельный список всего созданного файла. Каков наилучший способ.

+0

Нужно ли использовать супер-конструктор для создания временного файла? –

+0

Мне нужно, чтобы JobResponseWriter вел себя как FileWriter, если у вас есть другой способ .., чтобы сообщить мне – Ysak

+0

Это стандартная проблема «Композиция над наследованием». Вы должны создать переменную члена 'File' и« имитировать »класс Filewriter вместо прямого его расширения. –

ответ

2

Вам просто нужно сохранить ссылку на Файл:

public class JobResponseWriter extends FileWriter{ 
    private final File myFile; 
    public JobResponseWriter(Job job) throws IOException { 
     this(File.createTempFile("JobResponse" + job.getId() ,"tmp")); 
    } 
    public JobResponseWriter(File f) throws IOException { 
     super(f); 
     myFile = f; 
    } 
    /* your code here */ 
} 
+0

А, да. Не думал об этом –

+0

Это то, что именно я реализовал .. Базовую логику создания файлов я вынул ... – Ysak

1

Поскольку вы не можете получить файл до супер вызова

Initialize field before super constructor runs?

Вы могли бы попробовать что-то вроде этого

public class JobResponseWriter { 

    private final File f; 
    private final fw; 

    public JobResponseWriter(Job job) throws IOException { 
     this.f = File.createTempFile("JobResponse" + job.getId() ,"tmp")); 
     this.fw = new FileWriter(f); 
    } 

    public void writeLn(String str) throws IOException { 
     fw.write(str + "\n"); 
    } 

    // public void getFile() 
} 

Вы можете реализовать эти интерфейсы, если вы хотите в полной мере функциональность объекта, подобного файловому объекту

Closeable, Flushable, Appendable, AutoCloseable

-1

Согласно official document, нет способа извлечь объект File. И это также невозможно с FileWriter. Однако, видя problm с другой точки зрения, вы можете придумать, как это (Предполагая Job ваш класс можно расширить с Job, если это не так.):

public class JobResponseWriter extends FileWriter{ 
    File jobResponse = null; 
    public FileWriter getJobResponseWriter() { 
     if(jobResponse == null) 
      jobResponse = File.createTempFile("JobResponse" + getId() ,"tmp")); 
     return new FileWriter(jobResponse, true); //Open in append mode 
    } 

    public File getJobResponseFile() { 
     if(jobResponse == null) 
      jobResponse = File.createTempFile("JobResponse" + getId() ,"tmp")); 
     return jobResponse; 
    } 

    //And the original methods here 
} 
+0

Ум ... Подождите. Я думаю, я смутился с C++. Пожалуй, не так, но внутри метода ''. Я вернусь после проверки. – minary

+0

Это решение невозможно в Java – Ysak

+0

@Ysak Итак, я редактировал код. Я видел проблему с другой точки зрения. И это определенно должно сработать. – minary

Смежные вопросы