การใช้ไฟล์ข้อความ
แนะนำใหม่| English | ความหมาย |
|---|---|
| text file/tekst faɪl/ | ไฟล์ข้อความ |
บรรทัดว่างไม่ใช่ token ที่ไม่ถูกต้อง
- ไฟล์ข้อความ มีบรรทัดว่างตามด้วย
12ที่เริ่มต้น ทั้งhasNextLine()และhasNextInt()เป็นจริง: การตรวจสอบ token จำนวน nguyênจะข้ามช่องว่าง รวมถึงบรรทัดว่าง เพื่อหา 12 - เปรียบเทียบไฟล์ที่มี
oopsตามด้วย12: มีอีกบรรทัดหนึ่ง แต่ token ถัดไปไม่ใช่จำนวน nguyên การตรวจสอบการมีอยู่ของบรรทัดไม่สามารถกำหนดรูปแบบจำนวน nguyênได้; เลือก guard ที่ตรงกับวิธีการอ่าน
ด้วยตัวแบ่งแบบเดิม Scanner ที่มีบรรทัดว่างตามด้วย 12 จะรายงาน hasNextInt() เป็น true ที่จุดเริ่มต้น
Difficulty 1/5 · 100 coins + a small bonus on first completion today
การตรวจสอบโทเคนจำนวนเต็มจะข้ามช่องว่าง รวมถึงบรรทัดว่าง และพบโทKENจำนวน 12
เชื่อมต่อ reader กับแหล่งที่มา
new Scanner(new File("scores.txt"))อ่านไฟล์ที่มีชื่อ,omitemptynew Scanner(System.in)อ่านข้อมูลจากคีย์บอร์ด ทั้งสองเปิดใช้ Scanner methods เดียวกัน; แหล่งที่มาและความพร้อมใช้งานแตกต่างกัน- การเปิดไฟล์ที่ไม่มีอาจเกิด
FileNotFoundExceptionตัวอย่างสมบูรณ์ด้านล่างประกาศมันในmain; แอปพลิเคชันจริงอาจจับ (catch) มันแทนแล้วรายงานข้อผิดพลาดที่มีประโยชน์ การเลือกทั้งสองแบบไม่สร้างข้อมูลหาย
ในการอ่านไฟล์ข้อความ คุณต้องเชื่อม Scanner กับ...
Difficulty 1/5 · 100 coins + a small bonus on first completion today
new Scanner(new File("...")) อ่านไฟล์
メทოდ Scanner เดียวกัน (nextInt, nextLine) ใช้ได้ทั้งการป้อนจากคีย์บอร์ดและไฟล์
Difficulty 1/5 · 100 coins + a small bonus on first completion today
แหล่งที่มา (System.in เทียบกับ File) แตกต่างเท่านั้น
อ่านบรรทัดเต็ม
hasNextLine()ตรวจสอบว่ามีบรรทัดถัดไปหรือไม่โดยไม่บริโภคมัน;nextLine()บริโภคส่วนที่เหลือของบรร那次และ line separator ของมัน บรรทัดว่างอาจสร้าง string ว่าง""- สำหรับบันทึกแบบบรรทัด ใช้
while (in.hasNextLine()) { String line = in.nextLine(); ... }ตัดสินใจโดยชัดแจ้งว่าบันทึกว่างมีความหมายหรือไม่ ควรข้ามหรือควรรายงานว่าเป็นค่าที่ไม่ถูกต้อง
การอ่านไฟล์ข้อความ
ทำตามขั้นตอนที่โปรแกรมทำในการอ่านไฟล์บรรทัดต่อนั้น
เมทოდใดตรวจสอบว่ามีบรรทัดถัดไปให้อ่านหรือไม่?
Difficulty 1/5 · 100 coins + a small bonus on first completion today
hasNextLine() ปกป้องการอ่าน nextLine()
คุณควรตรวจสอบ hasNextLine() ก่อนเรียก nextLine() ทุกครั้ง
Difficulty 1/5 · 100 coins + a small bonus on first completion today
การอ่านเกินปลายไฟล์จะทำให้เกิดข้อยกเว้น
อ่าน token พร้อมการตรวจสอบความตรงกัน
- ตัวแบ่งข้อมูล (delimiter) เดิมของ Scanner คือช่องว่าง
hasNext()ตรวจสอบว่ามีการหา token หรือไม่;next()จะกิน token นั้นไปhasNextInt()ตรวจสอบว่า token ถัดไปสามารถอ่านเป็นจำนวนเต็มได้หรือไม่;nextInt()กินจำนวนเต็มนั้นไป while (in.hasNextInt())จะหยุดที่oopsแม้จะมี 12 ตามมาก็ตาม หากนโยบายคือการข้าม token ที่ไม่ถูกต้องและเก็บจำนวนเต็มในภายหลัง ให้ใช้ลูปพร้อมhasNext(), ทดสอบhasNextInt()และกิน token ที่ไม่ถูกต้องด้วยnext()
โปรแกรมนี้รวมผลของ token จำนวนเต็มที่ถูกต้องทั้งหมดและรายงานทุก token ที่ถูกข้าม สำหรับไฟล์ที่มี oops ตามด้วย 12 โปรแกรมจะพิมพ์ Skipped: oops แล้วตามด้วย Total: 12 ตัวอย่างนี้สมมติว่าผลรวมอยู่ในช่วงของ int
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class ReadScores {
public static void main(String[] args) throws FileNotFoundException {
int total = 0;
try (Scanner in = new Scanner(new File("scores.txt"))) {
while (in.hasNext()) {
if (in.hasNextInt()) {
total += in.nextInt();
} else {
System.out.println("Skipped: " + in.next());
}
}
}
System.out.println("Total: " + total);
}
}
Match each read to the guard that checks that kind of input.
Difficulty 2/5 · 140 coins + a small bonus on first completion today
A line-presence check is not an integer-format check.
กินอินพุตและปล่อยไฟล์
- ทุกสาขา (branch) ในลูป token จะต้องกิน token ไป การตรวจสอบ token ที่ไม่ซ้ำซ้อนอย่างต่อเนื่องโดยไม่กินมันจะทำให้ Scanner อยู่ตำแหน่งเดิมและอาจทำให้ลูปทำงานตลอดกาล
- บล็อก try-with-resources จะปิด Scanner ไฟล์นี้เมื่อออก รวมถึงการออกกรณีเกิดข้อผิดพลาด เมื่อจัดการด้วยตนเอง ให้เรียก
close()เมื่อใช้งานเสร็จ; การตรวจสอบไม่สามารถแทนที่การปิดทรัพยากรได้
hasNextLine() ตามด้วย nextInt() ไม่ใช่เงื่อนไขป้องกัน (guard) ที่ตรงกัน Token ที่ไม่ใช่จำนวนเต็มอาจทำให้ InputMismatchException เกิดขึ้น และการอ่านจำนวนเต็มล้มเหลวจะทำให้ token นั้นยังคงอยู่ เลือกที่จะปฏิเสธไฟล์ รายงานบันทึก หรือข้าม token อย่างชัดเจน
เมื่อคุณอ่านไฟล์เสร็จสิ้น คุณควร...
Difficulty 1/5 · 100 coins + a small bonus on first completion today
in.close() ปลดปล่อยไฟล์
ตรวจสอบนโยบายข้อมูลก่อนเริ่มลูป
- สำหรับอินพุต
8 oops 12ลูปที่อ่านเฉพาะขณะhasNextInt()จะรวมผลได้ 8 และหยุดที่oopsนโยบายที่แสดงเป็นการข้ามและรายงานจะรวมผลได้ 20 Token ที่ไม่คาดคิดไม่จำเป็นต้องหมายความว่าไฟล์สิ้นสุดแล้ว - นโยบายเหล่านี้ตอบคำถามที่แตกต่างกัน สำหรับคะแนนที่ต้องการต่อนักเรียน การข้าม token ที่ไม่ดีอย่างเงียบๆ อาจทำให้ลำดับข้อมูลผิดเพี้ยน; ควรเลือกการรายงานและปฏิเสธบันทึกนั้นมากกว่าการ treating ทุก token后续เป็นคะแนนที่เปลี่ยนแทนกันได้
เลือกการอ่านแบบบรรทัดหรือแบบ token จากรูปแบบไฟล์ การตรวจสอบตรวจสอบอินพุตที่จะมาถึงโดยไม่กินมัน; การอ่านที่ตรงกันจะกินมันไป จัดการกับข้อมูลที่ไม่ถูกต้องอย่างชัดเจน ย้ายทุกสาขาของลูป และปิดตัวอ่านไฟล์
สำหรับอินพุต 8 oops 12 โปรแกรม skip-and-report ที่แสดงจะพิมพ์ผลรวมเท่าใด?
Difficulty 2/5 · 140 coins + a small bonus on first completion today
โปรแกรมจะอ่านและบวก 8, อ่านและรายงาน oops, จากนั้นอ่านและบวก 12 ผลรวมคือ 20