Запись в один и тот же файл из разных классов в Java

#java #file #bufferedwriter

#java #файл #bufferedwriter

Вопрос:

Как мне записать в один и тот же текстовый файл из разных классов в Java. Один из методов вызова класса из другого класса.

Я не хочу открывать BufferedWriter в каждом классе, поэтому думаю, есть ли более чистый способ сделать это?

По сути, я хочу избежать написания следующего кода в каждом классе

 Path path = Paths.get("c:/output.txt");

try (BufferedWriter writer = Files.newBufferedWriter(path)) {
   writer.write("Hello World !!");
}
  

Комментарии:

1.одноэлементный служебный класс с методами openFile write close

2. Вы можете абстрагировать этот код выше.

3. У вас есть два варианта. 1. напишите в классе, а затем закройте все потоки и напишите в другом классе или 2. создайте один класс, который обеспечит запись в этот файл для вас

4. кроме того, вы можете сделать класс и переменную статическими

5. Большое всем спасибо. 2-й вариант — создать один класс, который будет записывать в файл .. звучит неплохо. Разве нет 3-го варианта? Есть какой-нибудь пример кода / утилиты для варианта 2nd?

Ответ №1:

Хороший способ сделать это — создать центральный класс записи, который отображает имя файла в объект чтения / записи. Например:

 public class FileHandler {
    private static final Map<String, FileHandler> m_handlers = new HashMap<>();

    private final String m_path;

    private final BufferedWriter m_writer;
    // private final BufferedReader m_reader; this one is optional, and I did not instantiate in this example.

    public FileHandler (String path) {
        m_path = path;
        try {
            m_writer = Files.newBufferedWriter(path);
        } catch (Exception e) {
            m_writer = null;
            // some exception handling here...
        }            
    }

    public void write(String toWrite) {
        if (m_writer != null) {
            try {
                m_writer.write(toWrite);
            } catch (IOException e) {
                // some more exception handling...
            }
        }
    }

    public static synchronized void write(String path, String toWrite) {
        FileHandler handler = m_handlers.get(path);
        if (handler == null) {
            handler = new FileHandler(path);
            m_handlers.put(path, toWrite);
        }

        handler.write(toWrite);
    }
}
  

Имейте в виду, что такое поведение ни в коем случае не закрывает средства записи файлов, потому что вы не знаете, кто еще в данный момент (или позже) пишет. Это не полное решение, а просто сильный намек на хорошее направление.

Это круто, потому что теперь вы можете «всегда» вызывать FileHandler.write("c:output.txt", "Hello something!?$"); . Класс FileHandler может быть расширен (как указано) для чтения файлов, а также для выполнения других функций, которые могут понадобиться вам позже (например, буферизация содержимого, чтобы вам не приходилось читать файл каждый раз, когда вы обращаетесь к нему).