File.separator หรือ File.pathSeparator


519

ในFileชั้นเรียนมีสองสายseparatorและpathSeparator.

ความแตกต่างคืออะไร? เมื่อใดที่ฉันควรใช้อีกอันหนึ่ง?


6
การตั้งชื่อค่อนข้างสับสนความรวดเร็วที่สิ่งที่ต้องการนี้คือแย่มาก ๆ (เทียบกับ Perl) ดูตัวอย่างการpathSeparatorCharและseparatorChar หรือใช้ตัวช่วยจำอย่างง่าย: pathSeparator คั่นพา ธ
maaartinus

6
ใช้เวลาสักครู่ในการพิมพ์ทั้งสองไปที่หน้าจอจะตอบคำถามของคุณ ...
Jean-François Corbett

13
ในขณะที่ฉันเห็นด้วยทั่วไปเพียงพิมพ์ลงบนระบบของเขาจะไม่แสดงตัวแปรสำหรับระบบปฏิบัติการอื่น
b1nary.atr0phy

คำตอบ:


681

ถ้าคุณหมายถึงFile.separatorและFile.pathSeparatorแล้ว:

  • File.pathSeparatorใช้เพื่อแยกแต่ละพา ธ ไฟล์ในรายการพา ธ ไฟล์ พิจารณา windows ตัวแปรสภาพแวดล้อม PATH คุณใช้ a ;เพื่อแยกพา ธ ของไฟล์ดังนั้น Windows File.pathSeparatorจะเป็น;เช่นนั้น

  • File.separatorเป็นอย่างใดอย่างหนึ่ง/หรือ\ที่ใช้ในการแยกเส้นทางไปยังไฟล์เฉพาะ ตัวอย่างเช่นใน Windows เป็น\หรือC:\Documents\Test


6
ดูเหมือนว่าFile.separatorควรจะFile.fileSeparatorเกี่ยวข้องกับFile.pathSeparator
Eddy

1
@Eddy ฉันเห็นจุดของคุณ Fileแต่มันอาจจะซ้ำซ้อนตั้งแต่ชื่อชั้นเป็น ฉันคิดว่าส่วนของไฟล์นั้นส่อให้เห็น แต่ใครจะรู้ว่าทำไมพวกเขาถึงทำสิ่งต่างๆมากมายกับ Java
user489041

117

คุณใช้ตัวคั่นเมื่อคุณสร้างพา ธ ไฟล์ /ดังนั้นในยูนิกซ์แยกเป็น ดังนั้นหากคุณต้องการสร้างเส้นทางยูนิกซ์/var/tempคุณจะทำเช่นนี้:

String path = File.separator + "var"+ File.separator + "temp"

คุณใช้pathSeparatorเมื่อคุณกำลังจัดการกับรายการของไฟล์เช่นใน classpath ตัวอย่างเช่นหากแอปของคุณใช้รายการขวดเป็นอาร์กิวเมนต์วิธีมาตรฐานในการจัดรูปแบบรายการนั้นบน unix คือ:/path/to/jar1.jar:/path/to/jar2.jar:/path/to/jar3.jar

ให้รายชื่อไฟล์ที่คุณจะทำดังนี้:

String listOfFiles = ...
String[] filePaths = listOfFiles.split(File.pathSeparator);

5
หากคุณกำลังสร้างพา ธ * nix อย่าง/var/tempนั้นมันก็ไม่มีประโยชน์ที่จะใช้File.separatorเนื่องจากคุณมีโค้ดที่ขึ้นกับแพลตฟอร์มแล้ว อาจเป็นเส้นทางฮาร์ดโค้ด
isapir

109

java.io.Fileชั้นเรียนมีตัวแปรคั่นสี่แบบคงที่ เพื่อความเข้าใจที่ดีขึ้นลองทำความเข้าใจด้วยความช่วยเหลือของรหัส

  1. separator: อักขระตัวคั่นชื่อเริ่มต้นขึ้นอยู่กับแพลตฟอร์มเป็นสตริง สำหรับ windows มันคือ '\' และสำหรับ unix มันคือ '/'
  2. separatorChar: เหมือนกับตัวคั่น แต่เป็นถ่าน
  3. pathSeparator: ตัวแปรขึ้นอยู่กับแพลตฟอร์มสำหรับ path-separator ตัวอย่างเช่น PATH หรือ CLASSPATH รายการตัวแปรของเส้นทางที่คั่นด้วย ':' ในระบบ Unix และ ';' ในระบบ Windows
  4. pathSeparatorChar: เหมือนกับ pathSeparator แต่มันเป็นถ่าน

โปรดทราบว่าทั้งหมดนี้เป็นตัวแปรสุดท้ายและขึ้นอยู่กับระบบ

นี่คือโปรแกรม java เพื่อพิมพ์ตัวแปรตัวคั่นเหล่านี้ FileSeparator.java

import java.io.File;

public class FileSeparator {

    public static void main(String[] args) {
        System.out.println("File.separator = "+File.separator);
        System.out.println("File.separatorChar = "+File.separatorChar);
        System.out.println("File.pathSeparator = "+File.pathSeparator);
        System.out.println("File.pathSeparatorChar = "+File.pathSeparatorChar);
    }

}

ผลลัพธ์ของโปรแกรมข้างต้นในระบบ Unix:

File.separator = /
File.separatorChar = /
File.pathSeparator = :
File.pathSeparatorChar = :

ผลลัพธ์ของโปรแกรมในระบบ Windows:

File.separator = \
File.separatorChar = \
File.pathSeparator = ;
File.pathSeparatorChar = ;

เพื่อให้แพลตฟอร์มโปรแกรมของเราเป็นอิสระเราควรใช้ตัวคั่นเหล่านี้เพื่อสร้างพา ธ ไฟล์หรืออ่านตัวแปรระบบเช่น PATH, CLASSPATH

นี่คือข้อมูลโค้ดที่แสดงวิธีการใช้ตัวคั่นอย่างถูกต้อง

//no platform independence, good for Unix systems
File fileUnsafe = new File("tmp/abc.txt");
//platform independent and safe to use across Unix and Windows
File fileSafe = new File("tmp"+File.separator+"abc.txt");

1
โปรดทราบว่าใน Java อักขระแบ็กสแลชจริง ๆ แล้วคือ \\ เพราะแบ็กสแลชเดียวคืออักขระเลี่ยงสำหรับชวเลขอักขระพิเศษอื่น ๆ ดังนั้นแบ็กสแลชเองจึงถูกใช้เพื่อหลบหนี Stringและcharกลับมาโดยวิธีการดังกล่าวข้างต้นจะกลับทับขวารูปแบบถูกต้อง (ถ้ามีใน Windows)
Erik

ไฟล์ใหม่ ("tmp / abc.txt"); นี่คือ corectly สำหรับ windows และ linux แต่นี่ไม่ใช่ corectly สำหรับ unix ไฟล์ใหม่ ("tmp \\ abc.txt"); นี่เป็นปัญหาเฉพาะ unix
DEV-Jacol
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.