Каков наилучший способ создания файла и записи на него в Java
Обычно я использую объект PrintWritter
для создания и записи в файл, но не уверен, что его лучшие с точки зрения скорости и безопасности сравниваются с другими способами создания и записи в файл с использованием других подходов, то есть
Writer writer = new BufferedWriter(
new OutputStreamWriter(
new FileOutputStream("example.html"), "utf-8"));
writer.write("Something");
vs
File file = new File("example.html");
BufferedWriter output = new BufferedWriter(new FileWriter(file));
output.write("Something");
vs
File file = new File("example.html");
FileOutputStream is = new FileOutputStream(file);
OutputStreamWriter osw = new OutputStreamWriter(is);
Writer w = new BufferedWriter(osw);
w.write("something");
vs
PrintWritter pw = new PrintWriter("example.html", "UTF-8");
pw.write("Something");
Кроме того, когда использовать один над другим; сценарий использования будет оценен. Я не прошу, как создавать и писать в файл, я знаю, как это сделать. Его больше похоже на вопрос сравнения и контраста.
Ответы
Ответ 1
Я предпочитаю:
boolean append = true;
boolean autoFlush = true;
String charset = "UTF-8";
String filePath = "C:/foo.txt";
File file = new File(filePath);
if(!file.getParentFile().exists()) file.getParentFile().mkdirs();
FileOutputStream fos = new FileOutputStream(file, append);
OutputStreamWriter osw = new OutputStreamWriter(fos, charset);
BufferedWriter bw = new BufferedWriter(osw);
PrintWriter pw = new PrintWriter(bw, autoFlush);
pw.write("Some File Contents");
что дает вам:
- Решите, следует ли добавить текстовый файл или перезаписать его.
- Решите, делать ли это автоматически или нет.
- Укажите кодировку.
- Сделать его буферизованным, что улучшает производительность потоковой передачи.
- Удобные методы (такие как
println()
и его перегруженные).
Ответ 2
Честно говоря, я не знаю, является ли это лучшим вариантом, но я думаю, что это System
как, общепринятая абстракция:
In.java:
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class In {
public In() {
}
/**
* Tranforms the content of a file (i.e: "origin.txt") in a String
*
* @param fileName: Name of the file to read
* @return String which represents the content of the file
*/
public String readFile(String fileName) {
FileReader fr = null;
try {
fr = new FileReader(fileName);
} catch (FileNotFoundException e1) {
e1.printStackTrace();
}
BufferedReader bf = new BufferedReader(fr);
String file = "", aux = "";
try {
while ((file = bf.readLine()) != null) {
aux = aux + file + "\n";
}
bf.close();
} catch (IOException e) {
e.printStackTrace();
}
return aux;
}
}
Out.java:
import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
public class Out {
public Out() {}
/**
* Writes on the file named as the first parameter the String which gets as second parameter.
*
* @param fileName: Destiny file
* @param message: String to write on the destiny file
*/
public void writeStringOnFile(String fileName, String message) {
FileWriter w = null;
try {
w = new FileWriter(fileName);
} catch (IOException e) {
e.printStackTrace();
}
BufferedWriter bw = new BufferedWriter(w);
PrintWriter wr = new PrintWriter(bw);
try {
wr.write(message);
wr.close();
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
IO.java:
public class IO {
public Out out;
public In in;
/**
* Object which provides an equivalent use to Java 'System' class
*/
public IO() {
this.setIn(new In());
this.setOut(new Out());
}
public void setIn(In in) {
this.in = in;
}
public In getIn() {
return this.in;
}
public void setOut(Out out) {
this.out = out;
}
public Out getOut() {
return this.out;
}
}
Следовательно, вы можете использовать класс IO
почти так же, как вы используете System
.
Надеюсь, что это поможет.
Клеменсио Моралес Лукас.
Ответ 3
Лучшее решение, как обычно, зависит от вашей задачи: либо вы работаете с текстом, либо с двоичными данными. В первом случае вы должны предпочесть писателям, во втором - потоки.
Вы запрашиваете сравнение подходов к написанию текста в файлах.
Последний случай в вашем вопросе является лучшим для написания/создания новых текстовых файлов. Он подходит для 99% практических задач.
PrintWritter pw = new PrintWriter("example.html", "UTF-8");
pw.write("Something");
Это короткий и читаемый. Он поддерживает явное кодирование и буферизацию. Он не требует ненужных оберток.
Другие подходы старой моды могут и должны использоваться в тех случаях, когда это решение неприменимо. Например. вы хотите добавить любой текст в файл. В этом случае у вас нет выбора, кроме как использовать писателей на основе обтекателей потоков (к сожалению, FileWriter не поддерживает явное кодирование).