File.separator กับ FileSystem.getSeparator () เทียบกับ System.getProperty (“ file.separator”)?


136

ดูเหมือนว่าจะมีสามวิธีที่เหมือนกันในการรับ "ตัวคั่นไฟล์" ที่ขึ้นกับแพลตฟอร์มโดยไม่ขึ้นกับแพลตฟอร์ม:

เราจะตัดสินใจได้อย่างไรว่าจะใช้อันไหน?

มีความแตกต่างระหว่างพวกเขาหรือไม่?


คุณไม่ได้รับตัวคั่นไฟล์ที่ขึ้นอยู่กับแพลตฟอร์มที่นี่จริงหรือ? อยู่ในคฤหาสน์ที่ไม่ขึ้นกับแพลตฟอร์ม
steinybot

@ Steiny เอออัพเดทแล้ว
Pacerier

คำถามทั่วไปของ Java มีคำตอบอย่างน้อย 3 คำตอบ
Stimpson Cat

คำตอบ:


145

System.getProperties()สามารถแทนที่ได้โดยการเรียกSystem.setProperty(String key, String value)หรือด้วยพารามิเตอร์บรรทัดคำสั่ง-Dfile.separator=/

File.separator รับตัวคั่นสำหรับระบบไฟล์ดีฟอลต์

FileSystems.getDefault() ทำให้คุณได้รับระบบไฟล์เริ่มต้น

FileSystem.getSeparator()ทำให้คุณได้รับอักขระตัวคั่นสำหรับระบบไฟล์ โปรดทราบว่าเป็นวิธีการอินสแตนซ์คุณสามารถใช้วิธีนี้เพื่อส่งผ่านระบบไฟล์ต่างๆไปยังโค้ดของคุณนอกเหนือจากค่าดีฟอลต์ในกรณีที่คุณต้องการให้โค้ดของคุณทำงานบนระบบไฟล์หลายระบบใน JVM เดียว


2
เจ๋ง = D Btw คุณช่วยอธิบายในส่วนของ "ปฏิบัติการหลายระบบไฟล์" ได้ไหม
Pacerier

4
@Pacerier ในทางทฤษฎีถ้าฉันเขียนระบบไฟล์ใหม่ (BringerFS) ที่มีอักขระคั่นเป็น ":" และคุณมีเครื่องที่มี 2 พาร์ติชันหนึ่งใน NTFS และอีกหนึ่งใน BringerFS ฟังก์ชันนี้จะอนุญาตให้คุณใช้ทั้งสองอย่าง (สมมติว่า ฉันเขียนผู้ให้บริการระบบไฟล์ Java ด้วย)
Bringer128

ฉันหมายความว่ามันมีประโยชน์จริง ๆ เช่นบอกว่ามีคนมี 2 พาร์ติชันหนึ่ง Windows และหนึ่ง UNIX และเขากำลังเรียกใช้แอพของฉัน (บนพาร์ติชัน Windows ของเขา) คลาสนั้นสามารถเข้าถึงระบบไฟล์ UNIX ของเขาได้หรือไม่ (ฉันไม่สามารถทดสอบสิ่งนี้ได้จริง ๆ เพราะฉันไม่ได้ติดตั้ง FileSystem อื่นไว้)
Pacerier

1
ฉันสงสัยว่าไดรเวอร์ส่วนใหญ่สำหรับระบบไฟล์บน Windows ทำการแปลเป็น API ระบบไฟล์ 'Windows-style' เพื่อให้ระบบปฏิบัติการและแอปที่ไม่พกพาทำงานได้ การใช้งานจริงจะต้องเป็นระบบปฏิบัติการที่รองรับระบบไฟล์ที่แปลกและยอดเยี่ยมโดยไม่มีกระบวนทัศน์ที่ตายตัวเช่น Windows
Bringer128

โอ้และเพื่อตอบคำถามอื่นของคุณคุณจะมีFileSystemอินสแตนซ์ที่แตกต่างกันสำหรับแต่ละระบบไฟล์ที่คุณจัดการ
Bringer128

31

java.io.File.separatorหากรหัสของคุณไม่ขอบเขตระบบแฟ้มไม่ข้ามคือคุณเพียงแค่การทำงานร่วมกับระบบแฟ้มหนึ่งใช้แล้ว

ตามที่อธิบายไว้จะทำให้คุณได้ตัวคั่นเริ่มต้นสำหรับ FS ของคุณ ดังที่ Bringer128 อธิบายไว้System.getProperty("file.separator")สามารถลบล้างได้ผ่านทางตัวเลือกบรรทัดคำสั่งและไม่ปลอดภัยเท่ากับjava.io.File.separatorไฟล์.

อันสุดท้ายjava.nio.file.FileSystems.getDefault().getSeparator();เปิดตัวใน Java 7 ดังนั้นคุณอาจเพิกเฉยในตอนนี้หากคุณต้องการให้โค้ดของคุณพกพาได้ในเวอร์ชัน Java ที่เก่ากว่า

ดังนั้นทุกตัวเลือกเหล่านี้เกือบจะเหมือนกับตัวเลือกอื่น ๆ แต่ก็ไม่มากนัก เลือกสิ่งที่เหมาะกับความต้องการของคุณ


ถูกjava.ioเลิกในความโปรดปรานของjava.nio?
Pacerier

13
@Pacerier: ไม่ไม่เลิกใช้ java.ioเป็นระดับที่ต่ำกว่าเล็กน้อยjava.nioแต่ก็ยังมีประโยชน์มากและกว้างขวาง คุณสามารถเห็นความแตกต่างที่นี่: blogs.oracle.com/slc/entry/javanio_vs_javaio nioไม่ได้เปลี่ยนioมันขยายได้หลายวิธี (และใช้ioใต้ฝากระโปรง)
darioo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.