Wie schreibe ich eine UTF-8-Datei mit Java?

180

Ich habe aktuellen Code und das Problem ist das Erstellen einer 1252-Codepage-Datei. Ich möchte sie zwingen, eine UTF-8-Datei zu erstellen

Kann mir jemand bei diesem Code helfen, da ich sage, dass er derzeit funktioniert ... aber ich muss das Speichern von utf erzwingen ... kann ich einen Parameter oder etwas übergeben?

Das ist, was ich habe, jede Hilfe wirklich geschätzt

var out = new java.io.FileWriter( new java.io.File( path )),
        text = new java.lang.String( src || "" );
    out.write( text, 0, text.length() );
    out.flush();
    out.close();
Mark Smith
quelle
2
Bitte geben Sie nach Möglichkeit die Postleitzahl ein, die den Compiler übergibt.
JesperE
es scheint Nashorn (Javascript) zu sein
dfa

Antworten:

208

Anstatt zu verwenden FileWriter, erstellen Sie eine FileOutputStream. Sie können dies dann in eine einbinden OutputStreamWriter, wodurch Sie eine Codierung im Konstruktor übergeben können. Dann können Sie Ihre Daten in eine Try-with-Resources-Anweisung schreiben :

try (OutputStreamWriter writer =
             new OutputStreamWriter(new FileOutputStream(PROPERTIES_FILE), StandardCharsets.UTF_8))
    // do stuff
}
Skaffman
quelle
117
... und verfluche Sun, indem sie FileWriter keinen Konstruktor hinzufügt, der einen Zeichensatz benötigt.
Jon Skeet
3
Es scheint ein seltsames Versehen zu sein. Und sie haben es immer noch nicht behoben.
Skaffman
4
@ Jon Skeet: Wenn FileWriter ein Wrapper für FileOutputStream ist, der die Standardcodierung und Puffergröße annimmt, würde das den Punkt nicht zunichte machen?
Powerlord
Entschuldigung, ich meinte für OutputStreamWriter, nicht für FileOutputStream.
Powerlord
198

Versuche dies

Writer out = new BufferedWriter(new OutputStreamWriter(
    new FileOutputStream("outfilename"), "UTF-8"));
try {
    out.write(aString);
} finally {
    out.close();
}
Markus Lausberg
quelle
1
Ich denke, es gibt einen Tippfehler. Writer out = ...sollte korrigiert werden auf BufferedWriter out = ... .
Asmaier
20
Writer ist die abstrakte Klasse, BufferedWriter implementiert und write () + close () werden deklariert.
Markus Lausberg
3
Dadurch wird eine tatsächliche UTF-8 ohne Stückliste erstellt, nicht nur UTF-8. Gibt es eine Möglichkeit, das zu erzwingen?
NeverMind
25

Versuchen Sie es mit FileUtils.writeApache Commons.

Sie sollten in der Lage sein, etwas zu tun wie:

File f = new File("output.txt"); 
FileUtils.writeStringToFile(f, document.outerHtml(), "UTF-8");

Dadurch wird die Datei erstellt, wenn sie nicht vorhanden ist.

A_M
quelle
4
Dies erzeugt auch eine Datei UTF-8 ohne Stückliste ... Ich weiß nicht, ob es relevant ist oder nicht.
NeverMind
3
@ Smarty nur, wenn Sie bereits Apache Commons verwenden. Ansonsten scheint es eine schreckliche Verschwendung zu sein, noch ein Glas einzuschließen, nur weil Sie nicht noch ein paar Zeichen schreiben möchten.
Jason
In der FileUtils-Klasse konnte keine Methode 'write (..)' angezeigt werden. Ich habe die Commons IO 1.4
RRM
Wenn Sie die Java-Dokumente unter dem in der Frage gezeigten Link lesen, wird Ihnen die Version der Commons IO-API mitgeteilt, in der die Schreib-APIs eingeführt wurden. Es sieht so aus, als ob die Schreib-APIs ab Version 2.0 eingeführt wurden.
A_M
Ich möchte nur erwähnen, dass ich anstelle von FileUtils.write (...) die Methode FileUtils.writeStringToFile (...) (mit commons-io-1.3.1.jar) verwendet habe.
Léa Massiot
21

Alle hier gegebenen Antworten funktionieren nicht, da das Schreiben von Java UTF-8 fehlerhaft ist.

http://tripoverit.blogspot.com/2007/04/javas-utf-8-and-unicode-writing-is.html

Emperorlou
quelle
Soweit ich das beurteilen
Chris
4
Das einzige Problem beim Schreiben ist die fehlende Stückliste. Keine große Sache. Um eine Datei mit einer Stückliste zu lesen, muss sie manuell entfernt werden.
Axel Fontaine
2
UTF-8 benötigt keine Stückliste, daher ist die geschriebene Datei technisch gesehen immer noch eine gültige UTF-8-codierte Textdatei. Der Fehler liegt beim Lesen eines UTF-8 mit Stückliste.
Kien Truong
@ Chris der bugs.sun.com Link ist kaputt. Hast du eine, die funktioniert?
Matthias
Funktioniert immer noch für mich; Ich bin nicht eingeloggt oder so. Versuchen Sie, nach Fehler 4508058 zu googeln.
Chris
21

Seit Java 7 können Sie dasselbe mit Files.newBufferedWriteretwas prägnanterem tun :

Path logFile = Paths.get("/tmp/example.txt");
try (BufferedWriter writer = Files.newBufferedWriter(logFile, StandardCharsets.UTF_8)) {
    writer.write("Hello World!");
    // ...
}
Nigel_V_Thomas
quelle
9
var out = new java.io.PrintWriter(new java.io.File(path), "UTF-8");
text = new java.lang.String( src || "" );
out.print(text);
out.flush();
out.close();
Boxofrats
quelle
6

Der Dienstprogrammtyp Java 7-Dateien ist nützlich für die Arbeit mit Dateien:

import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.io.IOException;
import java.util.*;

public class WriteReadUtf8 {
  public static void main(String[] args) throws IOException {
    List<String> lines = Arrays.asList("These", "are", "lines");

    Path textFile = Paths.get("foo.txt");
    Files.write(textFile, lines, StandardCharsets.UTF_8);

    List<String> read = Files.readAllLines(textFile, StandardCharsets.UTF_8);

    System.out.println(lines.equals(read));
  }
}

In der Java 8-Version können Sie das Charset- Argument weglassen - die Standardmethode für UTF-8.

McDowell
quelle
3

Wir können die UTF-8-codierte Datei mit Java schreiben, indem wir PrintWriter verwenden, um UTF-8-codierte XML zu schreiben

Oder klicken Sie hier

PrintWriter out1 = new PrintWriter(new File("C:\\abc.xml"), "UTF-8");
Dharmesh Patel
quelle
2

Der folgende Beispielcode kann Dateien zeilenweise lesen und neue Dateien im UTF-8-Format schreiben. Außerdem spezifiziere ich explizit die Cp1252-Codierung.

    public static void main(String args[]) throws IOException {

    BufferedReader br = new BufferedReader(new InputStreamReader(
            new FileInputStream("c:\\filenonUTF.txt"),
            "Cp1252"));
    String line;

    Writer out = new BufferedWriter(
            new OutputStreamWriter(new FileOutputStream(
                    "c:\\fileUTF.txt"), "UTF-8"));

    try {

        while ((line = br.readLine()) != null) {

            out.write(line);
            out.write("\n");

        }

    } finally {

        br.close();
        out.close();

    }
}
Ammad
quelle