โปรแกรมของฉันต้องอ่านไฟล์ข้อความทีละบรรทัด ไฟล์ในรูปแบบ UTF-8 ฉันไม่แน่ใจว่าไฟล์ถูกต้อง - อาจมีอักขระที่ไม่สามารถพิมพ์ได้ สามารถตรวจสอบได้โดยไม่ต้องไปที่ระดับไบต์หรือไม่? ขอบคุณ.
ตรวจสอบบรรทัดเพื่อหาอักขระที่ไม่สามารถพิมพ์ได้ขณะอ่านไฟล์ข้อความ
คำตอบ (8)
หากคุณต้องการตรวจสอบว่าสตริงมีอักขระที่ไม่สามารถพิมพ์ได้ คุณสามารถใช้นิพจน์ทั่วไปได้
[^\p{Print}]
เปิดไฟล์ด้วย FileInputStream
จากนั้นใช้ InputStreamReader
ด้วย UTF-8 Charset
เพื่ออ่านอักขระจากสตรีม และใช้ BufferedReader
เพื่ออ่านบรรทัด เช่น ผ่าน BufferedReader#readLine
ซึ่งจะทำให้คุณ เชือก เมื่อคุณมีสตริงแล้ว คุณสามารถตรวจสอบอักขระที่ไม่ใช่สิ่งที่คุณพิจารณาว่าจะพิมพ์ได้
เช่น. (โดยไม่มีการตรวจสอบข้อผิดพลาด) โดยใช้ try-with-resources (ซึ่งเป็นเวอร์ชัน 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
บิตเท่านั้นที่ถูกต้อง ()
ควรเป็น ()
ไม่ใช่ {}
และไม่จำเป็นต้องใช้เครื่องหมายอัฒภาคสุดท้าย (แต่ได้รับอนุญาต ดังนั้นฉันจึงปล่อยไว้ -- มากกว่าเพื่อให้สอดคล้องกับบรรทัดด้านบน)
- person T.J. Crowder; 14.04.2015
แม้ว่าการดำเนินการด้วยตนเองโดยใช้ BufferedReader
และ InputStreamReader
ไม่ใช่เรื่องยาก แต่ฉันจะใช้ Guava:
List<String> lines = Files.readLines(file, Charsets.UTF_8);
จากนั้นคุณสามารถทำอะไรก็ได้ตามต้องการด้วยบรรทัดเหล่านั้น
แก้ไข: โปรดทราบว่าการดำเนินการนี้จะอ่านไฟล์ทั้งหมดลงในหน่วยความจำในครั้งเดียว ในกรณีส่วนใหญ่ เป็นเรื่องปกติ และ ง่ายกว่า อย่างแน่นอนกว่าการอ่านทีละบรรทัด โดยประมวลผลแต่ละบรรทัดในขณะที่คุณอ่าน หากเป็นไฟล์ขนาดใหญ่ คุณอาจต้องทำเช่นนั้นตามที่ T.J. คำตอบของคราวเดอร์.
เพิ่งพบว่าด้วย Java NIO (java.nio.file.*
) คุณสามารถเขียนได้อย่างง่ายดาย:
List<String> lines=Files.readAllLines(Paths.get("/tmp/test.csv"), StandardCharsets.UTF_8);
for(String line:lines){
System.out.println(line);
}
แทนที่จะจัดการกับ FileInputStream
s และ BufferedReader
s...
ด้านล่างเป็นอย่างไรบ้าง:
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
}
ที่มา: http://devmain.blogspot.co.uk/2013/10/java-quick-way-to-read-or-write-to-file.html
ฉันสามารถหาวิธีดังต่อไปนี้ได้
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());
}
คำตอบโดย @T.J.Crowder คือ Java 6 - ใน java 7 คำตอบที่ถูกต้องคือคำตอบโดย @McIntosh - แม้ว่าการใช้ Charset สำหรับชื่อสำหรับ UTF -8 นั้นไม่สนับสนุน:
List<String> lines = Files.readAllLines(Paths.get("/tmp/test.csv"),
StandardCharsets.UTF_8);
for(String line: lines){ /* DO */ }
เตือนให้นึกถึงวิธี Guava มากมายที่โพสต์โดย Skeet ด้านบน - และแน่นอนว่ามีคำเตือนแบบเดียวกัน นั่นคือสำหรับไฟล์ขนาดใหญ่ (Java 7):
BufferedReader reader = Files.newBufferedReader(path, StandardCharsets.UTF_8);
for (String line = reader.readLine(); line != null; line = reader.readLine()) {}
หากอักขระทุกตัวในไฟล์ได้รับการเข้ารหัสอย่างเหมาะสมในรูปแบบ UTF-8 คุณจะไม่มีปัญหาในการอ่านโดยใช้โปรแกรมอ่านที่มีการเข้ารหัส UTF-8 ขึ้นอยู่กับคุณที่จะตรวจสอบทุกตัวอักษรของไฟล์และดูว่าคุณสามารถพิมพ์ได้หรือไม่