Menggunakan File Teks
| English | Bahasa Indonesia |
|---|---|
| text file/tekst faɪl/ | file teks |
Baris kosong bukan token yang tidak valid
- Berkas teks berisi baris kosong diikuti oleh
12. Pada awalnya, keduahasNextLine()danhasNextInt()bernilai benar: pengecekan token integer melewatkan whitespace, termasuk baris kosong, untuk menemukan 12. - Bandingkan berkas yang berisi
oopsdiikuti oleh12: berkas ini memiliki baris lain, tetapi token berikutnya bukanlah integer. Pengecekan kehadiran baris tidak dapat menetapkan format integer; pilihlah pengaman yang sesuai dengan proses pembacaan.
Dengan delimiter default, Scanner yang berisi baris kosong diikuti oleh 12 melaporkan hasNextInt() sebagai true di awal.
Pemeriksaan token integer melewatkan whitespace, termasuk baris kosong, dan menemukan token integer 12.
Hubungkan pembaca ke sumbernya
new Scanner(new File("scores.txt"))membaca file bernama, sedangkannew Scanner(System.in)membaca input keyboard. Keduanya mengekspos method Scanner yang sama; sumber dan ketersediaannya berbeda.- Membuka berkas yang hilang dapat menyebabkan error
FileNotFoundException. Contoh lengkap di bawah ini mendeklarasikannya padamain; aplikasi nyata dapat menangkapnya dan melaporkan error yang berguna. Neither choice creates missing data.
Untuk membaca file teks, Anda menyambungkan Scanner ke...
new Scanner(new File("...")) membaca file.
Metode Scanner yang sama (nextInt, nextLine) berfungsi untuk input keyboard maupun file.
Hanya sumbernya (System.in vs File) yang berbeda.
Baca baris lengkap
hasNextLine()memeriksa apakah ada baris lain tanpa menghabiskannya;nextLine()menghabiskan sisa baris tersebut dan pemisah barisnya. Baris kosong dapat menghasilkan string kosong"".- Untuk rekord berbasis baris, gunakan
while (in.hasNextLine()) { String line = in.nextLine(); ... }. Tentukan secara eksplisit apakah rekord kosong bermakna, harus dilewati, atau harus dilaporkan sebagai tidak valid.
Membaca file teks
Ikuti langkah-langkah yang diambil program untuk membaca file baris demi baris.
Metode mana yang memeriksa apakah ada baris lain untuk dibaca?
hasNextLine() menjaga pembacaan nextLine().
Anda harus memeriksa hasNextLine() sebelum setiap pemanggilan nextLine().
Membaca melebihi akhir menimbulkan pengecualian.
Baca token dengan pengecekan yang sesuai
- Pemisah bawaan Scanner adalah spasi.
hasNext()memeriksa sebuah token;next()mengonsumsinya.hasNextInt()memeriksa apakah token berikutnya dapat dibaca sebagai bilangan bulat;nextInt()mengonsumsi bilangan bulat tersebut. while (in.hasNextInt())berhenti padaoops, bahkan jika 12 mengikutinya. Jika kebijakannya untuk melewatkan token yang tidak valid dan mempertahankan bilangan bulat yang kemudian, gunakan perulangan denganhasNext(), ujihasNextInt(), dan konsumsi token yang tidak valid dengannext().
Program lengkap ini menjumlahkan token bilangan bulat yang valid dan melaporkan setiap token yang dilewatkan. Untuk file yang berisi oops diikuti oleh 12, program ini mencetak Skipped: oops dan kemudian Total: 12. Contoh ini mengasumsikan jumlah muat dalam 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.
A line-presence check is not an integer-format check.
Konsumsi input dan lepaskan file
- Setiap cabang dalam perulangan token mengonsumsi sebuah token. Memeriksa token yang tidak valid berulang kali tanpa mengonsumsinya akan membuat Scanner tetap di posisi yang sama dan dapat menyebabkan perulangan berjalan selamanya.
- Blok try-with-resources menutup Scanner file ini saat keluar, termasuk saat keluar karena pengecualian. Saat mengelolanya secara manual, panggil
close()ketika selesai; pemeriksaan tidak menggantikan penutupan sumber daya.
hasNextLine() diikuti oleh nextInt() bukan pengaman yang cocok. Token non-bilangan bulat dapat menyebabkan InputMismatchException, dan pembacaan bilangan bulat yang gagal itu meninggalkan token tetap tersedia. Pilih apakah menolak file, melaporkan rekord, atau secara eksplisit melewatkan token.
Ketika Anda selesai membaca file, Anda harus...
in.close() melepaskan file.
Periksa kebijakan data sebelum perulangan
- Untuk input
8 oops 12, perulangan yang membaca hanya selamahasNextInt()menjumlahkan 8 dan berhenti padaoops. Kebijakan skip-and-report yang ditunjukkan menjumlahkan 20. Token yang tidak diharapkan tidak harus berarti file telah berakhir. - Kebijakan-kebijakan ini menjawab pertanyaan yang berbeda. Untuk skor yang diperlukan per siswa, diam-diam melewatkan token yang buruk dapat menyelaraskan rekord secara keliru; lebih baik melaporkan dan menolak rekord tersebut daripada memperlakukan semua token kemudian sebagai skor yang dapat dipertukarkan.
Pilih pembacaan baris atau token berdasarkan format file. Pemeriksaan memeriksa input yang akan datang tanpa mengonsumsinya; pembacaan yang cocok mengonsumsinya. Tangani data yang tidak valid secara eksplisit, majukan setiap cabang perulangan, dan tutup pembaca file.
Untuk input 8 oops 12, berapa total yang dicetak program skip-and-report yang ditampilkan?
Proses ini mengonsumsi dan menambahkan 8, mengonsumsi dan melaporkan oops, kemudian mengonsumsi dan menambahkan 12. Totalnya adalah 20.