Макросы расширяются во время компиляции. Закрытия строятся во время выполнения. С помощью макросов вы можете создавать высокоэффективные компиляторы встроенных доменных языков, а с помощью функций высокого порядка вы можете применять неэффективные интерпретаторы. Эти компиляторы eDSL могут выполнять всевозможные статические проверки, выполнять любые дорогостоящие оптимизации, которые вам нравятся, но когда у вас есть только время выполнения, вы ничего не можете сделать дорогостоящим.
И не стоит забывать, что макросы позволяют много более гибкий синтаксис (буквально, любой синтаксис ) для ваших eDSL и языковых расширений.
Подробнее см. ответы на этот вопрос: Коллекция отличных приложений и программ с использованием Макросы
Вы делаете это для регистрации? Если так, то для этого есть несколько библиотек . Двумя наиболее популярными являются Log4j и Logback .
Если вам просто нужно сделать это один раз, класс Files упрощает это:
try {
Files.write(Paths.get("myfile.txt"), "the text".getBytes(), StandardOpenOption.APPEND);
}catch (IOException e) {
//exception handling left as an exercise for the reader
}
Осторожно : Вышеупомянутый подход вызовет исключение NoSuchFileException
, если файл еще не существует. Он также не добавляет новую строку автоматически (что часто требуется при добавлении в текстовый файл). Ответ Стива Чемберса описывает, как это можно сделать с помощью класса Files
.
Однако, если вы будете писать в один и тот же файл много раз, приведенное выше должно открывать и закрывать файл на диске много раз, что является медленной операцией. В этом случае, буферизованный писатель лучше:
try(FileWriter fw = new FileWriter("myfile.txt", true);
BufferedWriter bw = new BufferedWriter(fw);
PrintWriter out = new PrintWriter(bw))
{
out.println("the text");
//more code
out.println("more text");
//more code
} catch (IOException e) {
//exception handling left as an exercise for the reader
}
Примечания:
FileWriter
скажет ему добавить в файл, а не записывать новый файл. (Если файл не существует, он будет создан.) BufferedWriter
рекомендуется для дорогостоящего средства записи (например, FileWriter
). PrintWriter
дает вам доступ к синтаксису println
, к которому вы, вероятно, привыкли, из System.out
. BufferedWriter
и Оболочки PrintWriter
не являются строго обязательными. try {
PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter("myfile.txt", true)));
out.println("the text");
out.close();
} catch (IOException e) {
//exception handling left as an exercise for the reader
}
Если вам нужна надежная обработка исключений для более старой версии Java, она становится очень подробной:
FileWriter fw = null;
BufferedWriter bw = null;
PrintWriter out = null;
try {
fw = new FileWriter("myfile.txt", true);
bw = new BufferedWriter(fw);
out = new PrintWriter(bw);
out.println("the text");
out.close();
} catch (IOException e) {
//exception handling left as an exercise for the reader
}
finally {
try {
if(out != null)
out.close();
} catch (IOException e) {
//exception handling left as an exercise for the reader
}
try {
if(bw != null)
bw.close();
} catch (IOException e) {
//exception handling left as an exercise for the reader
}
try {
if(fw != null)
fw.close();
} catch (IOException e) {
//exception handling left as an exercise for the reader
}
}
Вы можете использовать fileWriter
с флагом, установленным на true
, для добавления.
try
{
String filename= "MyFile.txt";
FileWriter fw = new FileWriter(filename,true); //the true will append the new data
fw.write("add a line\n");//appends the string to the file
fw.close();
}
catch(IOException ioe)
{
System.err.println("IOException: " + ioe.getMessage());
}