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