ජාවා හි වත්මන් වැඩ නාමාවලිය ලබා ගන්නේ කෙසේද?


1049

ජාවා භාවිතයෙන් මගේ වර්තමාන වැඩ කරන නාමාවලියට ප්‍රවේශ වීමට මට අවශ්‍යය.

මගේ කේතය:

 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

සී ඩ්‍රයිව් මගේ වත්මන් නාමාවලිය නොවන නිසා මගේ ප්‍රතිදානය නිවැරදි නොවේ.

වත්මන් නාමාවලිය ලබා ගන්නේ කෙසේද?


2
ඔබ මෙය ක්‍රියාත්මක cdකරන විට ඔබේ විධාන විමසුමේ විධානය ක්‍රියාත්මක කරන විට ඔබ දකින දේ මෙහි ඇලවිය හැකිද?
නිශාන්ත්

3
වැඩ කරන නාමාවලියට ප්‍රවේශ වීමෙන් ඔබ ඉටුකර ගැනීමට උත්සාහ කරන්නේ කුමක්ද? ඒ වෙනුවට පන්ති මාර්ගය භාවිතා කිරීමෙන් එය කළ හැකිද? උදාහරණයක් ලෙස, ඔබට ගොනු පද්ධතියේ පෙළ ගොනුවක් කියවීමට අවශ්‍ය නම්, එය පන්ති මාවතේ සිටින විට ඔබට එය පහසුවෙන් සොයාගත හැකිය.
earldouglas

1
කෙසේද? කරුණාකර ඔබට විස්තර කළ හැකිද?
සී ග්‍රැෆික්ස්

1
පන්ති මාවතේ ගොනුවකට ප්‍රවේශ වීම පිළිබඳ වැඩි විස්තර සඳහා, stackoverflow.com/questions/1464291/…
downeyt

7
නිදොස් කිරීමේ අරමුණු සඳහා, පවතින ගොනු වලට ප්‍රවේශ වීමට වැඩසටහනට නොහැකි බව දැන ගැනීමට වැඩ කරන නාමාවලිය ප්‍රයෝජනවත් වේ.
nsandersen

Answers:


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

මෙය ඔබගේ යෙදුම ආරම්භ කළ ස්ථානයෙන් සම්පූර්ණ නිරපේක්ෂ මාර්ගයක් මුද්‍රණය කරනු ඇත .


සිට ප්රලේඛනය :

java.ioපැකේජය වත්මන් පරිශීලක නාමාවලිය භාවිතා කරමින් සාපේක්ෂ මාර්ග නාම නිරාකරණය කරයි. වත්මන් නාමාවලිය පද්ධති දේපල ලෙස නිරූපණය කෙරේ, එනම් user.dirජේවීඑම් ආයාචනය කළ නාමාවලියයි.


25
untubuntudroid: යෙදුම ආරම්භ කළ ස්ථානයෙන් එය මුද්‍රණය කරන බව මා විශේෂයෙන් සඳහන් කළේ එබැවිනි. කොමානාඩ් විමසුමක් ආරම්භ කිරීමෙන් පසු නූල් ආරම්භකය සෘජුවම භාජනය / වැඩසටහන ක්‍රියාත්මක කරයි (එය මූලික වශයෙන් C: \ WINDOWS \ system32 හි ඇත). මම හිතනවා ඔබ මගේ අදහස තේරුම් ගනීවි කියලා. ඔබ අවතක්සේරු කර ඇතැයි උපකල්පනය කරමින්, අවම වශයෙන් ඔබ ප්‍රතිචාරයක් දැක්වීමට සැලකිලිමත් වූ බව අගය කරන්න. :)
අනුජ් පටෙල්

1
ක්‍රියාවලිය දියත් කළ ෆෝල්ඩරයට user.dir මාර්ගය ලැබෙනු ඇත. යෙදුමේ ප්‍රධාන ෆෝල්ඩරයට සත්‍ය මාර්ගය ලබා ගැනීම සඳහා මගේ පිළිතුර පහත බලන්න.
පීටර් ද වින්ටර්

1
මම අදහස් කළේ " වත්මන් නාමාවලිය සොයා ගැනීම සඳහා එය මත රඳා පවතින සියලුම කේත අසමත් වේ." සියලුම කේත පොදුවේ නොවේ. (මුල් අදහස සංස්කරණය කිරීමට මා ප්‍රමාද විය)
උප ඔප්ටිමල්

13
UbSubOptimal පරිශීලකයා -Duser.dir සකසා ඇත්නම්, ඔහුට මෙය අභිරුචි වැඩ කරන නාමාවලියෙහි ක්‍රියාත්මක කිරීමට අවශ්‍යය.
barwnikk

5
@indyaah මෙම පිළිතුර වැරදියි, පරිශීලක වැඩ කරන නාමාවලියක් සහ පද්ධති ක්‍රියාවලියක (cwd) වත්මන් වැඩකරන-නාමාවලිය අතර සියුම් වෙනසක් ඇත; බොහෝ විට "user.dir" (java) ක්‍රියාවලියක cwd වෙත යොමු කරයි; නමුත් "user.dir" හි විවිධ අර්ථකථන ඇති අතර එය ජාවා ක්‍රියාවලියක cwd ලබා ගැනීමට භාවිතා නොකරයි; btw: ජාවා ක්‍රියාවලියට තවත් දේපල තිබේ docs.oracle.com/javase/tutorial/essential/en Environment

389

බලන්න: http://docs.oracle.com/javase/tutorial/essential/io/pathOps.html

භාවිතා java.nio.file.Pathහා java.nio.file.Paths, ඔබ ජාවා ඔබේ වත්මන් මාර්ගය සිතන දේ පෙන්වන්න කරන්න පුළුවන්. මෙය 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
පළමු එක පරික්ෂා කර නැත, නමුත් දෙවැන්න ඇත්ත වශයෙන්ම ඔබගේ නිවසේ ෆෝල්ඩරය ලබා ගනී. යෙදුම ක්‍රියාත්මක වන වත්මන් වැඩ නාමාවලිය නොවේ.
පීටර් ඩි වින්ටර්

12
කරුණාකර පරිශීලකයාගේ නිවාස නාමාවලිය ("user.home", / ඔබේ නඩුවේ පරිශීලකයින් / ජෝර්ජ්) සහ වර්තමාන වැඩ කරන නාමාවලිය ("user.dir", පටලවා නොගන්න, එය ඔබගේ යෙදුම සඳහා ඔබ JVM ආරම්භ කළ නාමාවලිය වනු ඇත. , උදා: පරිශීලකයින් / ජෝර්ජ් / වැඩපොළ / ෆූබාර් ප්‍රොජෙක්ට් වැනි දෙයක් විය හැකිය).
ඩේවිඩ්

1
මම කැමතියි මේ විදියට. මට වැඩකරන නාමාවලියෙහි මවුපියන් අවශ්‍ය වූ විට, මෙය ක්‍රියා නොකරයි :, Paths.get("").getParent()එය ලබා දෙයි null. ඒ වෙනුවට මෙය ක්‍රියාත්මක වේ : Paths.get("").toAbsolutePath().getParent().
ඔලේ වීවී

239

පහත දැක්වෙන්නේ ජාවා 7 සහ ඊට ඉහළින් ක්‍රියා කරයි ( ප්‍රලේඛනය සඳහා මෙහි බලන්න ).

import java.nio.file.Paths;

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

11
මෙය වඩා අතේ ගෙන යා හැකි දේට වඩා හොඳ වන්නේ කෙසේද import java.io.File; File(".").getAbsolutePath()?
එව්ගනි සර්ජිව්

8
ඔබ අතේ ගෙන යා හැකි යැයි පැවසූ විට, ඔබ අදහස් කළේ එය ජාවා 6 සහ ඊට පෙර ක්‍රියාත්මක වන බවයි? Paths.get()එය වඩා බලවත් Pathඅතුරුමුහුණතට access ජු ප්‍රවේශයක් ලබා දෙන බැවින් එය වඩා හොඳ ලෙස සැලකිය හැකිය .
ඔලේ වීවී

8
.normalize()මෙම සන්දර්භය තුළ භාවිතා කිරීමේ විභව වාසිය කුමක්ද?
ඔලේ වීවී

7
Le OleV.V. ජාවඩොක් වෙතින්: ( ක්‍රමය සාමාන්‍යකරණය කරන්න )Returns a path that is this path with redundant name elements eliminated.
ස්ටෙෆාන්

74

මෙය ඔබගේ වර්තමාන වැඩ කරන නාමාවලියෙහි මාවත ලබා දෙනු ඇත:

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 අවශ්‍ය නොවේ, නාමාවලිය ලබා ගැනීම සඳහා හිස් නූලක්
දමන්න

1
වින්ඩෝස් (10) හි මෙය මට දැනට වැඩ කරන dir තුළ ඇති Pathගොනුවකට යොමු කරන වස්තුවක් ලබා දෙයි .. "."මා වෙනුවෙන් වැඩ කරනවාට වඩා හිස් නූලක් භාවිතා කිරීම .
ක්‍රව්

36

මෙය මට විසඳුමයි

File currentDir = new File("");

1
ඔබ වෙනත් ගොනුවක මවුපියෙකු ලෙස එවැනි ගොනු වස්තුවක් භාවිතා කරන විට මෙය අතුරු ආබාධ ඇති කරයි: නව ගොනුව (නව ගොනුව (""), "උප ඩිර්") බලාපොරොත්තු වූ පරිදි ක්‍රියා නොකරනු ඇත
MRalwasser

14
මෙය නිවැරදි කිරීමට, new File("").getAbsoluteFile()ඒ වෙනුවට භාවිතා කරන්න.
MRalwasser

4
එය වටින දෙය සඳහා, මට ගොනුව (".") සමඟ වඩා හොඳ වාසනාවක් තිබුණි.
keshlam

ජාවාහි සාපේක්ෂ මාවතක් නිර්වචනය කරන්නේ කෙසේද මෙම පිටුව මට උදව් විය. /සාපේක්ෂ මාර්ගයක් නිර්මාණය කිරීමේදී මා භාවිතා කළ යුතු යැයි මම උපකල්පනය කළෙමි . මම වැරදියි, පටන් ගන්න එපා /. ../නාමාවලි ගසෙහි ඉහළට යාම සඳහා ද ක්‍රියා කරයි.
Irrationalkilla

@keshlam එය වත්මන් නාමාවලියෙහි ගොනුවක් ලබා දුන්නේය ..
Kröw

35

මෙම විසඳුම අනෙක් අයට වඩා හොඳ සහ වඩා අතේ ගෙන යා හැකි අදහස් වලින් මම සොයාගෙන ඇත:

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

නැත්නම් පවා

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

මෙය හරියටම comGetSome වෙතින් ලැබෙන පිළිතුරට සමාන වන අතර ඇත්ත වශයෙන්ම එය ජාවා <7 මාර්ගයයි
GoGoris

එය Path cwd = Paths.get ("") විය යුතුය. toAbsolutePath ();
ජහංගීර් අලාම්

30

C: \ windows \ system32 ඔබේ වර්තමාන නාමාවලිය නොවේ යැයි ඔබ සිතන්නේ කුමක් ද ? මෙම user.dir"පරිශීලක වත්මන් කම්කරු බහලුම" ලෙස දේපල සුවිශේෂව වේ.

වෙනත් ආකාරයකින් කිවහොත්, ඔබ විධාන රේඛාවෙන් ජාවා ආරම්භ නොකරන්නේ නම්, c: \ windows \ system32 බොහෝ විට ඔබේ සීඩබ්ලිව්ඩී විය හැකිය. එනම්, ඔබ ඔබේ වැඩසටහන ආරම්භ කිරීමට දෙවරක් ක්ලික් කරන්නේ නම්, ඔබ දෙවරක් ක්ලික් කරන නාමාවලිය සීඩබ්ලිව්ඩී විය නොහැක.

සංස්කරණය කරන්න : මෙය පැරණි කවුළු සහ / හෝ ජාවා අනුවාද සඳහා පමණක් සත්‍ය බව පෙනේ.


2
මෙය සත්‍යයක් ලෙස නොපෙනේ, අවම වශයෙන් මගේ වින්ඩෝස් 7 යන්ත්‍රයේ ජාවා 7 භාවිතා නොකෙරේ user.dir. මම භාජන ගොනුව දෙවරක් ක්ලික් කළ ෆෝල්ඩරය නිරන්තරයෙන් පවතී.
ජොල්ටා

26

භාවිත CodeSource#getLocation() .

මෙය JAR ලිපිගොනු වලද හොඳින් ක්‍රියාත්මක වේ. ඔබ ලබා ගත හැක CodeSourceවිසින් ProtectionDomain#getCodeSource()සහ ProtectionDomainඅනෙක් අතට ලබා ගත හැක Class#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 ගොනුවේ පිහිටීම නැවත ලබා දෙයි. ඉල්ලූ දේ නොවේ.
ලෝර්න් හි මාක්විස්

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

12
මගේ යෙදුම JAR ගොනුවකින් දෙවරක් ක්ලික් කිරීමෙන් එය දියත් කරන විට NPE විසි කරයි.
මැතිව් නැණවත්

2
""යෙදුම ක්‍රියාත්මක වන්නේ JAR ගොනුවකින් හෝ CLASSPATH අංගයකින් නම් මෙය නැවත පැමිණේ . ඉල්ලූ දේ නොවේ.
ලෝර්න් හි මාක්විස්

Iz Zizouz212 getClass()යනු වස්තු ක්‍රමයකි, එබැවින් ස්ථිතික සන්දර්භය තුළ එය ඉවත් කිරීම thisක්‍රියා නොකරයි. එසේ කිරීමෙන් ඔබ සිටින පන්තියට පැහැදිලිවම යොමු විය යුතුය MyClass.class.getClassLoader()......
Kröw

18

සාමාන්‍යයෙන්, ගොනු වස්තුවක් ලෙස:

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

ඔබට "D: / a / b / c" වැනි සම්පූර්ණ සුදුසුකම් ලත් නූලක් කිරීමට අවශ්‍ය විය හැකිය:

getCwd().getAbsolutePath()

1
ඇන්ඩ්‍රොයිඩ් java.nio.file.Files ඇතුළත් නොවන බැවින් මෙය ඇන්ඩ්‍රොයිඩ් පරීක්ෂණ වලදී හොඳින් ක්‍රියාත්මක වේ.
iamreptar

ස්ථිතික සන්දර්භයක් තුළ මා වෙනුවෙන් වැඩ කරන බවක් නොපෙනේ (නව ගොනුව ("") NullPointerException විසි කරයි) ..?
nsandersen

2
andsandersen ඔබ බොහෝ විට වැරදි ගොනු වස්තුවක් භාවිතා කර ඇත: System.out.println (නව java.io.File (""). getAbsolutePath ());
comeGetSome


5

ඔබ ටර්මිනලයේ සිට භාජන ගොනුවක් ධාවනය කරන විට ලිනක්ස් මත , මෙම දෙකම එකම ආපසු String: "/ home / CurrentUser" මගේ හිතේ තියෙන භාජනයක් ගොනුව කොතැනක,. එය රඳා පවතින්නේ ඔබ භාජන ගොනුව ආරම්භ කරන විට ඔබේ පර්යන්තය සමඟ භාවිතා කරන වත්මන් නාමාවලිය මත පමණි.

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

System.getProperty("user.dir");

ඔබගේ Classසමඟ mainකැඳවනු ලැබුවහොත් MainClass, උත්සාහ කරන්න:

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

මෙය නැවත පැමිණෙන Stringසමග සත්ය මාර්ගය පිළිබඳ භාජනයක් ගොනුව.


3
ඉල්ලූ දේ නොවේ.
ලෝර්න් හි මාක්විස්

5

වින්ඩෝස් user.dir භාවිතා කිරීමෙන් ඩිරෙක්ටරිය බලාපොරොත්තු වූ පරිදි ලබා දෙයි, නමුත් ඔබ ඔබේ යෙදුම උසස් අයිතිවාසිකම් සමඟ ආරම්භ කරන විට (පරිපාලක ලෙස ධාවනය කරන්න), එවැනි අවස්ථාවකදී ඔබට C: \ WINDOWS \ system32 ලැබේ


4

පැකේජය ඇතුළුව වත්මන් නාමාවලියට ප්‍රවේශ වීමට ඔබට අවශ්‍ය යැයි මම විශ්වාස කරමි, එනම් ඔබේ ජාවා වැඩසටහන ක්‍රියාත්මක වී 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);

සටහන: මෙම කේතය වින්ඩෝස් හි පමණක් ඔරකල් ජේආර්ඊ සමඟ පරීක්ෂා කරනු ලැබේ.


6
මෙම පිළිතුර අවතක්සේරු නොකිරීම අගෞරවයකි. පළ කිරීමට පෙර කරුණාකර වඩාත් හොඳින් සිතා බලන්න. මේ සියල්ල සත්‍ය නම් මිස ඔබේ කේතය කැඩී ඇත: 1. ජේආර්ඊ යනු ඔරකල් ය, එසේ නොමැතිනම් "sun.java.command" පද්ධති දේපල → NPE; 2. මෙහෙයුම් පද්ධතිය යනු වින්ඩෝස් ය ( File.separatorඒ වෙනුවට භාවිතා කරන්න , නැතහොත් බහු-තර්ක Fileසාදන්නෙකු); 3. classpath විධාන රේඛාවේ specificed, ඇත හා (??) එම 'පැකේජය ඇතුළු වත්මන් නාමාවලියේ: ඒ. පළමුව සඳහන් කර ඇත, ආ. නිශ්චිතවම දක්වා ඇත, ඇ. සීඩබ්ලිව්ඩී සමඟ හරියටම ගැලපේ (වින්ඩෝස් සිද්ධි සංවේදීතාව සමඟ වුවද), සහ .. සීඩබ්ලිව්ඩී
මයිකල් ෂෙපර්ගෙන්

එය ලකුණු 1 සහ 2 ආමන්ත්‍රණය කරයි. නමුත් මට යමක් මග හැරී ඇත්නම්, ඔබ තවමත් විධාන රේඛාවේ (එනම් පරිසර විචල්‍යයක නොවේ) සහ 'පැකේජය ඇතුළුව වත්මන් නාමාවලිය' (I) ඔබ එයින් අදහස් කරන්නේ කුමක්දැයි මට නොතේරෙන බව පිළිගන්න) විශේෂයෙන් පංතියේ පළමු අංගයේ පැවත එන්නෙකු වීම. නඩුව ගැලපීමේ ගැටලුව තවමත් පවතී. මගේ ප්‍රකාශය ප්‍රයෝජනවත් නොවූයේ නම් මට කණගාටුයි; අදහස් දැක්වීමේ සීමාව තුළ තබා ගැනීමට මම පැහැදිලිකම කැප කළෙමි.
මයිකල් ෂෙපර්

N ඉන්වර්සස්, එය සමහර පරිසරවල “පරිපූර්ණව ක්‍රියා කරයි”; ඔබ එය අත්හදා බැලීමට තරම් වාසනාවන්ත විය. නීත්‍යානුකූල ධාවන කාල පරිසරයන් තුළ අසමත් වන මෘදුකාංග ලිවීම හොඳ පුරුද්දක් නොවේ, ඔබේ පරීක්ෂණ පරිසරය ඒවා ඇතුළත් කිරීමට තරම් පුළුල් නොවූවත්.
චාල්ස් ඩෆි

Har චාර්ල්ස් ඩෆි ඔබ හරි, එය හොඳ පුහුණුවක් නොවේ. වාසනාවකට මෙන්, මෙම විසඳුම "මගේ නිශ්චිත ගැටළුව විසඳීම" එය "නීත්‍යානුකූල ධාවන කාල පරිසරයන් තුළ අසමත් වීමට" හේතු නොවීය. ඇත්ත වශයෙන්ම, එවැනි අසාර්ථකත්වයක් විසඳීමට සහ වඩාත් ශක්තිමත් කේතයක් ලිවීමට එය මට උදව් විය, මා සතුව තිබූ විශේෂිත ගැටළුව විසඳීමට අමතරව (එය මෙම ප්‍රශ්නයට / පිළිතුරට තරමක් සම්බන්ධ විය). මම හිතන්නේ මම එය සොයා ගැනීමට වාසනාවන්තයි.
ඉන්වර්සස්

3

එය පරීක්ෂා කර ඇත්තේ පමණක් බව සඳහන් කරන්න, නමුත් එය Windowsවෙනත් මෙහෙයුම් පද්ධති මත පරිපූර්ණව ක්‍රියා කරයි යැයි සිතමි [ Linux,MacOs,Solaris] :).


එකම ඩිරෙක්ටරියේ මට ගොනු 2 ක් තිබුණි .jar. එක් .jarගොනුවකින් .jarඑකම ඩිරෙක්ටරියේ ඇති අනෙක් ගොනුව ආරම්භ කිරීමට මට අවශ්‍ය විය .

ගැටළුව වන්නේ ඔබ එය cmdවත්මන් නාමාවලියෙන් ආරම්භ කරන විට වීමයි system32.


අනතුරු ඇඟවීම්!

  • පහත i පවා ෆෝල්ඩරය නම සමඟ කළ සියලු ටෙස්ට් ඉතා හොදින් වැඩ කිරීමට පෙනේ ;][[;'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 ගොනුවේ පිහිටීම නැවත ලබා දෙයි. ඉල්ලූ දේ නොවේ.
ලෝර්න් හි මාක්විස්

JEJP .jar ගොනුවේ පිහිටීම ජාවා වැඩසටහනේ වත්මන් වැඩ නාමාවලිය නොවේද?
GOXR3PLUS

2

වර්තමාන වැඩ කරන නාමාවලිය විවිධ ජාවා ක්‍රියාත්මක කිරීමේදී වෙනස් ලෙස අර්ථ දක්වා ඇත. ජාවා 7 ට පෙර නිශ්චිත අනුවාදයක් සඳහා වැඩ කරන නාමාවලිය ලබා ගැනීමට ස්ථාවර ක්‍රමයක් නොතිබුණි. ජාවා ගොනුව දියත් කිරීමෙන් -Dසහ තොරතුරු රඳවා තබා ගැනීම සඳහා විචල්‍යයක් නිර්වචනය කිරීමෙන් ඔබට මෙය වටා වැඩ කළ හැකිය

වගේ දෙයක්

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

එය එතරම් නිවැරදි නැත, නමුත් ඔබට අදහස ලැබේ. එහෙනම් System.getProperty("com.mycompany.workingDir")...


6
ප්‍රශ්නයට අදාළ නොවේ.
පීටර් ද වින්ටර්

1
එයට ජාවාට අර්ථයක් ඇත - එය සාපේක්ෂ මාර්ග නාමයන් සමඟ ඔබ විවෘත කරන ලිපිගොනු සාපේක්ෂව තැටියේ පිහිටීමයි.
රොබ් අයි

2
ඔව්, එයට අර්ථයක් ඇත. මගේ වචන තරමක් දුර්වල ලෙස තෝරාගෙන ඇත. නමුත් ඔබට කාරණය මග හැරී ඇත - ජාවා 7 ට පෙර වර්තමාන වැඩ කරන නාමාවලිය දැන ගැනීමට ක්‍රමයක් නොතිබූ අතර විවිධ ක්‍රියාත්මක කිරීම් මඟින් ඒවා වෙනස් ආකාරයකින් සකසා ඇත ...
MJB

1

ඔබ ඔබේ ව්‍යාපෘතිය සූර්යග්‍රහණය තුළ හෝ නෙට්බීන් තුළ ක්‍රියාත්මක කිරීමට උත්සාහ කරන බව හෝ විධාන රේඛාවෙන් තනිවම සිටීමට උත්සාහ කරන්න. එය නිවැරදි කිරීම සඳහා මම ක්‍රමයක් ලියා ඇත

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

භාවිතා කිරීම සඳහා, ඔබට ගොනුව කියවීම සඳහා මූලික මාවතක් ලබා ගැනීමට අවශ්‍ය සෑම තැනකම, ඔබට ඔබේ නැංගුරම් පන්තිය ඉහත ක්‍රමයට යොමු කළ හැකිය, ප්‍රති result ලය ඔබට අවශ්‍ය දේ විය හැකිය: D

හොඳම,


2
මෙය JAR ගොනුවේ පිහිටීම නැවත ලබා දෙයි. ඉල්ලූ දේ නොවේ.
ලෝර්න් හි මාක්විස්

@ user207421 ඔව්, මෙම පිළිතුර ප්‍රශ්නයට සත්‍ය පිළිතුර නොවන බව මම දනිමි, නමුත් බොහෝ විට සෑම කෙනෙකුටම අවශ්‍ය වන්නේ “විධාන රේඛා වැඩ කරන නාමාවලිය” වෙනුවට “භාජන පිහිටා ඇති නාමාවලිය” ලබා ගැනීමයි.
බැච්ඩන්

1

ව්‍යාකූලත්වයේ මොහොත වන විට මෙය මගේ රිදී උණ්ඩයයි. (ප්‍රධාන වශයෙන් එය පළමු දෙය ලෙස හඳුන්වන්න). සමහර විට උදාහරණයක් ලෙස ජේවීඑම් IDE විසින් වෙනස් අනුවාදයක් ලෙස ලිස්සා ගොස් ඇත. මෙම ස්ථිතික ශ්‍රිතය වත්මන් ක්‍රියාවලිය PID සොයන අතර එම pid මත VisualVM විවෘත කරයි. ඔබට ඒ සියල්ල අවශ්‍ය නිසාත් එය ඔබට ලැබෙන නිසාත් ව්‍යාකූලත්වය එතැනම නතර වේ ...

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

ඔබ මෙම ප්‍රශ්නය ගැන පොතක් ලිවිය යුතුය. මෙම කේත පේළි 50 ප්‍රමාණවත් නොවේ.
පරිශීලක 2719152

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 ගොනුවේ පිහිටීම නැවත ලබා දෙයි. ඉල්ලූ දේ නොවේ.
ලෝර්න් හි මාක්විස්


-7

මෙය වත්මන් නාමාවලි නාමයයි

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

මෙය වත්මන් නාමාවලි මාර්ගයයි

String path=folder.getPath();

1
OP ට අවශ්‍ය වූයේ යෙදුම ක්‍රියාත්මක වූයේ කොතැනින්ද යන්න පිළිබඳව ය.
ලීෆ් ග ru න්වෝල්ඩ්

මෙය ඔබගේ නිවාස නාමාවලිය මිස වෙන කිසිවෙකුගේ වර්තමාන වැඩ කරන නාමාවලිය නොවේ. ඉල්ලූ දේ නොවේ.
ලෝර්න් හි මාක්විස්
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.