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();

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
}

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();
}

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.


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


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!");
    // ...
}

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();

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.


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");

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();

    }
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.