Jak napisać plik UTF-8 za pomocą Java?

180

Mam aktualny kod, a problemem jest utworzenie pliku strony kodowej 1252, chcę go zmusić do utworzenia pliku UTF-8

Czy ktoś może mi pomóc z tym kodem, ponieważ mówię, że obecnie działa ... ale muszę wymusić zapisanie na utf .. czy mogę przekazać parametr lub coś?

to jest to, co naprawdę doceniam

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
źródło
2
Jeśli to możliwe, proszę wpisać kod, który przekazuje kompilator.
JesperE
wygląda na nosorożca (javascript)
dfa

Odpowiedzi:

208

Zamiast używać FileWriter, utwórz FileOutputStream. Następnie możesz zawinąć to w OutputStreamWriter, co pozwala przekazać kodowanie w konstruktorze. Następnie możesz zapisać swoje dane na tym w instrukcji try-with-resources :

try (OutputStreamWriter writer =
             new OutputStreamWriter(new FileOutputStream(PROPERTIES_FILE), StandardCharsets.UTF_8))
    // do stuff
}
skaffman
źródło
117
... i przeklinamy, że Sun nie wprowadza konstruktora do FileWriter, który przyjmuje Charset.
Jon Skeet
3
Wydaje się to dziwnym niedopatrzeniem. I nadal tego nie naprawili.
skaffman
4
@Jon Skeet: Biorąc pod uwagę, że FileWriter jest opakowaniem dla FileOutputStream, który zakłada domyślne kodowanie i rozmiar bufora, czy nie byłoby to w porządku?
Powerlord
Przepraszam, miałem na myśli OutputStreamWriter, a nie FileOutputStream.
Powerlord
198

Spróbuj tego

Writer out = new BufferedWriter(new OutputStreamWriter(
    new FileOutputStream("outfilename"), "UTF-8"));
try {
    out.write(aString);
} finally {
    out.close();
}
Markus Lausberg
źródło
1
Myślę, że jest literówka. Writer out = ...powinien zostać poprawiony na BufferedWriter out = ... .
asmaier,
20
Writer jest klasą abstrakcyjną, BufferedWriter jest implementowany, a write () + close () są deklarowane.
Markus Lausberg,
3
To tworzy rzeczywisty UTF-8 bez BOM, nie tylko UTF-8. Czy istnieje sposób, aby to wymusić?
neverMind
25

Spróbuj użyć FileUtils.writez Apache Commons.

Powinieneś być w stanie zrobić coś takiego:

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

Spowoduje to utworzenie pliku, jeśli nie istnieje.

JESTEM
źródło
4
Powoduje to również utworzenie pliku UTF-8 bez BOM ... Nie wiem, czy to jest istotne, czy nie.
neverMind
3
@Smarty tylko wtedy, gdy już korzystasz z Apache Commons. W przeciwnym razie dołączenie kolejnego słoika wydaje się okropnym marnotrawstwem tylko dlatego, że nie chcesz pisać więcej znaków.
Jason
Nie widziałem metody „write (..)” w klasie FileUtils. Sprawdziłem we wspólnym IO 1.4
RRM
Jeśli przeczytasz dokumentację Java na odsyłaczu pokazanym w pytaniu, to powie ci ona wersję Commons IO API, w której zostały wprowadzone API zapisu. Wygląda na to, że interfejsy API zapisu zostały wprowadzone od wersji 2.0.
A_M
Chciałbym tylko wspomnieć, że użyłem metody FileUtils.writeStringToFile (...) (with commons-io-1.3.1.jar) zamiast FileUtils.write (...).
Léa Massiot
21

Wszystkie podane tutaj odpowiedzi nie będą działać, ponieważ pisanie kodu UTF-8 w języku Java jest błędne.

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

Cesarz
źródło
O ile mogę stwierdzić, błąd jest ten (ponieważ autor tego artykułu nie zawracał sobie głowy wspominaniem go): bugs.sun.com/view_bug.do?bug_id=4508058
Chris
4
Jedynym problemem podczas pisania jest brakujący zestawienie komponentów. Nie ma sprawy. Z drugiej strony czytanie pliku z zestawieniem komponentów wymaga ręcznego usunięcia go.
Axel Fontaine
2
UTF-8 nie potrzebuje BOM, więc technicznie zapisany plik jest nadal prawidłowym plikiem tekstowym zakodowanym w UTF-8. Błąd dotyczy odczytu UTF-8 z BOM.
Kien Truong
@Chris link bugs.sun.com jest uszkodzony. Czy masz taki, który działa?
Matthias
Nadal dla mnie działa; Nie jestem zalogowany ani nic. Spróbuj googlować pod kątem błędu 4508058.
Chris
21

Od wersji Java 7 możesz zrobić to samo Files.newBufferedWriterw nieco bardziej zwięzły sposób:

Path logFile = Paths.get("/tmp/example.txt");
try (BufferedWriter writer = Files.newBufferedWriter(logFile, StandardCharsets.UTF_8)) {
    writer.write("Hello World!");
    // ...
}
Nigel_V_Thomas
źródło
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
źródło
6

Java 7 Pliki typu narzędzie jest przydatne do pracy z plikami:

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

Wersja Java 8 pozwala pominąć argument Charset - metody domyślnie ustawione na UTF-8.

McDowell
źródło
3

możemy napisać plik zakodowany w UTF-8 za pomocą Java, używając PrintWriter do napisania pliku XML zakodowanego w UTF-8

Lub kliknij tutaj

PrintWriter out1 = new PrintWriter(new File("C:\\abc.xml"), "UTF-8");
Dharmesh Patel
źródło
3

Poniżej przykładowy kod może odczytać plik wiersz po wierszu i napisać nowy plik w formacie UTF-8. Ponadto wyraźnie określam kodowanie CP1252.

    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
źródło