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