Program saya harus membaca file teks - baris demi baris. File dalam UTF-8. Saya tidak yakin apakah file tersebut benar - mungkin berisi karakter yang tidak dapat dicetak. Apakah mungkin memeriksanya tanpa pergi ke level byte? Terima kasih.
Periksa baris untuk karakter yang tidak dapat dicetak saat membaca file teks
Jawaban (8)
Jika Anda ingin memeriksa suatu string memiliki karakter yang tidak dapat dicetak, Anda dapat menggunakan ekspresi reguler
[^\p{Print}]
Buka file dengan FileInputStream
, lalu gunakan InputStreamReader
dengan UTF-8 Charset
untuk membaca karakter dari aliran, dan menggunakan BufferedReader
untuk membaca baris, mis. melalui BufferedReader#readLine
, yang akan memberi Anda rangkaian. Setelah Anda memiliki string, Anda dapat memeriksa karakter yang menurut Anda tidak dapat dicetak.
Misalnya. (tanpa pemeriksaan kesalahan), menggunakan coba-dengan-sumber daya (yang agak modern dalam versi Java):
String line;
try (
InputStream fis = new FileInputStream("the_file_name");
InputStreamReader isr = new InputStreamReader(fis, Charset.forName("UTF-8"));
BufferedReader br = new BufferedReader(isr);
) {
while ((line = br.readLine()) != null) {
// Deal with the line
}
}
isr
yang benar; ()
seharusnya menjadi ()
, bukan {}
, dan titik koma terakhir tidak diperlukan (tetapi diperbolehkan, jadi saya tinggalkan -- lebih sesuai dengan baris di atasnya).
- person T.J. Crowder; 14.04.2015
Meskipun tidak sulit melakukan ini secara manual menggunakan BufferedReader
dan InputStreamReader
, saya akan menggunakan Guava:
List<String> lines = Files.readLines(file, Charsets.UTF_8);
Anda kemudian dapat melakukan apa pun yang Anda suka dengan garis-garis itu.
EDIT: Perhatikan bahwa ini akan membaca seluruh file ke dalam memori sekaligus. Dalam kebanyakan kasus, hal ini sebenarnya baik-baik saja - dan tentunya lebih sederhana daripada membacanya baris demi baris, memproses setiap baris saat Anda membacanya. Jika itu adalah file yang sangat besar, Anda mungkin perlu melakukannya sesuai dengan T.J. jawaban Crowder.
Baru tahu bahwa dengan Java NIO (java.nio.file.*
) Anda dapat dengan mudah menulis:
List<String> lines=Files.readAllLines(Paths.get("/tmp/test.csv"), StandardCharsets.UTF_8);
for(String line:lines){
System.out.println(line);
}
daripada berurusan dengan FileInputStream
s dan BufferedReader
s...
Bagaimana di bawah ini:
FileReader fileReader = new FileReader(new File("test.txt"));
BufferedReader br = new BufferedReader(fileReader);
String line = null;
// if no more lines the readLine() returns null
while ((line = br.readLine()) != null) {
// reading lines until the end of the file
}
Sumber: http://devmain.blogspot.co.uk/2013/10/java-quick-way-to-read-or-write-to-file.html
Saya dapat menemukan cara berikut untuk melakukannya.
private static final String fileName = "C:/Input.txt";
public static void main(String[] args) throws IOException {
Stream<String> lines = Files.lines(Paths.get(fileName));
lines.toArray(String[]::new);
List<String> readAllLines = Files.readAllLines(Paths.get(fileName));
readAllLines.forEach(s -> System.out.println(s));
File file = new File(fileName);
Scanner scanner = new Scanner(file);
while (scanner.hasNext()) {
System.out.println(scanner.next());
}
Jawaban oleh @T.J.Crowder adalah Java 6 - di Java 7 jawaban yang valid adalah jawaban dari @McIntosh - meskipun penggunaan Charset untuk nama UTF -8 tidak disarankan:
List<String> lines = Files.readAllLines(Paths.get("/tmp/test.csv"),
StandardCharsets.UTF_8);
for(String line: lines){ /* DO */ }
Mengingatkan banyak cara Jambu Biji yang diposting oleh Skeet di atas - dan tentu saja peringatan yang sama berlaku. Artinya, untuk file besar (Java 7):
BufferedReader reader = Files.newBufferedReader(path, StandardCharsets.UTF_8);
for (String line = reader.readLine(); line != null; line = reader.readLine()) {}
Jika setiap karakter dalam file dikodekan dengan benar dalam UTF-8, Anda tidak akan kesulitan membacanya menggunakan pembaca dengan pengkodean UTF-8. Terserah Anda untuk memeriksa setiap karakter file dan melihat apakah Anda menganggapnya dapat dicetak atau tidak.