แพ็คเกจ Java.io มีคลาสเกือบทั้งหมดที่จำเป็นในการดำเนินการอินพุตและเอาต์พุต คลาสสตรีมทั้งหมดนี้เป็นตัวแทนของแหล่งอินพุตและปลายทางเอาต์พุต
สตรีมในแพ็คเกจ Java.io รองรับหลายรูปแบบ เช่น ประเภทพื้นฐาน อ็อบเจ็กต์ ชุดอักขระที่แปลเป็นภาษาท้องถิ่น ฯลฯ
สตรีมสามารถเข้าใจได้ว่าเป็นลำดับของข้อมูล สตรีมอินพุตแสดงถึงการอ่านข้อมูลจากแหล่งที่มา และสตรีมเอาต์พุตแสดงถึงการเขียนข้อมูลไปยังปลายทาง
Java ให้การสนับสนุน I/O ที่มีประสิทธิภาพและยืดหยุ่น ทำให้มีการใช้กันอย่างแพร่หลายมากขึ้นในการถ่ายโอนไฟล์และการเขียนโปรแกรมเครือข่าย
แต่ส่วนนี้ครอบคลุมฟังก์ชันพื้นฐานที่สุดที่เกี่ยวข้องกับสตรีมและ I/O เราจะเรียนรู้ฟังก์ชันเหล่านี้ผ่านตัวอย่างทีละรายการ
อินพุตคอนโซลของ Java เสร็จสิ้นโดย System.in
เมื่อต้องการรับสตรีมอักขระที่ผูกไว้กับคอนโซล คุณสามารถตัด System.in ในวัตถุ BufferedReader เพื่อสร้างสตรีมอักขระ
ต่อไปนี้เป็นไวยากรณ์พื้นฐานสำหรับการสร้าง BufferedReader:
BufferedReaderbr=newBufferedReader(new InputStreamReader(System.in));
หลังจากสร้างอ็อบเจ็กต์ BufferedReader แล้ว เราสามารถใช้เมธอด read() เพื่ออ่านอักขระจากคอนโซล หรือใช้เมธอด readLine() เพื่ออ่านสตริง
หากต้องการอ่านอักขระจากวัตถุ BufferedReader ให้ใช้เมธอด read() ซึ่งมีไวยากรณ์ดังนี้:
intread()throwsIOException
แต่ละครั้งที่มีการเรียกเมธอด read() มันจะอ่านอักขระจากอินพุตสตรีมและส่งกลับอักขระนั้นเป็นค่าจำนวนเต็ม ส่งกลับ -1 เมื่อสตรีมสิ้นสุดลง วิธีการนี้จะพ่น IOException
โปรแกรมต่อไปนี้สาธิตการใช้เมธอด read() เพื่ออ่านอักขระจากคอนโซลอย่างต่อเนื่องจนกว่าผู้ใช้จะเข้าสู่ "q"
//使用BufferedReader在控制台读取字符importjava.io.*; publicclassBRRead{ publicstaticvoidmain(Stringargs[])throwsIOException { charc; //使用System.in创建BufferedReader BufferedReaderbr=newBufferedReader(new InputStreamReader(System.in)); System.out.println("输入字符, 按下'q' 键退出."); //读取字符do{ c=(char)br.read(); System.out.println(c); }while(c!='q'); } }
ผลการรวบรวมและการทำงานของตัวอย่างข้างต้นมีดังนี้:
输入字符, 按下'q' 键退出. 123abcq 1 2 3 a b c q
การอ่านสตริงจากอินพุตมาตรฐานต้องใช้เมธอด readLine() ของ BufferedReader
รูปแบบทั่วไปของมันคือ:
StringreadLine()throwsIOException
โปรแกรมต่อไปนี้จะอ่านและแสดงบรรทัดของอักขระจนกว่าคุณจะป้อนคำว่า "end"
//使用BufferedReader在控制台读取字符importjava.io.*; publicclassBRReadLines{ publicstaticvoidmain(Stringargs[])throwsIOException { //使用System.in创建BufferedReader BufferedReaderbr=newBufferedReader(new InputStreamReader(System.in)); Stringstr; System.out.println("Enterlinesoftext."); System.out.println("Enter'end'toquit."); do{ str=br.readLine(); System.out.println(str); }while(!str.equals("end")); } }
ผลการรวบรวมและการทำงานของตัวอย่างข้างต้นมีดังนี้:
Enterlinesoftext. Enter'end'toquit. Thisislineone Thisislineone Thisislinetwo Thisislinetwo end end
ตามที่กล่าวไว้ก่อนหน้านี้ เอาต์พุตคอนโซลเสร็จสมบูรณ์โดย print() และ println() วิธีการเหล่านี้ถูกกำหนดโดยคลาส PrintStream และ System.out เป็นการอ้างอิงถึงวัตถุของคลาสนี้
PrintStream สืบทอดคลาส OutputStream และใช้วิธีการเขียน () ด้วยวิธีนี้ write() ยังสามารถใช้เพื่อเขียนการดำเนินการไปยังคอนโซลได้
PrintStream กำหนด write() ในรูปแบบที่ง่ายที่สุดดังนี้:
voidwrite(intbyteval)
เมธอดนี้จะเขียนออคเต็ตล่างของ byteval ไปยังสตรีม
ตัวอย่างต่อไปนี้ใช้ write() เพื่อพิมพ์อักขระ "A" ตามด้วยอักขระขึ้นบรรทัดใหม่ไปที่หน้าจอ:
importjava.io.*; //演示System.out.write(). publicclassWriteDemo{ publicstaticvoidmain(Stringargs[]){ intb; b='A'; System.out.write(b); System.out.write('n'); } }
เรียกใช้ตัวอย่างข้างต้นเพื่อส่งออกอักขระ "A" ในหน้าต่างเอาต์พุต
A
หมายเหตุ: เมธอด write() ไม่ค่อยถูกใช้บ่อยนัก เนื่องจากเมธอด print() และ println() สะดวกในการใช้งานมากกว่า
ตามที่กล่าวไว้ก่อนหน้านี้ สตรีมถูกกำหนดให้เป็นลำดับของข้อมูล สตรีมอินพุตใช้เพื่ออ่านข้อมูลจากแหล่งที่มา และสตรีมเอาต์พุตใช้เพื่อเขียนข้อมูลไปยังเป้าหมาย
รูปต่อไปนี้เป็นแผนภาพลำดับชั้นของคลาสที่อธิบายสตรีมอินพุตและสตรีมเอาต์พุต
สตรีมสำคัญสองรายการที่จะกล่าวถึงด้านล่างนี้คือ FileInputStream และ FileOutputStream:
สตรีมนี้ใช้เพื่ออ่านข้อมูลจากไฟล์ และสามารถสร้างออบเจ็กต์ได้โดยใช้คีย์เวิร์ดใหม่
มีวิธีคอนสตรัคเตอร์หลายวิธีที่ใช้ในการสร้างวัตถุ
คุณสามารถใช้ชื่อไฟล์สตริงเพื่อสร้างวัตถุสตรีมอินพุตเพื่ออ่านไฟล์:
InputStreamf=newFileInputStream("C:/java/hello");
คุณยังสามารถใช้วัตถุไฟล์เพื่อสร้างวัตถุสตรีมอินพุตเพื่ออ่านไฟล์ได้ ก่อนอื่นเราต้องสร้างวัตถุไฟล์โดยใช้เมธอด File():
Filef=newFile("C:/java/hello"); InputStreamf=newFileInputStream(f);
หลังจากสร้างออบเจ็กต์ InputStream แล้ว คุณสามารถใช้วิธีการต่อไปนี้เพื่ออ่านสตรีมหรือดำเนินการสตรีมอื่นๆ ได้
หมายเลขซีเรียล | วิธีการและคำอธิบาย |
---|---|
1 | โมฆะสาธารณะ close() พ่น IOException{} ปิดสตรีมอินพุตของไฟล์นี้ และเผยแพร่ทรัพยากรระบบทั้งหมดที่เกี่ยวข้องกับสตรีมนี้ พ่น IOException |
2 | ป้องกันเป็นโมฆะสรุป () พ่น IOException {} วิธีการนี้จะล้างการเชื่อมต่อกับไฟล์ ตรวจสอบให้แน่ใจว่าได้เรียกวิธีการปิดของสตรีมอินพุตไฟล์เมื่อไม่มีการอ้างอิงอีกต่อไป พ่น IOException |
3 | int สาธารณะอ่าน (int r) พ่น IOException {} วิธีการนี้อ่านข้อมูลไบต์ที่ระบุจากวัตถุ InputStream ส่งกลับเป็นค่าจำนวนเต็ม ส่งกลับไบต์ข้อมูลถัดไป หรือ -1 หากถึงจุดสิ้นสุดแล้ว |
4 | int สาธารณะอ่าน (ไบต์ [] r) พ่น IOException {} วิธีการนี้จะอ่านไบต์ r.length จากสตรีมอินพุต ส่งกลับจำนวนไบต์ที่อ่าน หากเป็นจุดสิ้นสุดของไฟล์ -1 จะถูกส่งกลับ |
5 | public int available() พ่น IOException{} ส่งกลับจำนวนไบต์ที่สามารถอ่านได้จากสตรีมอินพุตนี้ โดยไม่ปิดกั้นโดยการเรียกเมธอดถัดไปในสตรีมอินพุตนี้ ส่งกลับค่าจำนวนเต็ม |
นอกจาก InputStream แล้ว ยังมีอินพุตสตรีมอื่นๆ สำหรับรายละเอียดเพิ่มเติม โปรดดูที่ลิงก์ด้านล่าง:
ByteArrayInputStream
DataInputStream
คลาสนี้ใช้เพื่อสร้างไฟล์และเขียนข้อมูลลงในไฟล์
หากไม่มีไฟล์เป้าหมายก่อนที่สตรีมจะเปิดไฟล์สำหรับเอาต์พุต สตรีมจะสร้างไฟล์ขึ้นมา
มีตัวสร้างสองตัวที่สามารถใช้เพื่อสร้างวัตถุ FileOutputStream
สร้างวัตถุกระแสออกโดยใช้ชื่อไฟล์สตริง:
OutputStreamf=newFileOutputStream("C:/java/hello")
คุณยังสามารถใช้วัตถุไฟล์เพื่อสร้างสตรีมเอาต์พุตเพื่อเขียนลงในไฟล์ได้ ก่อนอื่นเราต้องสร้างวัตถุไฟล์โดยใช้เมธอด File():
Filef=newFile("C:/java/hello"); OutputStreamf=newFileOutputStream(f);
หลังจากสร้างออบเจ็กต์ OutputStream แล้ว คุณสามารถใช้วิธีต่อไปนี้เพื่อเขียนลงในสตรีมหรือดำเนินการสตรีมอื่นๆ ได้
หมายเลขซีเรียล | วิธีการและคำอธิบาย |
---|---|
1 | โมฆะสาธารณะ close() พ่น IOException{} ปิดสตรีมอินพุตของไฟล์นี้ และเผยแพร่ทรัพยากรระบบทั้งหมดที่เกี่ยวข้องกับสตรีมนี้ พ่น IOException |
2 | ป้องกันเป็นโมฆะสรุป () พ่น IOException {} วิธีการนี้จะล้างการเชื่อมต่อกับไฟล์ ตรวจสอบให้แน่ใจว่าได้เรียกวิธีการปิดของสตรีมอินพุตไฟล์เมื่อไม่มีการอ้างอิงอีกต่อไป พ่น IOException |
3 | โมฆะสาธารณะเขียน (int w) พ่น IOException {} วิธีการนี้จะเขียนไบต์ที่ระบุไปยังกระแสข้อมูลขาออก |
4 | โมฆะสาธารณะเขียน (ไบต์ [] w) เขียนไบต์ความยาว w.length ในอาร์เรย์ที่ระบุไปยัง OutputStream |
นอกจาก OutputStream แล้ว ยังมีเอาต์พุตอื่นๆ อีกด้วย สำหรับรายละเอียดเพิ่มเติม โปรดดูที่ลิงก์ด้านล่าง:
ByteArrayOutputStream
DataOutputStream
นี่คือตัวอย่างที่สาธิตการใช้ InputStream และ OutputStream:
import java.io.*; public class fileStreamTest { public static void main(String args[]) { try { byte bWrite[] = { 11, 21, 3, 40, 5 }; OutputStream os = new FileOutputStream("test.txt"); for (int x = 0; x < bWrite.length; x++) { os.write(bWrite[x]); // writes the bytes } os.close(); InputStream is = new FileInputStream("test.txt"); int size = is.available(); for (int i = 0; i < size; i++) { System.out.print((char) is.read() + " "); } is.close(); } catch (IOException e) { System.out.print("Exception"); } } }
โปรแกรมข้างต้นจะสร้างไฟล์ test.txt ก่อน เขียนหมายเลขที่กำหนดลงในไฟล์ในรูปแบบไบนารี่ และส่งออกไปยังคอนโซล
เนื่องจากโค้ดด้านบนเขียนด้วยไบนารี อาจมีอักขระที่อ่านไม่ออก คุณสามารถใช้ตัวอย่างโค้ดต่อไปนี้เพื่อแก้ปัญหาโค้ดที่อ่านไม่ออก:
//文件名:fileStreamTest2.java importjava.io.*; publicclassfileStreamTest2{ publicstaticvoidmain(String[]args)throwsIOException{ Filef=newFile("a.txt"); FileOutputStreamfop=newFileOutputStream(f); //构建FileOutputStream对象,文件不存在会自动新建OutputStreamWriterwriter=newOutputStreamWriter(fop,"UTF-8"); //构建OutputStreamWriter对象,参数可以指定编码,默认为操作系统默认编码,windows上是gbk writer.append("中文输入"); //写入到缓冲区writer.append("rn"); //换行writer.append("English"); //刷新缓存冲,写入到文件,如果下面已经没有写入的内容了,直接close也会写入writer.close(); //关闭写入流,同时会把缓冲区内容写入文件,所以上面的注释掉fop.close(); //关闭输出流,释放系统资源 FileInputStreamfip=newFileInputStream(f); //构建FileInputStream对象InputStreamReaderreader=newInputStreamReader(fip,"UTF-8"); //构建InputStreamReader对象,编码与写入相同 StringBuffersb=newStringBuffer(); while(reader.ready()){ sb.append((char)reader.read()); //转成char加到StringBuffer对象中 } System.out.println(sb.toString()); reader.close(); //关闭读取流fip.close(); //关闭输入流,释放系统资源 } }
นอกจากนี้ยังมีคลาสบางส่วนเกี่ยวกับไฟล์และ I/O ที่เราต้องรู้ด้วย:
คลาสไฟล์(คลาส)
คลาส FileReader (คลาส)
คลาส FileWriter (คลาส)
มีสองวิธีในคลาส File ที่สามารถใช้เพื่อสร้างโฟลเดอร์:
เมธอด mkdir() จะสร้างโฟลเดอร์และส่งกลับค่าจริงหากสำเร็จ และคืนค่าเท็จหากล้มเหลว ความล้มเหลวบ่งชี้ว่าเส้นทางที่ระบุโดยวัตถุ File มีอยู่แล้ว หรือไม่สามารถสร้างโฟลเดอร์ได้เนื่องจากเส้นทางทั้งหมดยังไม่มีอยู่
mkdirs() วิธีการสร้างโฟลเดอร์และโฟลเดอร์หลักทั้งหมด
ตัวอย่างต่อไปนี้สร้างโฟลเดอร์ "/tmp/user/java/bin":
importjava.io.File; publicclassCreateDir{ publicstaticvoidmain(Stringargs[]){ Stringdirname="/tmp/user/java/bin"; Filed=newFile(dirname); //现在创建目录d.mkdirs(); } }
คอมไพล์และรันโค้ดด้านบนเพื่อสร้างไดเร็กทอรี "/tmp/user/java/bin"
หมายเหตุ: Java จะแก้ไขตัวคั่นพาธไฟล์โดยอัตโนมัติตามแบบแผนบน UNIX และ Windows หากคุณใช้ตัวคั่น (/) ใน Java เวอร์ชัน Windows เส้นทางจะยังคงถูกแยกวิเคราะห์อย่างถูกต้อง
จริงๆ แล้วไดเร็กทอรีคือออบเจ็กต์ไฟล์ที่มีไฟล์และโฟลเดอร์อื่นๆ
หากคุณสร้างอ็อบเจ็กต์ File และมันคือไดเร็กทอรี การเรียกเมธอด isDirectory() จะส่งคืนค่าเป็นจริง
คุณสามารถแตกรายการไฟล์และโฟลเดอร์ที่มีอยู่ได้โดยการเรียกเมธอด list() บนอ็อบเจ็กต์
ตัวอย่างที่แสดงด้านล่างนี้แสดงให้เห็นถึงวิธีการใช้ list() วิธีการตรวจสอบเนื้อหาของโฟลเดอร์:
importjava.io.File; publicclassDirList{ publicstaticvoidmain(Stringargs[]){ Stringdirname="/tmp"; Filef1=newFile(dirname); if(f1.isDirectory()){ System.out.println("Directoryof"+dirname); Strings[]=f1.list(); for(inti=0;i<s.length;i++){ Filef=newFile(dirname+"/"+s[i]); if(f.isDirectory()){ System.out.println(s[i]+"是一个目录"); }else{ System.out.println(s[i]+"是一个文件"); } } }else{ System.out.println(dirname+"不是一个目录");
} } }
ผลการรวบรวมและการทำงานของตัวอย่างข้างต้นมีดังนี้:
目录/tmp bin 是一个目录lib 是一个目录demo 是一个目录test.txt 是一个文件README 是一个文件index.html 是一个文件include 是一个目录
หากต้องการลบไฟล์ ให้ใช้เมธอด java.io.File.delete()
โค้ดต่อไปนี้จะลบไดเร็กทอรี /tmp/java/ ควรสังเกตว่าเมื่อลบไดเร็กทอรีบางไดเร็กทอรี คุณต้องแน่ใจว่าไม่มีไฟล์อื่นในไดเร็กทอรีที่จะลบอย่างถูกต้อง มิฉะนั้นการลบจะล้มเหลว
ทดสอบโครงสร้างไดเร็กทอรี:
/tmp/จาวา/ |-- 1.log |--ทดสอบ
import java.io.File; public class DeleteFileDemo { public static void main(String args[]) { // 这里修改为自己的测试目录File folder = new File("/tmp/java/"); deleteFolder(folder); } // 删除文件及目录public static void deleteFolder(File folder) { File[] files = folder.listFiles(); if (files != null) { for (File f : files) { if (f.isDirectory()) { deleteFolder(f); } else { f.delete(); } } } folder.delete(); } }