วิธีรับไดเร็กทอรีการทำงานปัจจุบันใน Java


112

C:\Users\Justian\Documents\สมมติว่าฉันได้เรียนหลักของฉันใน ฉันจะทำให้โปรแกรมของฉันแสดงว่าอยู่ในนั้นได้C:\Users\Justian\Documentsอย่างไร?

Hard-Coding ไม่ใช่ทางเลือก แต่จำเป็นต้องปรับเปลี่ยนได้หากย้ายไปที่อื่น

ฉันต้องการถ่ายโอนไฟล์ CSV จำนวนมากในโฟลเดอร์ให้โปรแกรมจดจำไฟล์ทั้งหมดจากนั้นโหลดข้อมูลและจัดการไฟล์เหล่านั้น ฉันแค่อยากรู้วิธีไปที่โฟลเดอร์นั้นจริงๆ


1
จะดูที่บทความนี้
Matthew J Morrison

1
จะเกิดอะไรขึ้นถ้าคลาสหลักของคุณอยู่ในไฟล์ jar? แล้วคุณต้องการผลลัพธ์แบบไหน?
Mattias Nilsson

1
ทำไมคุณต้องทำสิ่งนี้ต่อไป?
Ed S.

1
ดูเหมือนสิ่งที่คุณต้องการคือไดเร็กทอรีที่มีไฟล์ CSV อยู่และมีไฟล์. jar ที่สามารถอ้างอิงไดเร็กทอรีนั้นได้ดูคำตอบของฉันหากเป็นเช่นนั้น

คำตอบ:


149

วิธีหนึ่งคือการใช้คุณสมบัติของระบบ System.getProperty("user.dir");ซึ่งจะทำให้คุณมี "ไดเร็กทอรีการทำงานปัจจุบันเมื่อคุณสมบัติถูกเตรียมใช้งาน" นี่คงเป็นสิ่งที่คุณต้องการ เพื่อดูว่าjavaคำสั่งนั้นออกมาจากที่ใดในกรณีของคุณในไดเร็กทอรีที่มีไฟล์ที่ต้องดำเนินการแม้ว่าไฟล์. jar จริงอาจอยู่ที่อื่นในเครื่อง การมีไดเร็กทอรีของไฟล์. jar ที่แท้จริงไม่ได้มีประโยชน์ในกรณีส่วนใหญ่

ต่อไปนี้จะพิมพ์ไดเร็กทอรีปัจจุบันจากตำแหน่งที่เรียกใช้คำสั่งไม่ว่าไฟล์. class หรือ. jar ไฟล์. class จะอยู่ที่ใด

public class Test
{
    public static void main(final String[] args)
    {
        final String dir = System.getProperty("user.dir");
        System.out.println("current dir = " + dir);
    }
}  

ถ้าคุณอยู่ใน/User/me/แฟ้มและขวดของคุณที่มีโค้ดข้างต้นอยู่ใน/opt/some/nested/dir/ คำสั่งส่งออกจะjava -jar /opt/some/nested/dir/test.jar Testcurrent dir = /User/me

นอกจากนี้คุณควรดูเป็นโบนัสด้วยการใช้ตัวแยกวิเคราะห์อาร์กิวเมนต์บรรทัดคำสั่งเชิงวัตถุ ฉันขอแนะนำJSAPซึ่งเป็น Java Simple Argument Parser วิธีนี้จะช่วยให้คุณใช้System.getProperty("user.dir")และหรือส่งต่ออย่างอื่นเพื่อให้เกิดพฤติกรรมที่มากเกินไป โซลูชันที่บำรุงรักษาได้มากขึ้น สิ่งนี้จะทำให้การส่งผ่านในไดเร็กทอรีดำเนินการได้ง่ายมากและสามารถถอยกลับได้user.dirหากไม่มีการส่งผ่านใด ๆ


ฉันจะทดสอบสิ่งนี้เมื่อทำได้ ฉันหมกมุ่นอยู่กับปัญหา. jar: P
Justian Meyer

คุณเข้าไปที่ลิงค์ในคำตอบของฉันสำหรับปัญหา. jar ที่ฉันแสดงวิธีสร้างไฟล์. jar ด้วย ANT หรือไม่

รหัสจาก Jarrod ที่ส่งคืนพา ธ สัมบูรณ์ของไดเร็กทอรีการทำงานปัจจุบันจาก System Property user.dirนั้นใช้งานง่ายมาก System.getProperty ( "user.dir");

74

ใช้CodeSource#getLocation(). ซึ่งใช้งานได้ดีในไฟล์ JAR เช่นกัน คุณสามารถขอรับCodeSourceโดยProtectionDomain#getCodeSource()และในที่สุดก็สามารถรับได้โดยProtectionDomainClass#getProtectionDomain()

public class Test {
    public static void main(String... args) throws Exception {
        URL location = Test.class.getProtectionDomain().getCodeSource().getLocation();
        System.out.println(location.getFile());
    }
}

อัปเดตตามความคิดเห็นของ OP:

ฉันต้องการถ่ายโอนไฟล์ CSV จำนวนมากในโฟลเดอร์ให้โปรแกรมจดจำไฟล์ทั้งหมดจากนั้นโหลดข้อมูลและจัดการไฟล์เหล่านั้น ฉันแค่อยากรู้วิธีไปที่โฟลเดอร์นั้นจริงๆ

ซึ่งจะต้องมีการเข้ารหัส / รู้เส้นทางสัมพัทธ์ในโปรแกรมของคุณ ลองพิจารณาเพิ่มเส้นทางไปยัง classpath เพื่อให้คุณสามารถใช้ClassLoader#getResource()

File classpathRoot = new File(classLoader.getResource("").getPath());
File[] csvFiles = classpathRoot.listFiles(new FilenameFilter() {
    @Override public boolean accept(File dir, String name) {
        return name.endsWith(".csv");
    }
});

หรือเพื่อส่งผ่านเส้นทางเป็นmain()อาร์กิวเมนต์


3
+1 มีเงื่อนไขหลายประการในการทำงานนี้ ที่สำคัญที่สุดคือ "คลาสหลัก" ของคุณถูกโหลดจากระบบไฟล์ ใน Java ไม่ใช่เรื่องผิดปกติอย่างมากที่สมมติฐานนี้จะเป็นเท็จ แต่ถ้าคุณแน่ใจว่าคุณโหลดระดับของคุณจาก JAR ในระบบไฟล์นี้เป็นวิธีการที่ผลงาน
erickson

ทุกอย่างขึ้นอยู่กับจริงๆ ฉันกำลังพยายามรวบรวม JAR ของฉัน แต่นั่นเป็นปัญหาแยกต่างหากในขณะนี้ หากคุณคิดว่าคุณสามารถช่วยให้มีที่เช็คเอาท์: stackoverflow.com/questions/3152240/... ฉันแน่ใจว่าการโพสต์นี้เป็นการละเมิดบางอย่าง แต่เกี่ยวข้องกับปัญหานี้ ถ้าฉันสามารถแก้ไขได้นี่จะเป็นคำตอบของฉันอย่างแน่นอน
Justian Meyer

ทำไมฉันต้องฮาร์ดโค้ดขนาดนั้น? ฉันเคยทำสิ่งที่คล้ายกันมาก่อน สมมติว่า jar และโฟลเดอร์ของฉันจะมีความสัมพันธ์ที่คล้ายกันเสมอ (เช่นในไดเร็กทอรีเดียวกัน) ถ้าเป็นจริงฉันจะได้ไดเร็กทอรีของ jar จากนั้นแก้ไขเพื่อค้นหาโฟลเดอร์
Justian Meyer

หากอยู่ในโฟลเดอร์เดียวกับไฟล์ JAR แสดงว่ามีอยู่แล้วใน classpath คำว่า "hardcoding" ดูเกินจริงไปหน่อยจริงๆแล้วฉันหมายถึง "รู้เส้นทางที่สัมพันธ์กับไฟล์ JAR"
BalusC

1
@Moebius: หือ? คุณยังใหม่กับ Java หรือไม่? ตรวจสอบ Javadoc เพียงใช้สิ่งนั้นตามที่ส่งคืนโดยgetLocation()วิธีการ เห็นได้ชัดว่าคนอื่น ๆ ไม่ได้ไปทำงาน
BalusC

31
File currentDirectory = new File(new File(".").getAbsolutePath());
System.out.println(currentDirectory.getCanonicalPath());
System.out.println(currentDirectory.getAbsolutePath());

พิมพ์สิ่งที่ชอบ:

/path/to/current/directory
/path/to/current/directory/.

โปรดทราบว่าจะFile.getCanonicalPath()พ่น IOException ที่เลือกไว้ แต่จะลบสิ่งต่างๆเช่น ../../../


13
this.getClass().getClassLoader().getResource("").getPath()

โปรดทราบว่าสิ่งนี้จะส่งคืนเส้นทางไปยัง "bin / class /" ไม่ใช่แค่ "bin"
นักพัฒนา Android

ในขณะที่ดีบักแอปพลิเคชันที่ทำงานอยู่โดยใช้ Intellij Idea สิ่งนี้ส่งกลับ "/C:/Program%20Files/Java/jdk1.8.0_112/:"
velocity

5

ฉันเพิ่งใช้:

import java.nio.file.Path;
import java.nio.file.Paths;

...

Path workingDirectory=Paths.get(".").toAbsolutePath();

9
ขอแสดงความนับถือมันใช้ไม่ได้อันนี้ถูกต้องPaths.get("").toAbsolutePath();
ถึงกระ

@ToKra ถ้าฉันPaths.get("my/file").toAbsolutePath()ได้รับ/my/fileซึ่งไม่ใช่cwd แน่นอน
abergmeier

1
@abergmeier ฉันเขียน "" ในสตริงไม่ใช่ "my / file"
ถึง Kra

5

หากคุณต้องการรับไดเร็กทอรีการทำงานปัจจุบันของคุณให้ใช้บรรทัดต่อไปนี้

System.out.println(new File("").getAbsolutePath());

4

หากคุณต้องการเส้นทางที่แน่นอนของซอร์สโค้ดปัจจุบันคำแนะนำของฉันคือ:

String internalPath = this.getClass().getName().replace(".", File.separator);
String externalPath = System.getProperty("user.dir")+File.separator+"src";
String workDir = externalPath+File.separator+internalPath.substring(0, internalPath.lastIndexOf(File.separator));

วิธีนี้ใช้ไม่ได้เมื่อคุณเรียกใช้บน IDE หรือใช้บางอย่างเพื่อหมุนอินสแตนซ์
Sarp Kaya

เส้นทางภายในคือ java \ lang \ Class เส้นทางภายนอกคือ E: \ BranchProduction1.4.0 \ FilesTestProject \ src ไดเร็กทอรีการทำงานคือ E: \ BranchProduction1.4.0 \ FilesTestProject \ src \ java \ lang คุณสามารถอธิบายผลลัพธ์ได้หรือไม่
JAVA

3

ใครบอกว่าคลาสหลักของคุณอยู่ในไฟล์บนฮาร์ดดิสในเครื่อง คลาสมักจะรวมอยู่ในไฟล์ JAR และบางครั้งก็โหลดผ่านเครือข่ายหรือสร้างขึ้นได้ทันที

แล้วที่คุณอยากทำคืออะไร? อาจมีวิธีทำที่ไม่ตั้งสมมติฐานว่าคลาสมาจากไหน


ฉันต้องการถ่ายโอนไฟล์ CSV จำนวนมากในโฟลเดอร์ให้โปรแกรมจดจำไฟล์ทั้งหมดจากนั้นโหลดข้อมูลและจัดการไฟล์เหล่านั้น ฉันแค่อยากรู้วิธีไปที่โฟลเดอร์นั้นจริงๆ
Justian Meyer

บางทีฉันอาจจะขาดอะไรไป แต่ดูเหมือนว่าเส้นทางที่แน่นอนจะใช้ได้ คุณบอกว่าคุณไม่สามารถฮาร์ดโค้ดได้ แต่คุณจะรู้ได้อย่างไรว่าจะเริ่มต้นด้วยโฟลเดอร์ใด
Chris Thompson

ปัญหาก็คือฉันต้องการนำมันไปยังคอมพิวเตอร์เครื่องอื่นไม่ใช่เฉพาะของฉันเอง ฉันไม่เห็นว่าการเข้ารหัสเส้นทางจะทำงานได้ดีเพียงใด "สมมติว่า jar และโฟลเดอร์ของฉันจะมีความสัมพันธ์ใกล้เคียงกันเสมอ (เช่นในไดเร็กทอรีเดียวกัน) หากเป็นจริงฉันจะได้รับไดเร็กทอรีของ jar จากนั้นแก้ไขเพื่อค้นหาโฟลเดอร์" วิธีเดียวที่ฉันจะฮาร์ดโค้ดได้ก็คือถ้าฉันไม่ต้องรวมพา ธ แบบเต็มจากฮาร์ดไดรฟ์ไปยังไฟล์ บางทีฉันอาจจะย้อนกลับไปแค่ 3 โฟลเดอร์ (เช่น "Documents \ Project \ Dump \ [file / folder]")
Justian Meyer

ฉันจะบอกว่าสิ่งที่คุณต้องการทำคือจัดการไดเร็กทอรีที่ไฟล์ jar อยู่นั่นจะบรรลุความต้องการของคุณหรือไม่?
Chris Thompson
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.