Каков наилучший способ создания файла и записи на него в 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");

что дает вам:

  1. Решите, следует ли добавить текстовый файл или перезаписать его.
  2. Решите, делать ли это автоматически или нет.
  3. Укажите кодировку.
  4. Сделать его буферизованным, что улучшает производительность потоковой передачи.
  5. Удобные методы (такие как 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 не поддерживает явное кодирование).