อินเทอร์เฟซพา ธ
1. เส้นทางแสดงลำดับของชื่อไดเรกทอรีตามด้วยชื่อไฟล์ เมื่อองค์ประกอบแรกในพา ธ คือส่วนประกอบรูทมันเป็นเส้นทางที่แน่นอนเช่น / หรือ c: / และส่วนประกอบรูทที่อนุญาตให้เข้าถึงได้ขึ้นอยู่กับระบบไฟล์
2. เส้นทางที่เริ่มต้นด้วยองค์ประกอบรูทเป็นเส้นทางที่แน่นอนมิฉะนั้นจะเป็นเส้นทางสัมพัทธ์
3. เส้นทางคงที่วิธีการรับหนึ่งหรือมากกว่าสตริงและสตริงจะเชื่อมต่อโดยอัตโนมัติโดยตัวคั่นพา ธ ของระบบไฟล์เริ่มต้น (UNIX IS /, Windows IS /) ซึ่งแก้ปัญหาข้ามแพลตฟอร์ม จากนั้นแยกวิเคราะห์ผลลัพธ์ที่เชื่อมต่อ หากไม่ใช่เส้นทางทางกฎหมายข้อยกเว้นที่ไม่ถูกต้องจะถูกโยนออกไปมิฉะนั้นวัตถุเส้นทางจะถูกส่งคืน;
// สมมติว่ามันเป็นเส้นทางระบบไฟล์ UNIX Absolute = paths.get ("/home", "cat"); // เส้นทางเส้นทางสัมบูรณ์ญาติ = pahts.get ("ixenos", "config", "user.properties"); // เส้นทางสัมพัทธ์4. รับวัตถุเส้นทางจากเส้นทางสตริง
รับยังสามารถรับเส้นทางทั้งหมด (เช่นสตริงเดียวที่ประกอบด้วยหลายองค์ประกอบ) ตัวอย่างเช่นอ่านพา ธ จากไฟล์กำหนดค่า:
String -basedir = properties.getProperty ("base.dir"); // อาจได้รับ/opt/ixenos หรือ c:/ไฟล์โปรแกรม/ixenos path basepath = paths.get (พื้นฐาน);5. การรวมหรือแยกเส้นทาง
1) การโทร p.resolve (q) จะส่งคืนเส้นทางตามกฎต่อไปนี้: หาก q เป็นเส้นทางที่แน่นอนให้ส่งคืน q มิฉะนั้นเส้นทางต่อท้ายจะส่งคืน p/q หรือ p/q
เส้นทาง workrelative = paths.get ("work"); path workpath = basepath.resolve (workrelative); // Resolve ยังสามารถยอมรับพารามิเตอร์สตริง PATH WORKPATH = basepath.resolve ("งาน");2) การโทร p.resolvesibling ("q") จะแก้ไขเส้นทางแม่ o ของเส้นทางที่ระบุ p และสร้างเส้นทางพี่น้อง o/q
เส้นทาง temppath = workpath.resolvesibling ("temp"); / * ถ้า workpath คือ/opt/ixenos/work ดังนั้น/opt/ixenos/temp จะถูกสร้างขึ้น *//3) การโทร p.relativize (r) จะสร้างเส้นทางที่ซ้ำซ้อน q การแยกวิเคราะห์ Q จะสร้างเส้นทางสัมพัทธ์ r ในท้ายที่สุด R ไม่มีเส้นทางสี่แยกด้วย p
/* patha คือ/home/misty pathb คือ/home/ixenos/config ตอนนี้ patha มี pathb ที่เกี่ยวข้องซึ่งจะสร้างเส้นทางที่ซ้ำซ้อน*/pathc = patha.relativize (pathb); // ในเวลานี้ Pathc คือ ../ixenos/config/* วิธีการปกติจะลบส่วนที่ซ้ำซ้อน*/path pathd = pathc.normalize (); // pathd คือ/ixenos/config
4) Toabsolutepath จะสร้างเส้นทางที่แน่นอนของเส้นทางที่กำหนดโดยเริ่มจากส่วนประกอบรูท
5) คลาสพา ธ ยังมีวิธีการที่มีประโยชน์บางอย่างในการตัดการเชื่อมต่อและรวมเส้นทางเช่น getParent, getFilename, getRoot // รับไดเรกทอรีราก
6) PATH มีวิธีการ tofile ในการจัดการกับคลาสไฟล์แบบดั้งเดิมและคลาสไฟล์ยังมีวิธีการ TOPATH
คลาสเครื่องมือไฟล์
1. อ่านและเขียนไฟล์
ลายเซ็นวิธี:
เส้นทางคงที่เขียน (เส้นทางเส้นทาง, ไบต์ [] ไบต์, openoption ... ตัวเลือก)
เส้นทางการเขียนแบบคงที่ (เส้นทางเส้นทาง, iterable <? ขยาย charsequence> บรรทัด, openoption ... ตัวเลือก)
นี่เป็นเพียงวิธีการที่ใช้ด้านล่าง สำหรับวิธีการเพิ่มเติมโปรดดูเอกสาร API ...
ในหมู่พวกเขา OpenOption เป็นอินเทอร์เฟซ NIO, StandardOpenOption คือคลาสการใช้งานการแจงนับ โปรดตรวจสอบเอกสาร API สำหรับแต่ละฟังก์ชันการแจงนับ
/* วิธีง่ายๆที่จัดทำโดยไฟล์เหมาะสำหรับการประมวลผลไฟล์ข้อความความยาวปานกลาง หากไฟล์ที่จะประมวลผลมีขนาดใหญ่หรือไบนารีคุณควรใช้สตรีม IO แบบคลาสสิก*/// อ่านเนื้อหาทั้งหมดของไฟล์ลงในไบต์อาร์เรย์ไบต์ [] bytes = files.readallBytes (พา ธ ); // ส่งผ่านไปยังวัตถุพา ธ // หลังจากนั้นคุณสามารถสร้างสตริงตามชุดสตริงชุดอักขระ = สตริงใหม่ (ไบต์, charset); // คุณยังสามารถอ่านได้โดยตรงเป็นลำดับบรรทัดลงในรายการ <string> lines = files.readalllines (path, charset); // ในทางตรงกันข้าม // หยุด byte [] // ต่อท้ายเนื้อหากำหนดฟังก์ชั่นการผนวกเช่นเพิ่มตามพารามิเตอร์ไฟล์การเขียน (พา ธ , content.getBytes (charset), StandardOpenOption.Append); // หยุดวัตถุการแจงนับชั่วคราวและเปิดสวิตช์ภาคผนวก // เขียนรายการคอลเลกชันของสตริงบรรทัดลงในไฟล์ไฟล์การเขียน (เส้นทาง, บรรทัด);
2. คัดลอกตัดลบ
ลายเซ็นวิธี:
การคัดลอกเส้นทางคงที่ (แหล่งที่มาของพา ธ เป้าหมาย, copyoption ... ตัวเลือก)
การเคลื่อนที่ของเส้นทางแบบคง
Void DELETE แบบคงที่ (เส้นทางเส้นทาง) // หากไม่มีเส้นทางจะมีข้อยกเว้นจะถูกโยนทิ้ง จะดีกว่าที่จะเรียกสิ่งต่อไปนี้ในเวลานี้
บูลีนแบบคงที่ deleteifexists (เส้นทาง)
นี่เป็นเพียงวิธีการที่ใช้ด้านล่าง สำหรับวิธีการเพิ่มเติมโปรดดูเอกสาร API ...
ในหมู่พวกเขา CopyOption เป็นอินเทอร์เฟซ NIO, StandardCopyOption คือคลาสการใช้งานการแจงนับ โปรดตรวจสอบเอกสาร API สำหรับแต่ละฟังก์ชันการแจงนับ
มี Atomic_move ที่สามารถกรอกข้อมูลเพื่อให้แน่ใจว่าการดำเนินการของอะตอมไม่ว่าจะเป็นการเคลื่อนไหวที่เสร็จสมบูรณ์หรือไฟล์ต้นฉบับจะถูกเก็บไว้ในตำแหน่งเดิม
// คัดลอก files.copy (frompath, topath); // cut files.move (frompath, topath);/* หากมีอยู่แล้วมีอยู่แล้วการดำเนินการล้มเหลว หากคุณต้องการเขียนทับคุณจะต้องส่งผ่านพารามิเตอร์ replic_existing นอกจากนี้ยังคัดลอกแอตทริบิวต์ไฟล์ผ่านใน copy_attributes*/files.copy (FromPath, topath, StandardCopyOption.replace_existing, StandardCopyOption.COPY_ATTRIBUTES);
3. สร้างไฟล์และไดเรกทอรี
// สร้างไดเรกทอรีใหม่ยกเว้นส่วนประกอบสุดท้ายส่วนอื่น ๆ จะต้องเป็นไฟล์ที่มีอยู่ createdirectory (เส้นทาง); // สร้างไดเรกทอรีระดับกลางในเส้นทางซึ่งสามารถสร้างไฟล์ส่วนประกอบกลางที่ไม่มีอยู่จริง createdirectories (พา ธ );/* สร้างไฟล์ที่ว่างเปล่าเพื่อตรวจสอบการมีอยู่ของไฟล์ หากมีอยู่แล้วข้อยกเว้นจะถูกโยนลงไปเพื่อตรวจสอบการมีอยู่ของไฟล์ ดังนั้นการดำเนินการสร้างไฟล์ไม่สามารถดำเนินการในกระบวนการ*/files.createFile (พา ธ ); // เพิ่ม pre-/คำต่อท้ายเพื่อสร้างไฟล์ชั่วคราวหรือเส้นทางไดเรกทอรีชั่วคราว newpath = files.createTempfile (dir, คำนำหน้า, คำต่อท้าย);
4. รับข้อมูลไฟล์
ละเว้นดูเอกสาร API สำหรับรายละเอียดหรือ CoreJava หน้า 51
5. วนซ้ำไฟล์ในไดเรกทอรี
คลาสไฟล์เก่ามีสองวิธีในการรับสตริงอาร์เรย์ที่ประกอบด้วยไฟล์ทั้งหมดในไดเรกทอรี, string [] list () และ string [] รายการ (ตัวกรอง filefilter) แต่เมื่อไดเรกทอรีมีไฟล์จำนวนมากประสิทธิภาพของสองวิธีนี้จะต่ำมาก
การวิเคราะห์สาเหตุ:
1. // ไฟล์คลาสไฟล์ทั้งหมดไฟล์สาธารณะสตริง [] รายการ () {SecurityManager Security = System.getSecurityManager (); // สิทธิ์ระบบไฟล์ได้รับถ้า (ความปลอดภัย! = null) {security.checkread (พา ธ ); } if (isinvalid ()) {return null; } return fs.list (นี้); // การเรียกพื้นฐานไปยังรายการของระบบไฟล์} // รายการของระบบไฟล์บทคัดย่อคลาสนามธรรม // การอนุญาตระบบไฟล์กำหนดว่า (ความปลอดภัย! = null) {security.checkread (พา ธ ); } if (isinvalid ()) {return null; } return fs.list (นี้); // การเรียกพื้นฐานไปยังรายการของระบบไฟล์} // รายการของระบบไฟล์บทคัดย่อคลาสนามธรรม // คลาสไฟล์กำหนด FS เป็นระบบไฟล์สุดท้ายแบบคงที่ที่สร้างขึ้นแบบคงที่โดย defaultFilesystem fs = defaultFilesystem.getFilesystem (); // วัตถุระบบไฟล์สำหรับแพลตฟอร์ม Windows */ ระบบไฟล์คงที่สาธารณะ getFilesystem () {ส่งคืน winntfilesystem ใหม่ (); }} // คลาส winntfilesystem สืบทอดมาจากคลาสนามธรรมของระบบไฟล์ ที่นี่เราสังเกตรายการ (ไฟล์ไฟล์) เป็นหลัก @OverridEpublic Native String [] รายการ (ไฟล์ f);/*เราจะเห็นว่านี่เป็นวิธีการดั้งเดิมซึ่งแสดงให้เห็นว่าการทำงานของรายการถูกควบคุมโดยระบบไฟล์ของระบบปฏิบัติการ เมื่อไดเรกทอรีมีไฟล์จำนวนมากประสิทธิภาพของวิธีนี้จะต่ำมาก ดังนั้นเพื่อที่จะแทนที่คลาสไฟล์ของ NIO จึงออกแบบ NewDirectoryStream (Path DIR) และวิธีการโอเวอร์โหลดซึ่งจะสร้างวัตถุที่วนซ้ำ (สามารถทำซ้ำ foreach) */// ~ 2. // การเรียกใช้สตริงสาธารณะ // การโทรรายการทั้งหมด if ((ชื่อ == null) || (ตัวกรอง == null)) {return names; } รายการ <String> v = arrayList ใหม่ <> (); สำหรับ (int i = 0; i <names.length; i ++) {ถ้า (filter.accept (นี่, ชื่อ [i])) {// callback วิธีการยอมรับของวัตถุ filenamefileter v.add (ชื่อ [i]); }} return v.toarray (สตริงใหม่ [v.size ()]); -ในเวลานี้เทคโนโลยีชั้นสูงมา - ไฟล์ได้รับกระแสไดเรกทอรีแบบ iterable
ผ่านในเส้นทางไดเรกทอรีสำรวจไดเรกทอรีลูกหลานและส่งคืนกระแสเส้นทางไดเรกทอรี โปรดทราบว่าเส้นทางทั้งหมดที่เกี่ยวข้องที่นี่เป็นไดเรกทอรีมากกว่าไฟล์!
ดังนั้นคลาสไฟล์จึงออกแบบ NewDirectoryStream (Path DIR) และวิธีการเกินพิกัดซึ่งจะสร้างวัตถุที่วนซ้ำ (สามารถใช้ foreach iterate ได้)
วนซ้ำผ่านไดเรกทอรีเพื่อรับคอลเลกชันของไฟล์ลูกหลานที่วนซ้ำ
staticDirectoryStream<Path> | newDirectoryStream(Path dir) เปิดไดเรกทอรีส่งคืน DirectoryStream ร์ให้วนซ้ำทุกรายการในไดเรกทอรี |
staticDirectoryStream<Path> | newDirectoryStream(Path dir, DirectoryStream.Filter<? super Path> filter) เปิดไดเรกทอรีส่งคืน DirectoryStream เพื่อวนซ้ำรายการในไดเรกทอรี |
staticDirectoryStream<Path> | newDirectoryStream(Path dir, String glob) |
การส่งคืนไดเรกทอรีอาจถือได้ว่าเป็นคอลเลกชันที่เก็บทุกเส้นทางที่ใช้งานได้
ดังนั้นตัววนซ้ำหรือ foreach iterates แต่เมื่อใช้ตัววนซ้ำต้องระวังอย่าเรียกใช้ตัววนซ้ำอื่น:
ในขณะที่ DirectoryStream ขยายการวนซ้ำ แต่ก็ไม่ได้เป็นแบบทั่วไปที่ใช้งานได้ทั่วไปเนื่องจากรองรับตัววนซ้ำเพียงตัวเดียวเท่านั้น การเรียกใช้วิธีการวนซ้ำเพื่อให้ได้ตัววนซ้ำครั้งที่สองหรือครั้งต่อไปจะทำการตรวจสอบผิดกฎหมาย
ตัวอย่าง:
ลอง (DirectoryStream <Path> รายการ = files.newdirectorystream (dir)) {สำหรับ (รายการพา ธ : รายการ) {... }}คุณสามารถส่งผ่านพารามิเตอร์ GLOB นั่นคือใช้โหมด GLOB เพื่อกรองไฟล์ (แทนที่จะเป็นรายการ (ตัวกรอง fileFilter)):
NewDirectoryStream (Path Dir, String Glob) โปรดทราบว่ามันเป็นประเภทสตริง
ลอง (DirectoryStream <Path> รายการ = files.newdirectorystream (dir, "*.java")) // {... }โหมดลูกโลก
รูปแบบลูกโลกที่เรียกว่าหมายถึงนิพจน์ทั่วไปที่เรียบง่ายที่ใช้โดยเชลล์
1. ASTERISK* จับคู่อักขระ 0 หรือมากกว่าในส่วนประกอบพา ธ ตัวอย่างเช่น *.java ตรงกับไฟล์ Java ทั้งหมดในไดเรกทอรีปัจจุบัน
2. เครื่องหมายดอกจันสองอัน ** จับคู่อักขระ 0 หรือมากกว่าในขอบเขตไดเรกทอรี ตัวอย่างเช่น **. Java จับคู่ไฟล์ Java ในไดเรกทอรีย่อยทั้งหมด
3. เครื่องหมายคำถาม (?) ตรงกับตัวละครเดียวเท่านั้น ตัวอย่างเช่น ????. Java จับคู่อักขระทั้งสี่ของไฟล์ Java ไม่รวมส่วนขยาย; ใช้ ? เพราะ * เป็นอักขระไวด์การ์ดและไม่ได้ระบุหมายเลข
4. [... ] เพื่อให้ตรงกับชุดอักขระคุณสามารถใช้การเชื่อมต่อ [0-9] และตัวละครผกผัน [! 0-9]; ตัวอย่างเช่นการทดสอบ [0-9a-f] .java เพื่อจับคู่ testx.java สมมติว่า x เป็นเลขฐานสิบหก, [0-9a-f] คือการจับคู่ตัวละครตัวเดียวเป็นเลขฐานสิบหกเช่น B (hexadecimal
หากคุณใช้เส้นประในวงเล็บเหลี่ยมเพื่อแยกอักขระสองตัวนั่นหมายความว่าทั้งหมดที่อยู่ในช่วงของอักขระทั้งสองนี้สามารถจับคู่ได้ (ตัวอย่างเช่น [0-9] หมายถึงการจับคู่หมายเลข 0 ถึง 9 ทั้งหมด)
5. {... } จับคู่หนึ่งในตัวเลือกทางเลือกหลายตัวคั่นด้วยเครื่องหมายจุลภาค; ตัวอย่างเช่น *. {java, class} จับคู่ไฟล์ Java และไฟล์คลาสทั้งหมด
6./ Escape อักขระในรูปแบบใด ๆ ข้างต้น; ตัวอย่างเช่น */** จับคู่ไฟล์ที่มีชื่อไฟล์ในไดเรกทอรีย่อยทั้งหมดด้วย *นี่คือ ** Escape นำหน้าด้วยการจับคู่ 0 หรือมากกว่าอักขระ
ต่อไปนี้เป็นโมเดล GLOB ที่สรุปโดยชาวเน็ต:
| โหมดลูกโลก | อธิบาย |
|---|---|
| *.txt | จับคู่ไฟล์ทั้งหมดด้วยส่วนขยาย. txt |
| *. {html, htm} | จับคู่ไฟล์ทั้งหมดด้วยส่วนขยายของ. html หรือ .htm {} ใช้สำหรับโหมดกลุ่มซึ่งคั่นด้วยเครื่องหมายจุลภาค |
| ? .txt | จับคู่อักขระตัวเดียวเป็นชื่อไฟล์และส่วนขยาย. txt |
| - | จับคู่ไฟล์ทั้งหมดกับส่วนขยาย |
| C:/ผู้ใช้/* | จับคู่ไฟล์ทั้งหมดในไดเรกทอรีผู้ใช้ของไดรฟ์ C backslash "/" ใช้เพื่อหลบหนีอักขระต่อไปนี้ทันที |
| /บ้าน/** | จับคู่ไดเรกทอรีและไฟล์ทั้งหมดและไฟล์ภายใต้ไดเรกทอรีย่อยบนแพลตฟอร์ม UNIX ** ใช้เพื่อจับคู่ไดเรกทอรีปัจจุบันและไดเรกทอรีย่อยทั้งหมด |
| [xyz] .txt | จับคู่อักขระเดี่ยวทั้งหมดเป็นชื่อไฟล์และอักขระตัวเดียวมีเพียงหนึ่งใน "x" หรือ "y" หรือ "z" และมีส่วนขยายของ. txt square brackets [] ใช้เพื่อระบุคอลเลกชัน |
| [ac] .txt | จับคู่อักขระเดี่ยวทั้งหมดเป็นชื่อไฟล์และอักขระตัวเดียวมีเพียงหนึ่งในสามประเภทของ "A" หรือ "B" หรือ "C" และมีส่วนขยายของ. txt เครื่องหมายลบ "-" ใช้เพื่อระบุช่วงและสามารถใช้ในวงเล็บเหลี่ยมได้เท่านั้น [] |
| [! a] .txt | จับคู่อักขระเดียวทั้งหมดเป็นชื่อไฟล์และอักขระตัวเดียวไม่สามารถมีตัวอักษร "A" และส่วนขยายคือ. txt เครื่องหมายอุทาน "!" ใช้เพื่อลบล้าง |
มันไม่ดีที่จะทำซ้ำผ่านคอลเลกชันทั้งหมดของไฟล์ลูกหลานในไดเรกทอรีที่แน่นอนหรือไม่? มาเลยลองสำรวจลูกหลานทั้งหมด (รวมถึงไดเรกทอรีและไฟล์) โดยตรงของไดเรกทอรี
เราสามารถเรียกวิธีการ walkfiletree ของคลาสไฟล์และส่งผ่านในวัตถุของประเภทอินเทอร์เฟซ filevisitor (มีวิธีการเพิ่มเติมรอให้คุณค้นพบใน API ... )
/*ผ่านวัตถุที่ไม่ระบุชื่อของ subclass filevisitor*/files.walkfileTree (dir, ใหม่ SimpleFileVisitor <path> () {// การเรียก walkfiletree วิธีนี้ใช้ในการสำรวจ descendants ทั้งหมด เป็นของประมวลกฎหมายธุรกิจซึ่งไม่มีส่วนเกี่ยวข้องกับจุดประสงค์ของ Walkfiletree (สำรวจสมาชิกลูกหลานทั้งหมด) ระบบ. println (เส้นทาง);มาสรุปกันเถอะ
files.newdirectorystream (Path DIR) ส่งคืนคอลเลกชันที่วนซ้ำของไฟล์ลูกหลานหลังจาก Traversal;
files.walkFileTree (Path Dir, Filevisitor FV) เป็นกระบวนการของการสำรวจไดเรกทอรีและไฟล์ของลูกหลาน
ระบบไฟล์ zip
ดังที่เราทราบข้างต้นคลาสพา ธ จะค้นหาเส้นทางในระบบไฟล์เริ่มต้นนั่นคือไฟล์บนดิสก์ท้องถิ่นของผู้ใช้
ในความเป็นจริงเราสามารถมีระบบไฟล์อื่น ๆ เช่นระบบไฟล์ ZIP
/*สมมติว่า zipname เป็นชื่อของไฟล์ zip*/filesystem fs = filesystems.newfilesystem (paths.get (zipname), null);
รหัสด้านบนจะสร้างระบบไฟล์ที่ใช้ ZipName ที่มีไฟล์ทั้งหมดในเอกสาร ZIP
1) หากคุณรู้ชื่อไฟล์ (ประเภทสตริง) มันง่ายที่จะคัดลอกไฟล์จากเอกสาร ZIP นี้:
files.copy (fs.getPath (ชื่อไฟล์), TargetPath);
ถาม: Fs.getPath ใช้ระบบไฟล์ zip เพื่อ getPath ดังนั้นระบบไฟล์เริ่มต้นจะถูกเรียกได้หรือไม่?
ก. ใช่. มีเมธอด getDefault () แบบคงที่ในคลาสระบบไฟล์ซึ่งส่งคืนวัตถุระบบไฟล์เริ่มต้นซึ่งสามารถรับได้โดยชื่อไฟล์ getPath
สำหรับวัตถุประสงค์เฉพาะไม่ว่าจะเป็น GetPath (ชื่อสตริง) จะถูกสำรวจหรือการเข้าถึงแบบสุ่มให้ไปดูการใช้ซอร์สโค้ดเมื่อคุณมีเวลา
2) ในการแสดงรายการไฟล์ทั้งหมดในเอกสาร ZIP คุณยังสามารถใช้ WalkFileTree เพื่อสำรวจแผนผังไฟล์
ระบบไฟล์ fs = filesystems.newfilesystem (paths.get (ชื่อไฟล์), null); // walkfiletree ต้องผ่านในเส้นทางไดเรกทอรีที่จะข้ามไปและไฟล์ filevisitor (pathfilevistriatfile โยนข้อยกเว้น {System.out.println (ไฟล์);ตัวอย่างด้านบนของอินเตอร์เฟสพา ธ Java Nio และคลาสไฟล์ที่ทำงานร่วมกันเป็นเนื้อหาทั้งหมดที่ฉันแบ่งปันกับคุณ ฉันหวังว่าคุณจะให้ข้อมูลอ้างอิงและฉันหวังว่าคุณจะสนับสนุน wulin.com มากขึ้น