Запись в тот же файл из разных классов в Java - PullRequest
0 голосов
/ 24 апреля 2019

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

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

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

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

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

1 Ответ

1 голос
/ 24 апреля 2019

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

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 может быть расширен (как подсказка), чтобы также читать файлы и делать для вас другие вещи, которые вам могут понадобиться позже (например, буферизовать содержимое, чтобы вам не приходилось читать файл каждый раз, когда вы к нему обращаетесь) .

...