1. คลาส BufferedReader
- ห้องสมุดคลาส:
java.lang.Object
java.io.reader
java.io.bufferedreader
- แนวคิดพื้นฐาน:
BufferedReader ระดับสาธารณะขยายตัวอ่าน
อ่านข้อความจากสตรีมอินพุตอักขระและอักขระแต่ละตัวเพื่อให้สามารถอ่านอักขระอาร์เรย์และบรรทัดได้อย่างมีประสิทธิภาพ คุณสามารถระบุขนาดของบัฟเฟอร์หรือขนาดเริ่มต้นสามารถใช้งานได้ ในกรณีส่วนใหญ่ค่าเริ่มต้นมีขนาดใหญ่พอ
โดยทั่วไปคำขออ่านแต่ละครั้งที่ทำโดยผู้อ่านจะส่งผลให้คำขออ่านที่สอดคล้องกันสำหรับอักขระพื้นฐานหรือสตรีมไบต์ ดังนั้นจึงขอแนะนำให้ห่อผู้อ่านทั้งหมดที่มีการอ่าน () การดำเนินการอาจมีราคาแพง (เช่น filereader และ inputstreamreader) ด้วย bufferedreader
สตรีม bufferedReader สามารถอ่านบรรทัดข้อความและสร้างวัตถุ bufferedReader โดยผ่านวัตถุตัวอ่านไปยัง bufferedReader นี่เป็นเพราะ filereader ไม่ได้ให้ฟังก์ชั่นของการอ่านบรรทัดข้อความ
- การสาธิต:
จับคำสั่งที่ป้อนผ่าน BufferedReader:
นำเข้า java.io.*; คลาส bufferedreaderDemo {โมฆะคงที่สาธารณะหลัก (สตริง [] args) พ่น IOException {bufferederer bufferedreader = ใหม่ bufferedReader (ใหม่ inputStreamReader (system.in)); System.out.print ("โปรดป้อนชุดข้อความซึ่งอาจรวมถึงช่องว่าง:"); String text = bufferedReader.readline (); System.out.println ("โปรดป้อนข้อความ:"+ข้อความ); -คำอธิบายประกอบ:
โยน ioexception โยนข้อยกเว้น
InputStreamReader เป็นสะพานเชื่อมระหว่างการไหลของไบต์และการไหลของอักขระ
2. คลาส InputStreamReader
InputStreamReader แปลงสตรีมไบต์เป็นสตรีมอักขระ มันเป็นสะพานเชื่อมระหว่างการไหลของไบต์และการไหลของตัวละคร หากไม่ได้ระบุการเข้ารหัสชุดอักขระกระบวนการถอดรหัสจะใช้การเข้ารหัสอักขระเริ่มต้นของแพลตฟอร์มเช่น: GBK
วิธีการก่อสร้าง:
InputStreamReader ISR = ใหม่ inputStreamReader (inputStream in); // สร้างคลาส inputStreamReader ด้วยชุดการเข้ารหัสเริ่มต้น
inputStreamReader isr = new inputStreamReader (inputStream in, charsetName สตริง); // สร้างชุดการเข้ารหัสที่ระบุ
คลาส InputStreamReader
พารามิเตอร์ในวัตถุได้มาจาก inputStream ใน = system.in; // อ่านข้อมูลบนแป้นพิมพ์
หรือ inputStream ใน = ใหม่ FileInputStream (ชื่อไฟล์สตริง); // อ่านข้อมูลในไฟล์ จะเห็นได้ว่า FileInputStream เป็นคลาสย่อยของ InputStream
วิธีหลัก: int read (); // อ่านอักขระตัวเดียว
int read (char [] cbuf); // บันทึกอักขระอ่านลงในอาร์เรย์ ส่งคืนจำนวนอักขระที่อ่าน
- การสาธิต:
นำเข้า Java.io.*; คลาส InputStreamReaderDemo {โมฆะสาธารณะคงที่ transReadNoBuf () พ่น IOException { /*** ไม่มีบัฟเฟอร์คุณสามารถใช้วิธีการอ่าน () เท่านั้น */// อ่านไบต์สตรีม // inputstream ใน = system.in; // อ่านอินพุตแป้นพิมพ์ InputStream ใน = ใหม่ FileInputStream ("D: //demo.txt"); // อ่านข้อมูลไฟล์ // การแปลงของไบต์ไหลเป็นสตรีมอักขระ เพื่อเปิดใช้งานการแปลงที่มีประสิทธิภาพจากไบต์เป็นอักขระ // คุณสามารถอ่านไบต์เพิ่มเติมจากสตรีมพื้นฐานล่วงหน้า InputStreamReader ISR = ใหม่ inputStreamReader (in); // read // ครอบคลุมเป็นหนึ่งประโยค // inputStreamReader isr = new InputStreamReader (// ใหม่ FileInputStream ("D: //demo.txt")); ถ่าน [] cha = ถ่านใหม่ [1024]; int len = isr.read (cha); System.out.println (สตริงใหม่ (cha, 0, len)); isr.close (); } โมฆะคงที่สาธารณะ transReadByBuf () พ่น IOException { /*** ใช้บัฟเฟอร์เพื่อใช้วิธีการอ่าน () และ readline () ของวัตถุบัฟเฟอร์ */// อ่านไบต์สตรีม // inputStream ใน = system.in; // อ่านข้อมูลบนแป้นพิมพ์อินพุตสตรีมใน = ใหม่ fileInputStream ("d: //demo.txt"); // อ่านข้อมูลบนไฟล์ // การแปลงของไบต์ไหลเป็นสตรีมอักขระ inputStreamReader isr = new InputStreamReader (in); // read // สร้างอักขระสตรีมอักขระบัฟเฟอร์บัฟเฟอร์การอ่าน bufr = bufferedreader ใหม่ (isr); // buffered // bufferedererer bufr = new BufferedReader (// new InputStreamReader (ใหม่ FileInputStream ( สามารถรวมกันเป็นหนึ่งประโยค /*int ch = 0; ch = bufr.read (); System.out.println ((char) ch); */ สายสตริง; ในขณะที่ ((line = bufr.readline ())! = null) {system.out.println (บรรทัด); } isr.close (); -3. กรณีจริงของ InputStreamReader และ BufferedReader (ชุดที่ไม่ใช่รหัส)
นำเข้า java.io.*; คลาส UtilResource {private Void Initializource () {ลอง {// อ่านไฟล์และเขียนออกมาในรูปแบบ UTF-8 bufferedReader bufread; สตริงอ่าน; bufread = ใหม่ bufferedReader (ใหม่ inputStreamReader (ResourceHelper .getResourceInputStream ("pinyin.txt"))); ในขณะที่ ((read = bufread.readline ())! = null) {system.out.println (อ่าน); } bufread.close (); } catch (filenotfoundexception ex) {ex.printstacktrace (); } catch (ioexception ex) {ex.printstacktrace (); -หมายเหตุ: pinyin.txt ถูกวางไว้ในไดเรกทอรีรากของโครงการ
นำเข้า java.io.bufferedInputstream; นำเข้า java.io.fileinputstream; นำเข้า java.io.filenotfoundException; ResourceHelper คลาส { / ** * @param resourcename * @return * @return * / static bufferedinputstream FileInputStream (ResourCename)); } catch (filenotfoundexception e) {// todo บล็อก catch block ที่สร้างขึ้นอัตโนมัติ e.printstacktrace (); } return null; -สรุป:
คลาส InputStreamReader
มันเป็นสะพานเชื่อมระหว่างการไหลของไบต์และการไหลของอักขระล้อมรอบอินพุตสตรีมภายใน มันอ่านอักขระทีละตัวในระดับที่สูงขึ้นอินพุต/เอาต์พุตในรูปแบบข้อความและสามารถระบุรูปแบบการเข้ารหัส
คลาส BufferedReader
BufferedReader ถูกขยายออกไปโดยคลาสผู้อ่านให้การอ่านข้อความบัฟเฟอร์ทั่วไปและจัดเตรียม readline ที่ใช้งานได้จริงซึ่งอ่านบรรทัดข้อความอ่านข้อความจากสตรีมอินพุตอักขระและบัฟเฟอร์ตัวละครแต่ละตัวจึงให้การอ่านอักขระและเส้นที่มีประสิทธิภาพ
PS: ความสัมพันธ์ระหว่าง InputStream, InputStreamReader และ Reader
InputStream: ผลลัพธ์คือสตรีมอินพุตไบต์ หลังจาก inputStream.read ("ชื่อไฟล์") ผลลัพธ์คือสตรีมไบต์
ผู้อ่าน: อ่านสตรีมตัวละคร
InputStreamReader: สะพานจากไบต์ถึงอักขระ InputStreamReader (inputStream.read ("ชื่อไฟล์"));
reader.read (inputStreamReader (inputStream in)); สามารถเปลี่ยนจากไบต์เป็นตัวละครและพิมพ์และแสดง
java.io.reader และ java.io.inputstream แบบฟอร์มคลาสอินพุต Java
ผู้อ่านใช้เพื่ออ่านอักขระ 16 บิตนั่นคืออักขระที่เข้ารหัสแบบ Unicode; ในขณะที่ InputStream ใช้เพื่ออ่านอักขระ ASCII และข้อมูลไบนารี
Reader รองรับเอาต์พุตอักขระ Unicode 16 บิตและ InputStream รองรับเอาต์พุตอักขระ 8 บิต
Reader และ InputStream เป็นกลไกสองชุดคู่ขนานและกลไกอิสระที่จัดทำโดยไลบรารี I/O ตามลำดับ 1BYTE = 8BITS InputStream และ OutputStream ใช้ในการประมวลผลสตรีม 8 บิตและผู้อ่านและนักเขียนจะใช้ในการประมวลผลสตรีม 16 บิต
ในภาษา Java ประเภทไบต์คือ 8 บิตและประเภทถ่านคือ 16 บิตดังนั้นคุณต้องใช้ผู้อ่านและนักเขียนเมื่อประมวลผลภาษาจีน
เป็นที่น่าสังเกตว่าภายใต้กลไกทั้งสองระดับนี้นอกจากนี้ยังมีบริดจ์อินพุตสตรีมรีดและ OutputStreamWriter ซึ่งรับผิดชอบการปรับตัวของอินพุตกับผู้อ่านและการปรับตัวของ OutputStream กับนักเขียน
ใน Java มีสตรีมอินพุตผู้อ่านหลายประเภทที่สอดคล้องกับแหล่งข้อมูลที่แตกต่างกัน:
FileReader ใช้สำหรับการป้อนข้อมูลจากไฟล์ ChararrayReader ใช้สำหรับการป้อนข้อมูลจากอาร์เรย์อักขระในโปรแกรม StringReader ใช้สำหรับการป้อนข้อมูลจากสตริงในโปรแกรม PipedReader ใช้สำหรับการอ่านข้อมูลที่เขียนไปยังไปป์ไลน์จาก PipedWriter ในเธรดอื่น
นอกจากนี้ยังมีประเภทของอินพุตอินพุตอินพุตที่แตกต่างกันซึ่งสอดคล้องกับแหล่งข้อมูลที่แตกต่างกัน: FileInputStream, ByteArrayInputStream, StringBufferInputStream, PipedInputStream
นอกจากนี้ยังมีสตรีมอินพุตอินพุตสองตัวที่ไม่มีประเภทเครื่องอ่านที่สอดคล้องกัน: ซ็อกเก็ตใช้สำหรับซ็อกเก็ต URLConnection ใช้สำหรับการเชื่อมต่อ URL สองคลาสนี้ใช้ getInputStream () เพื่ออ่านข้อมูล
ตามลําดับมีความแตกต่างที่คล้ายกันระหว่าง java.io.writer และ java.io.outputstream
เกี่ยวกับ inputstream.read (byte [] b) และ inputstream.read (byte [] b, int ปิด, int len) ทั้งสองวิธีใช้เพื่ออ่านหลายไบต์จากสตรีม โปรแกรมเมอร์ที่มีประสบการณ์จะพบว่าวิธีการทั้งสองนี้มักจะไม่สามารถอ่านจำนวนไบต์ที่พวกเขาต้องการอ่านได้ ตัวอย่างเช่นในวิธีแรกโปรแกรมเมอร์มักจะหวังว่าโปรแกรมสามารถอ่าน b.length bytes ได้ แต่สถานการณ์จริงคือระบบมักจะไม่สามารถอ่านได้มากมาย หลังจากอ่านคำแนะนำ Java API อย่างรอบคอบคุณจะพบว่าวิธีนี้ไม่รับประกันว่าจะสามารถอ่านไบต์จำนวนมากได้มันสามารถรับประกันได้ว่ามันสามารถอ่านได้มากถึงหลายไบต์ (อย่างน้อย 1) ดังนั้นหากคุณต้องการให้โปรแกรมอ่านจำนวนไบต์คุณควรใช้รหัสต่อไปนี้:
ไบต์ [] b = ไบต์ใหม่ [นับ]; int readCount = 0; // จำนวนไบต์ที่อ่านสำเร็จในขณะที่ (readCount <count) {readCount += in.read (ไบต์, readCount, นับ - readCount); - รหัสนี้สามารถมั่นใจได้ว่าการอ่านจำนวนไบต์เว้นแต่จะพบข้อยกเว้นของ IO ในช่วงกลางหรือส่วนท้ายของสตรีมข้อมูล (eOfexception)