Напишите и закройте BufferedWriter в одном фрагменте кода - PullRequest
0 голосов
/ 03 апреля 2019

Ниже приведен фрагмент кода.

Map<String, Object> globalMap = new HashMap<String,Object>();
File talendLogFile = new File("C:\\Softwares\\logFiles\\error.log");
Writer talendLogFileWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(talendLogFile, true)));

globalMap.put("Logger", talendLogFileWriter);

((BufferedWriter) globalMap.get("Logger")).write("I'm Writing");
((BufferedWriter) globalMap.get("Logger")).close();

Можно ли как-то выполнить обе функции, выполняемые в двух последних строках в одной строке кода?Я имею в виду закрыть BufferedWriter сразу после записи.

Ответы [ 5 ]

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

Помимо использования try-with-resources, реальный ответ таков: делайте , а не делайте так.

Видите ли, вы помещаете писателя в глобальную карту.Это делает его доступным для всего мира, который имеет доступ к этой карте.И затем, некоторый код намеревается закрыть писателя, которого вы добавили на эту карту.

Но, похоже, сам писатель остается на карте.Таким образом, другой код может заметить: карта имеет регистратор / записывающее устройство ... но как этот другой код должен знать, если этот регистратор / записывающее устройство все еще открыто или было закрыто?

Наличие регистратора / записывающего устройства вэта глобальная карта, но ее нельзя использовать глобально, это само по себе противоречие!

Другими словами: концептуально то, что вы делаете, кажется неправильным.Либо вы добавляете такой регистратор / записывающее устройство к глобальной карте, затем весь код, который имеет доступ к этой карте, должен иметь возможность использовать этот регистратор / записывающее устройство (не беспокоясь «он все еще открыт?»).Или вы не помещаете регистратор / средство записи в такую ​​глобальную карту.

0 голосов
/ 03 апреля 2019

Используйте попытку с ресурсами, которая автоматически закрывает ресурс без необходимости явного его закрытия.

0 голосов
/ 03 апреля 2019

Вы можете попробовать использовать try-catch with resources.Это означает, что ресурсы будут автоматически закрыты после выполнения try block.Вы можете прочитать больше здесь https://www.baeldung.com/java-try-with-resources

try(Writer talendLogFileWriter = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(talendLogFile, true)))) {

    globalMap.put("Logger", talendLogFileWriter);

    ((BufferedWriter) globalMap.get("Logger")).write("I'm Writing");

}catch(Exception ignored){} //handle the exception if you want
0 голосов
/ 03 апреля 2019

Самое близкое, что вы можете получить, это, но, как уже упоминалось многими другими, в этом нет необходимости.Это просто усложняет вещи:

try (BufferedWriter bw = (BufferedWriter) globalMap.get("Logger")) {
    bw.write("I'm Writing");
}
0 голосов
/ 03 апреля 2019

Тривиально, да:

((BufferedWriter) globalMap.get("Logger")).write("I'm Writing"); ((BufferedWriter) globalMap.get("Logger")).close();

Если вы имеете в виду использование одного вызова метода для выполнения обеих задач, если только вы не определили новый метод для этого.

...