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


1028

ฉันต้องการเข้าถึงไดเรกทอรีการทำงานปัจจุบันของฉันโดยใช้ java

รหัสของฉัน:

 String current = new java.io.File( "." ).getCanonicalPath();
        System.out.println("Current dir:"+current);
 String currentDir = System.getProperty("user.dir");
        System.out.println("Current dir using System:" +currentDir);

เอาท์พุท:

Current dir: C:\WINDOWS\system32
Current dir using System: C:\WINDOWS\system32

เอาต์พุตของฉันไม่ถูกต้องเนื่องจากไดรฟ์ C ไม่ใช่ไดเรกทอรีปัจจุบันของฉัน

วิธีรับไดเรกทอรีปัจจุบัน


2
คุณสามารถวางที่นี่สิ่งที่คุณเห็นเมื่อคุณรันcdคำสั่งบน command-prompt ของคุณเมื่อคุณดำเนินการนี้
Nishant

3
คุณพยายามทำอะไรให้สำเร็จด้วยการเข้าถึงไดเรกทอรีการทำงาน สามารถทำได้โดยใช้คลาสพา ธ แทนหรือไม่ ตัวอย่างเช่นหากคุณต้องการอ่านไฟล์ข้อความในระบบไฟล์คุณสามารถค้นหาไฟล์ได้อย่างง่ายดายเมื่ออยู่ในพา ธ คลาส
earldouglas

1
อย่างไร คุณช่วยอธิบายได้มั้ย
กราฟิก C

1
สำหรับข้อมูลบางอย่างเกี่ยวกับการเข้าถึงไฟล์บนคลาสพา ธ ดูstackoverflow.com/questions/1464291/…
downeyt

7
สำหรับวัตถุประสงค์ในการดีบั๊กไดเรกทอรีทำงานอาจมีประโยชน์ที่จะทราบว่าโปรแกรมดูเหมือนจะไม่สามารถเข้าถึงไฟล์ที่มีอยู่ได้หรือไม่
nsandersen

คำตอบ:


1151
public class JavaApplication {
  public static void main(String[] args) {
       System.out.println("Working Directory = " + System.getProperty("user.dir"));
  }
}

นี่จะพิมพ์พา ธ สัมบูรณ์ที่สมบูรณ์จากที่แอปพลิเคชันของคุณเริ่มต้น


จากเอกสาร :

java.ioแพคเกจแก้ไขชื่อพา ธ สัมพัทธ์โดยใช้ไดเรกทอรีผู้ใช้ปัจจุบัน ไดเร็กทอรีปัจจุบันถูกแสดงเป็นคุณสมบัติระบบนั่นคือuser.dirและเป็นไดเร็กทอรีที่ซึ่ง JVM ถูกเรียกใช้


25
@ubududroid: นั่นเป็นเหตุผลที่ฉันพูดถึงโดยเฉพาะว่ามันจะพิมพ์เส้นทางจากที่แอพลิเคชันได้เริ่มต้น ฉันเดาว่าตัวเริ่มต้นเธรดเรียกใช้ jar / โปรแกรมโดยตรงหลังจากเริ่มการพรอมต์ commnad (ซึ่งโดยทั่วไปคือ C: \ WINDOWS \ system32) ฉันหวังว่าคุณจะเข้าใจจุดของฉัน สมมติว่าคุณเป็นผู้ที่ลงคะแนนเสียงชื่นชมว่าอย่างน้อยคุณก็ควรที่จะตอบโต้ :)
Anuj Patel

1
user.dir จะได้รับเส้นทางไปยังโฟลเดอร์ที่กระบวนการเปิดตัว ในการรับเส้นทางที่แท้จริงไปยังโฟลเดอร์หลักของแอปพลิเคชันโปรดดูคำตอบของฉันด้านล่าง
Peter De Winter

1
ฉันหมายถึง "รหัสทั้งหมดอาศัยเพื่อค้นหาไดเรกทอรีปัจจุบันล้มเหลว" ไม่ใช่รหัสทั่วไป (ฉันต้องชะลอการแก้ไขความคิดเห็นดั้งเดิม)
SubOptimal

13
@SubOptimal ถ้าผู้ใช้ตั้งค่า -Duser.dir, propable เขาต้องการเรียกใช้ในไดเรกทอรีการทำงานที่กำหนดเอง
barwnikk

5
@indyaah infact คำตอบนี้ผิดมีความแตกต่างเล็กน้อยระหว่าง user-working-directory และ current-working-directory ของกระบวนการของระบบ (cwd); ส่วนใหญ่เวลา "user.dir" ชี้ไปที่ cwd ของกระบวนการ (java); แต่ "user.dir" มีความหมายที่แตกต่างกันและจะไม่ถูกใช้เพื่อขอรับ cwd ของกระบวนการ java; btw: มีคุณสมบัติเพิ่มเติมสำหรับกระบวนการ java docs.oracle.com/javase/tutorial/essential/environment/ ......สำหรับการอ้างอิง
comeGetSome

381

ดู: http://docs.oracle.com/javase/tutorial/essential/io/pathOps.html

การใช้java.nio.file.Pathและjava.nio.file.Pathsคุณสามารถทำสิ่งต่อไปนี้เพื่อแสดงให้เห็นว่า Java คิดอย่างไรกับเส้นทางปัจจุบันของคุณ สิ่งนี้สำหรับ 7 และเปิดและใช้ NIO

Path currentRelativePath = Paths.get("");
String s = currentRelativePath.toAbsolutePath().toString();
System.out.println("Current relative path is: " + s);

ผลลัพธ์นี้Current relative path is: /Users/george/NetBeansProjects/Tutorialsที่ในกรณีของฉันคือที่ฉันวิ่งจากชั้นเรียน การสร้างพา ธ ในลักษณะที่สัมพันธ์กันโดยไม่ใช้ตัวคั่นนำหน้าเพื่อระบุว่าคุณกำลังสร้างพา ธ สัมบูรณ์จะใช้พา ธ สัมพัทธ์เป็นจุดเริ่มต้น


2
คนแรกไม่ได้ตรวจสอบ แต่คนที่สองจะได้รับโฟลเดอร์บ้านของคุณ ไม่ใช่ไดเรกทอรีการทำงานปัจจุบันที่แอปพลิเคชันทำงานอยู่
Peter De Winter

12
กรุณาอย่าสับสนไดเรกทอรีบ้านของผู้ใช้ ("user.home", / Users / george ในกรณีของคุณ) และไดเรกทอรีทำงานปัจจุบัน ("user.dir" ซึ่งจะเป็นไดเรกทอรีที่คุณเริ่มต้น JVM สำหรับใบสมัครของคุณ ดังนั้นอาจเป็นเช่น / Users / george / workspace / FooBarProject)
เดวิด

1
ฉันชอบวิธีนี้ เมื่อฉันต้องการแม่ของไดเรกทอรีการทำงานนี้ไม่ได้ทำงาน: จะช่วยให้Paths.get("").getParent() แต่งานนี้:null Paths.get("").toAbsolutePath().getParent()
Ole VV

235

การทำงานต่อไปนี้ใน Java 7 ขึ้นไป (ดูที่นี่สำหรับเอกสารประกอบ)

import java.nio.file.Paths;

Paths.get(".").toAbsolutePath().normalize().toString();

11
มันจะดีกว่าพกพาได้import java.io.File; File(".").getAbsolutePath()อย่างไร
Evgeni Sergeev

8
เมื่อคุณพูดแบบพกพาคุณหมายถึงมันใช้งานได้ใน Java 6 และรุ่นก่อนหน้าใช่หรือไม่ Paths.get()อาจได้รับการพิจารณาให้ดีขึ้นว่าจะให้การเข้าถึงPathอินเทอร์เฟซที่ทรงพลังมากขึ้นโดยตรง
Ole VV

8
อะไรคือข้อดีของการใช้.normalize()ในบริบทนี้
Ole VV

7
@ OleV.V จาก Javadoc: ( วิธีการทำให้ปกติ )Returns a path that is this path with redundant name elements eliminated.
Stephan

จะถูกทำให้เป็นมาตรฐานในกรณีนี้แล้ว
JM Becker

73

สิ่งนี้จะให้เส้นทางของไดเรกทอรีการทำงานปัจจุบันของคุณ:

Path path = FileSystems.getDefault().getPath(".");

และสิ่งนี้จะให้เส้นทางไปยังไฟล์ชื่อ "Foo.txt" ในไดเรกทอรีทำงาน:

Path path = FileSystems.getDefault().getPath("Foo.txt");

แก้ไข: เพื่อรับเส้นทางที่แน่นอนของไดเรกทอรีปัจจุบัน:

Path path = FileSystems.getDefault().getPath(".").toAbsolutePath();

* อัปเดต * เพื่อรับไดเรกทอรีการทำงานปัจจุบัน:

Path path = FileSystems.getDefault().getPath("").toAbsolutePath();

11
นี่แค่ส่งคืน '.' สำหรับฉัน.
john ktejik

3
ใช่ในหลาย ๆ ระบบที่จะอ้างอิงไปยังไดเรกทอรีการทำงาน ในการรับเส้นทางสัมบูรณ์คุณสามารถเพิ่มการเรียกใช้เมธอดอีกหนึ่งรายการPath path = FileSystems.getDefault().getPath(".").toAbsolutePath();
ทำเครื่องหมาย

2
คุณไม่ต้องการ foo.txt เพียงแค่ใส่สตริงว่าง ๆ เพื่อรับไดเรกทอรี
john ktejik

1
บน Windows (10) นี่แค่ให้Pathวัตถุที่ชี้ไปยังไฟล์ที่เรียกว่า.ภายในไดร์ทำงานปัจจุบัน ใช้สตริงว่างแทนที่จะ"."ทำงานให้ฉัน
Kröw

36

นี่คือทางออกสำหรับฉัน

File currentDir = new File("");

1
สิ่งนี้มีผลข้างเคียงเมื่อคุณใช้วัตถุ File ดังกล่าวเป็นพาเรนต์ของไฟล์อื่น: ไฟล์ใหม่ (ไฟล์ใหม่ (""), "subdir") จะไม่ทำงานอย่างที่คาดไว้
MRalwasser

13
ในการแก้ไขปัญหานี้ให้ใช้new File("").getAbsoluteFile()แทน
MRalwasser

4
สำหรับสิ่งที่คุ้มค่าฉันโชคดีกว่ากับ File (".")
keshlam

วิธีกำหนดเส้นทางสัมพัทธ์ใน Java หน้านี้ช่วยฉันได้ นอกจากนี้ฉันคิดว่าฉันควรใช้/เมื่อสร้างเส้นทางสัมพัทธ์ /ผมผิดไม่ได้เริ่มต้นด้วย ../ใช้ได้กับการขึ้นในไดเรกทอรีต้นไม้ด้วย
Irrationalkilla

@keshlam .ที่ให้ฉันไฟล์ในไดเรกทอรีปัจจุบันเรียกว่า
Kröw

32

ฉันได้พบวิธีแก้ปัญหานี้ในความคิดเห็นที่ดีกว่าคนอื่น ๆ และพกพามากขึ้น:

String cwd = new File("").getAbsolutePath();

หรือแม้กระทั่ง

String cwd = Paths.get("").toAbsolutePath();

ตรงนี้เป็นคำตอบเดียวจาก comeGetSome และจริงๆแล้วเป็น Java <7 way
GoGoris

30

อะไรทำให้คุณคิดว่าc: \ windows \ system32ไม่ใช่ไดเรกทอรีปัจจุบันของคุณ user.dirทรัพย์สินอย่างชัดเจนที่จะ "ไดเรกทอรีการทำงานของผู้ใช้ในปัจจุบัน"

หากต้องการใช้อีกวิธีหนึ่งเว้นแต่คุณจะเริ่ม Java จากบรรทัดคำสั่งc: \ windows \ system32อาจเป็น CWD ของคุณ นั่นคือถ้าคุณดับเบิลคลิกเพื่อเริ่มโปรแกรม CWD นั้นไม่น่าจะเป็นไดเรกทอรีที่คุณคลิกสองครั้ง

แก้ไข : ปรากฏว่านี่เป็นจริงสำหรับ windows และ / หรือ Java เวอร์ชันเก่าเท่านั้น


2
ดูเหมือนว่าจะไม่เป็นความจริงอย่างน้อยไม่ได้อยู่ในเครื่อง Windows 7 ของฉันที่ใช้ Java 7 user.dirเป็นโฟลเดอร์ที่ฉันดับเบิลคลิกไฟล์ jar อย่างสม่ำเสมอ
Jolta

26

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());
    }
}

2
ส่งคืนตำแหน่งของไฟล์ JAR ไม่ใช่สิ่งที่ถูกถาม
user207421

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

12
โยน NPE เมื่อฉันเปิดใช้งานแอปพลิเคชันของฉันจากไฟล์ JAR โดยดับเบิลคลิก
Matthew Wise

2
สิ่งนี้จะส่งคืน""หากแอปพลิเคชันทำงานจากไฟล์ JAR หรือองค์ประกอบ CLASSPATH ไม่ใช่สิ่งที่ถูกถาม
user207421

@ Zizouz212 getClass()เป็นวิธีการของวัตถุดังนั้นในบริบทแบบคงที่เพียงแค่ลบสิ่งที่thisไม่ทำงาน คุณต้องอ้างถึงชั้นเรียนที่คุณกำลังทำMyClass.class.getClassLoader().....อย่างชัดเจน
Kröw

อย่างไรก็ตามมันจะไม่ส่งคืนไดเรกทอรีทำงาน ...
เร็ก

18

โดยทั่วไปเป็นวัตถุไฟล์:

File getCwd() {
  return new File("").getAbsoluteFile();
}

คุณอาจต้องการมีสตริงแบบเต็มเช่น "D: / a / b / c" ทำ:

getCwd().getAbsolutePath()

1
วิธีนี้ใช้งานได้ดีในการทดสอบ Android เนื่องจาก Android ไม่มี java.nio.file.Files
iamreptar

ดูเหมือนจะใช้งานไม่ได้สำหรับฉันในบริบทแบบคงที่ (ไฟล์ใหม่ ("") ขว้าง NullPointerException) .. ?
nsandersen

2
@ แซนเดอร์เซ่นคุณอาจใช้วัตถุไฟล์ผิด: System.out.println (ใหม่ java.io.File (""). getAbsolutePath ());
comeGetSome


5

บนLinuxเมื่อคุณรันไฟล์jarจากเทอร์มินัลสิ่งเหล่านี้จะกลับมาเหมือนเดิมString: "/ home / CurrentUser"ไม่ว่าไฟล์ jar ของคุณจะอยู่ที่ใด ขึ้นอยู่กับไดเรกทอรีปัจจุบันที่คุณใช้กับเทอร์มินัลเมื่อคุณเริ่มต้นไฟล์ jar

Paths.get("").toAbsolutePath().toString();

System.getProperty("user.dir");

หากClassมีการmainเรียกด้วยจะMainClassลอง:

MainClass.class.getProtectionDomain().getCodeSource().getLocation().getFile();

สิ่งนี้จะคืนค่า a Stringด้วยพา ธ สัมบูรณ์ของไฟล์jar


3
ซึ่งไม่ใช่สิ่งที่ถูกขอ
user207421

5

การใช้ Windows user.dir จะส่งคืนไดเรกทอรีตามที่คาดไว้ แต่ไม่ใช่เมื่อคุณเริ่มต้นแอปพลิเคชันของคุณด้วยสิทธิ์ที่ยกระดับ (เรียกใช้ในฐานะผู้ดูแลระบบ) ในกรณีนี้คุณจะได้รับ C: \ WINDOWS \ system32


3

ฉันหวังว่าคุณต้องการเข้าถึงไดเรกทอรีปัจจุบันรวมถึงแพคเกจเช่นหากโปรแกรม Java ของคุณอยู่ในc:\myApp\com\foo\src\service\MyTest.javaและคุณต้องการที่จะพิมพ์จนกว่าc:\myApp\com\foo\src\serviceคุณจะสามารถลองรหัสต่อไปนี้:

String myCurrentDir = System.getProperty("user.dir")
            + File.separator
            + System.getProperty("sun.java.command")
                    .substring(0, System.getProperty("sun.java.command").lastIndexOf("."))
                    .replace(".", File.separator);
    System.out.println(myCurrentDir);

หมายเหตุ:รหัสนี้มีการทดสอบใน Windows ด้วย Oracle JRE เท่านั้น


6
มันจะเป็นความเสียหายที่จะไม่ลงคะแนนคำตอบนี้ โปรดคิดให้รอบคอบก่อนโพสต์ รหัสของคุณใช้งานไม่ได้ยกเว้นว่าสิ่งเหล่านี้เป็นจริง: 1. JRE เป็นของ Oracle มิฉะนั้นจะไม่มีคุณสมบัติของระบบ "sun.java.command" → NPE; 2. ระบบปฏิบัติการคือ Windows (ใช้File.separatorแทนหรือตัวสร้างหลายอาร์กิวเมนต์File) 3. classpath มีการระบุในบรรทัดคำสั่งและ 'ไดเรกทอรีปัจจุบันรวมถึงแพคเกจ' (??) คือ: ระบุก่อน b. ระบุไว้อย่างแน่นอน c. ตรงกับ CWD ทุกประการ (แม้กับตัวพิมพ์เล็กและตัวพิมพ์เล็กของ Windows) และ d เป็นผู้สืบทอดของ CWD
Michael Scheper

ที่อยู่ที่จุด 1 และ 2 แต่ถ้าฉันไม่มีอะไรคุณยังคงพึ่งพา classpath ที่ระบุไว้ในบรรทัดคำสั่ง (เช่นไม่ได้อยู่ในตัวแปรสภาพแวดล้อม) และสำหรับ 'ไดเรกทอรีปัจจุบันรวมถึงแพคเกจ' (ฉัน ยอมรับว่าฉันไม่เข้าใจจริงๆว่าคุณหมายถึงอะไร) การสืบทอดองค์ประกอบแรกใน classpath โดยเฉพาะ และปัญหาการจับคู่กรณียังคงอยู่ ฉันขอโทษถ้าความคิดเห็นของฉันไม่เป็นประโยชน์ ฉันเสียสละความชัดเจนเพื่อให้อยู่ในขีด จำกัด ของความคิดเห็นของตัวละคร
Michael Scheper

@ Inversus มันจะ "ทำงานได้อย่างสมบูรณ์แบบ" ในบางสภาพแวดล้อม คุณเพิ่งจะโชคดีพอที่จะทดสอบในสิ่งนั้น การเขียนซอฟต์แวร์ที่ล้มเหลวในสภาพแวดล้อมรันไทม์ที่ถูกกฎหมายนั้นไม่ใช่วิธีปฏิบัติที่ดีแม้ว่าชุดสภาพแวดล้อมการทดสอบของคุณจะไม่กว้างขวางพอที่จะรวมไว้
Charles Duffy

@CharlesDuffy คุณพูดถูกนั่นไม่ใช่แนวปฏิบัติที่ดี โชคดีที่โซลูชันนี้ "แก้ไขปัญหาเฉพาะของฉัน" ไม่ได้ทำให้ "[ล้มเหลว] ในสภาพแวดล้อมรันไทม์ที่ถูกกฎหมาย" ในความเป็นจริงมันช่วยให้ฉันแก้ไขข้อผิดพลาดดังกล่าวและเขียนโค้ดที่มีประสิทธิภาพยิ่งขึ้นนอกจากการแก้ไขปัญหาเฉพาะที่ฉันมี (ซึ่งค่อนข้างเกี่ยวข้องกับคำถาม / คำตอบนี้เท่านั้น) ฉันเดาว่าฉันโชคดีที่พบมัน
Inversus

3

พูดถึงว่ามีการตรวจสอบเฉพาะในWindowsแต่ฉันคิดว่ามันทำงานได้ดีในระบบปฏิบัติการอื่น ๆ [ Linux,MacOs,Solaris] :)


ฉันมี2 .jarไฟล์ในไดเรกทอรีเดียวกัน ฉันต้องการจาก.jarไฟล์หนึ่งเพื่อเริ่มต้นอื่น.jarไฟล์ซึ่งอยู่ในไดเรกทอรีเดียวกัน

ปัญหาคือว่าเมื่อคุณเริ่มต้นจากไดเรกทอรีปัจจุบันคือcmdsystem32


คำเตือน!

  • ด้านล่างดูเหมือนว่าจะทำงานได้ดีในทุกการทดสอบที่ฉันทำแม้จะมีชื่อโฟลเดอร์;][[;'57f2g34g87-8+9-09!2#@!$%^^&()หรือ()%&$%^@# ใช้งานได้ดี
  • ฉันใช้ProcessBuilderกับด้านล่างดังต่อไปนี้:

🍂 ..

//The class from which i called this was the class `Main`
String path = getBasePathForClass(Main.class);
String applicationPath=  new File(path + "application.jar").getAbsolutePath();


System.out.println("Directory Path is : "+applicationPath);

//Your know try catch here
//Mention that sometimes it doesn't work for example with folder `;][[;'57f2g34g87-8+9-09!2#@!$%^^&()` 
ProcessBuilder builder = new ProcessBuilder("java", "-jar", applicationPath);
builder.redirectErrorStream(true);
Process process = builder.start();

//...code

🍂 getBasePathForClass(Class<?> classs):

    /**
     * Returns the absolute path of the current directory in which the given
     * class
     * file is.
     * 
     * @param classs
     * @return The absolute path of the current directory in which the class
     *         file is.
     * @author GOXR3PLUS[StackOverFlow user] + bachden [StackOverFlow user]
     */
    public static final String getBasePathForClass(Class<?> classs) {

        // Local variables
        File file;
        String basePath = "";
        boolean failed = false;

        // Let's give a first try
        try {
            file = new File(classs.getProtectionDomain().getCodeSource().getLocation().toURI().getPath());

            if (file.isFile() || file.getPath().endsWith(".jar") || file.getPath().endsWith(".zip")) {
                basePath = file.getParent();
            } else {
                basePath = file.getPath();
            }
        } catch (URISyntaxException ex) {
            failed = true;
            Logger.getLogger(classs.getName()).log(Level.WARNING,
                    "Cannot firgue out base path for class with way (1): ", ex);
        }

        // The above failed?
        if (failed) {
            try {
                file = new File(classs.getClassLoader().getResource("").toURI().getPath());
                basePath = file.getAbsolutePath();

                // the below is for testing purposes...
                // starts with File.separator?
                // String l = local.replaceFirst("[" + File.separator +
                // "/\\\\]", "")
            } catch (URISyntaxException ex) {
                Logger.getLogger(classs.getName()).log(Level.WARNING,
                        "Cannot firgue out base path for class with way (2): ", ex);
            }
        }

        // fix to run inside eclipse
        if (basePath.endsWith(File.separator + "lib") || basePath.endsWith(File.separator + "bin")
                || basePath.endsWith("bin" + File.separator) || basePath.endsWith("lib" + File.separator)) {
            basePath = basePath.substring(0, basePath.length() - 4);
        }
        // fix to run inside netbeans
        if (basePath.endsWith(File.separator + "build" + File.separator + "classes")) {
            basePath = basePath.substring(0, basePath.length() - 14);
        }
        // end fix
        if (!basePath.endsWith(File.separator)) {
            basePath = basePath + File.separator;
        }
        return basePath;
    }

ส่งคืนตำแหน่งของไฟล์ JAR ไม่ใช่สิ่งที่ถูกถาม
user207421

@EJP ตำแหน่งของไฟล์. jar ไม่ใช่ไดเรกทอรีการทำงานปัจจุบันของโปรแกรม java ใช่หรือไม่
GOXR3PLUS

2

ไดเร็กทอรีการทำงานปัจจุบันถูกกำหนดแตกต่างกันในการนำ Java ไปใช้งานต่างกัน สำหรับบางเวอร์ชันก่อนหน้า Java 7 ไม่มีวิธีที่สอดคล้องกันในการรับไดเรกทอรีทำงาน คุณสามารถแก้ไขได้โดยเปิดไฟล์ Java ด้วย-Dและกำหนดตัวแปรเพื่อเก็บข้อมูล

สิ่งที่ต้องการ

java -D com.mycompany.workingDir="%0"

มันไม่ถูกต้องนัก แต่คุณเข้าใจแล้ว จากนั้นSystem.getProperty("com.mycompany.workingDir")...


6
ไม่เกี่ยวข้องกับคำถาม
Peter De Winter

1
มันมีความหมายกับ Java - มันเป็นตำแหน่งบนดิสก์ที่ไฟล์ที่คุณเปิดด้วยชื่อพา ธ สัมพัทธ์สัมพันธ์กับ
Rob ฉัน

2
ใช่มันมีความหมาย คำพูดของฉันค่อนข้างถูกเลือก แต่คุณพลาดจุดนี้ไปก่อนหน้า Java 7 ไม่มีทางที่จะรู้ไดเรกทอรีการทำงานปัจจุบันและการใช้งานที่แตกต่างกันทำให้พวกเขา ... ต่างกัน ...
MJB

1

สมมติว่าคุณกำลังพยายามเรียกใช้โครงการของคุณภายใน eclipse หรือ netbean หรือสแตนด์อะโลนจากบรรทัดคำสั่ง ฉันได้เขียนวิธีการแก้ไข

public static final String getBasePathForClass(Class<?> clazz) {
    File file;
    try {
        String basePath = null;
        file = new File(clazz.getProtectionDomain().getCodeSource().getLocation().toURI().getPath());
        if (file.isFile() || file.getPath().endsWith(".jar") || file.getPath().endsWith(".zip")) {
            basePath = file.getParent();
        } else {
            basePath = file.getPath();
        }
        // fix to run inside eclipse
        if (basePath.endsWith(File.separator + "lib") || basePath.endsWith(File.separator + "bin")
                || basePath.endsWith("bin" + File.separator) || basePath.endsWith("lib" + File.separator)) {
            basePath = basePath.substring(0, basePath.length() - 4);
        }
        // fix to run inside netbean
        if (basePath.endsWith(File.separator + "build" + File.separator + "classes")) {
            basePath = basePath.substring(0, basePath.length() - 14);
        }
        // end fix
        if (!basePath.endsWith(File.separator)) {
            basePath = basePath + File.separator;
        }
        return basePath;
    } catch (URISyntaxException e) {
        throw new RuntimeException("Cannot firgue out base path for class: " + clazz.getName());
    }
}

หากต้องการใช้ทุกที่ที่คุณต้องการรับพา ธ ฐานไปยังไฟล์อ่านคุณสามารถส่งวิธียึดคลาสของคุณไปยังวิธีการด้านบนผลลัพธ์อาจเป็นสิ่งที่คุณต้องการ: D

ที่ดีที่สุด


2
ส่งคืนตำแหน่งของไฟล์ JAR ไม่ใช่สิ่งที่ถูกถาม
user207421

@ user207421 ใช่ฉันรู้ว่าคำตอบนี้ไม่ใช่คำตอบที่แท้จริงสำหรับคำถาม แต่ส่วนใหญ่แล้วทุกคนต้องการได้รับ "ไดเรกทอรีที่ jars อยู่" แทนที่จะเป็น "ไดเรกทอรีทำงานบรรทัดคำสั่ง"
bachden

0

ไม่มีคำตอบใด ๆ ที่โพสต์ไว้ที่นี่สำหรับฉัน นี่คือสิ่งที่ทำงาน:

java.nio.file.Paths.get(
  getClass().getProtectionDomain().getCodeSource().getLocation().toURI()
);

แก้ไข: รุ่นสุดท้ายในรหัสของฉัน:

URL myURL = getClass().getProtectionDomain().getCodeSource().getLocation();
java.net.URI myURI = null;
try {
    myURI = myURL.toURI();
} catch (URISyntaxException e1) 
{}
return java.nio.file.Paths.get(myURI).toFile().toString()

ส่งคืนตำแหน่งของไฟล์ JAR ไม่ใช่สิ่งที่ถูกถาม
user207421

0

นี่คือกระสุนเงินของฉันเมื่อช่วงเวลาที่เกิดฟองสบู่สับสน (เรียกมันว่าเป็นสิ่งสำคัญอันดับแรก) ตัวอย่างเช่นบางที JVM ถูกเล็ดลอดให้เป็นเวอร์ชันอื่นโดย IDE ฟังก์ชันสแตติกนี้ค้นหา PID กระบวนการปัจจุบันและเปิด VisualVM บน pid นั้น ความสับสนหยุดลงที่นั่นเพราะคุณต้องการทุกอย่างและคุณจะได้รับ ...

  public static void callJVisualVM() {
    System.out.println("USER:DIR!:" + System.getProperty("user.dir"));
    //next search current jdk/jre
    String jre_root = null;
    String start = "vir";
    try {
        java.lang.management.RuntimeMXBean runtime =
                java.lang.management.ManagementFactory.getRuntimeMXBean();
        String jvmName = runtime.getName();
        System.out.println("JVM Name = " + jvmName);
        long pid = Long.valueOf(jvmName.split("@")[0]);
        System.out.println("JVM PID  = " + pid);
        Runtime thisRun = Runtime.getRuntime();
        jre_root = System.getProperty("java.home");
        System.out.println("jre_root:" + jre_root);
        start = jre_root.concat("\\..\\bin\\jvisualvm.exe " + "--openpid " + pid);
        thisRun.exec(start);
    } catch (Exception e) {
        System.getProperties().list(System.out);
        e.printStackTrace();
    }
}


-7

นี่คือชื่อไดเรกทอรีปัจจุบัน

String path="/home/prasad/Desktop/folderName";
File folder = new File(path);
String folderName=folder.getAbsoluteFile().getName();

นี่คือเส้นทางไดเรกทอรีปัจจุบัน

String path=folder.getPath();

1
OP ต้องการ dir ที่ใช้งานในปัจจุบันซึ่งแอปพลิเคชันนั้นทำงานจากที่ใด
Leif Gruenwoldt

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