Bagaimana cara menulis file UTF-8 dengan Java?

180

Saya memiliki beberapa kode saat ini dan masalahnya adalah membuat file codepage 1252, saya ingin memaksanya untuk membuat file UTF-8

Adakah yang bisa membantu saya dengan kode ini, seperti yang saya katakan saat ini berfungsi ... tetapi saya harus memaksa save on utf .. bisakah saya memberikan parameter atau sesuatu ??

inilah yang saya miliki, bantuan apa pun sangat dihargai

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();
tandai pandai besi
sumber
2
Silakan kirim kode yang melewati kompiler, jika memungkinkan.
JesperE
tampaknya menjadi badak (javascript)
dfa

Jawaban:

208

Alih-alih menggunakan FileWriter, buat a FileOutputStream. Anda kemudian dapat membungkus ini dalam OutputStreamWriter, yang memungkinkan Anda untuk melewatkan penyandian dalam konstruktor. Kemudian Anda dapat menulis data Anda di dalam pernyataan coba-dengan-sumber daya :

try (OutputStreamWriter writer =
             new OutputStreamWriter(new FileOutputStream(PROPERTIES_FILE), StandardCharsets.UTF_8))
    // do stuff
}
skaffman
sumber
118
... dan mengutuk Sun tidak memasukkan konstruktor ke FileWriter yang mengambil Charset.
Jon Skeet
3
Tampaknya seperti pengawasan yang aneh. Dan mereka masih belum memperbaikinya.
skaffman
4
@ Jon Skeet: Mengingat bahwa FileWriter adalah pembungkus untuk FileOutputStream yang mengasumsikan penyandian default dan ukuran buffer, bukankah itu mengalahkan intinya?
Powerlord
Maaf, saya bermaksud untuk OutputStreamWriter, bukan untuk FileOutputStream.
Powerlord
198

Coba ini

Writer out = new BufferedWriter(new OutputStreamWriter(
    new FileOutputStream("outfilename"), "UTF-8"));
try {
    out.write(aString);
} finally {
    out.close();
}
Markus Lausberg
sumber
1
Saya pikir ada kesalahan ketik. Writer out = ...harus diperbaiki BufferedWriter out = ... .
asmaier
20
Writer adalah Kelas Abstrak, BufferedWriter menerapkan dan menulis () + tutup () dideklarasikan.
Markus Lausberg
3
Ini menciptakan UTF-8 aktual tanpa BOM, bukan hanya UTF-8. Apakah ada cara untuk memaksanya?
NeverMind
25

Coba gunakan FileUtils.writedari Apache Commons.

Anda harus dapat melakukan sesuatu seperti:

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

Ini akan membuat file jika tidak ada.

SAYA
sumber
4
Ini juga menghasilkan file UTF-8 tanpa BOM ... Saya tidak tahu apakah itu relevan atau tidak.
NeverMind
3
@ Smart hanya jika Anda sudah menggunakan Apache Commons. Kalau tidak, sepertinya sia-sia memasukkan toples lain hanya karena Anda tidak ingin menulis beberapa karakter lagi.
Jason
Saya tidak bisa melihat metode 'tulis (..)' di kelas FileUtils. Saya memeriksa di commons IO 1.4
RRM
Jika Anda membaca dokumen Java pada tautan yang diperlihatkan dalam pertanyaan, itu memberi tahu Anda versi Commons IO API di mana API penulisan diperkenalkan. Sepertinya menulis API diperkenalkan dari v2.0 dan seterusnya.
A_M
Saya ingin menyebutkan bahwa saya menggunakan metode FileUtils.writeStringToFile (...) (dengan commons-io-1.3.1.jar), bukan FileUtils.write (...).
Léa Massiot
21

Semua jawaban yang diberikan di sini tidak akan berfungsi karena tulisan UTF-8 java disadap.

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

Emperorlou
sumber
Sejauh yang saya tahu, bug ini adalah yang ini (karena penulis artikel itu tidak repot menyebutkannya): bugs.sun.com/view_bug.do?bug_id=4508058
Chris
4
Satu-satunya masalah saat menulis adalah BOM yang hilang. Bukan masalah besar. Membaca file dengan BOM di sisi lain memerlukan pengupasan secara manual.
Axel Fontaine
2
UTF-8 tidak perlu BOM, jadi secara teknis file tertulis masih berupa file teks yang disandikan UTF-8. Bugnya adalah dengan membaca UTF-8 dengan BOM.
Kien Truong
@Chris tautan bugs.sun.com rusak. Apakah Anda punya satu yang berfungsi?
Matthias
Masih bekerja untuk saya; Saya tidak masuk atau apa pun. Coba googling untuk bug 4508058.
Chris
21

Karena Java 7 Anda dapat melakukan hal yang sama dengan Files.newBufferedWritersedikit lebih ringkas:

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

The Java 7 Files jenis utilitas berguna untuk bekerja dengan file:

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

Versi Java 8 memungkinkan Anda untuk menghilangkan argumen Charset - metode default untuk UTF-8.

McDowell
sumber
3

kita dapat menulis file yang dikodekan UTF-8 dengan java menggunakan PrintWriter untuk menulis UTF-8 yang dikodekan xml

Atau Klik di sini

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

Kode contoh di bawah ini dapat membaca file baris demi baris dan menulis file baru dalam format UTF-8. Juga, saya secara eksplisit menentukan pengkodean 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
sumber