জাভাতে বর্তমান ওয়ার্কিং ডিরেক্টরি কীভাবে পাবেন?


112

ধরা যাক আমার মধ্যে আমার প্রধান ক্লাস রয়েছে C:\Users\Justian\Documents\। আমি কীভাবে আমার প্রোগ্রামটি এটিতে দেখানোর জন্য পেতে পারি C:\Users\Justian\Documents?

হার্ড-কোডিং কোনও বিকল্প নয় - এটি অন্য কোনও স্থানে সরিয়ে নেওয়া হলে এটি অভিযোজ্য হতে হবে।

আমি একটি ফোল্ডারে সিএসভি ফাইলগুলির একগুচ্ছ ডাম্প করতে চাই, প্রোগ্রামটি সমস্ত ফাইল সনাক্ত করতে পারে, তারপরে ডেটা লোড করে এবং এগুলি পরিচালনা করে। আমি সত্যিই এই ফোল্ডারে কীভাবে নেভিগেট করব তা জানতে চাই।



1
যদি আপনার মূল শ্রেণি একটি জার ফাইলের মধ্যে থাকে? আপনি কি ধরণের ফলাফল চান?
ম্যাটিয়াস নীলসন

1
কেন আপনি যেহেতু কখনও এটি করার প্রয়োজন হবে?
এড এস

1
আপনার যা দরকার তা হ'ল সিএসভি ফাইল ডিরেক্টরিতে থাকা ডিরেক্টরিটি রয়েছে এবং .jar ফাইলটি সেই ডিরেক্টরিটি উল্লেখ করতে সক্ষম হতে পারে তবে যদি উত্তর হয় তবে আমার উত্তরটি দেখুন।

উত্তর:


149

সিস্টেমের বৈশিষ্ট্যটি ব্যবহার করার একটি উপায় হ'ল এটি System.getProperty("user.dir");আপনাকে "বৈশিষ্ট্যগুলি আরম্ভ করার সময় বর্তমান ওয়ার্কিং ডিরেক্টরি" দেবে। এটি সম্ভবত আপনি চান খুঁজে বের করতে যেখানে javaকমান্ড প্রক্রিয়া ফাইলগুলির সাথে ডিরেক্টরির মধ্যে, জারি করা হয় আপনার ক্ষেত্রে, যদিও প্রকৃত জার ফাইল মেশিনে অন্য কোথাও রক্ষিত হতে পারে। আসল .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/এবং উপরের কোডটি ধারণ করে আপনার .jar ফাইলটি /opt/some/nested/dir/ কমান্ডের java -jar /opt/some/nested/dir/test.jar Testআউটপুট দেয় current dir = /User/me

আপনার কোনও ভাল অবজেক্ট ওরিয়েন্টেড কমান্ড লাইন আর্গুমেন্ট পার্সার ব্যবহার করে বোনাস হিসাবে দেখা উচিত। আমি জেএসএপি , জাভা সিম্পল আর্গুমেন্ট পার্সারকে উচ্চতর প্রস্তাব দিই । এটি আপনাকে ব্যবহার করতে দেয় System.getProperty("user.dir")এবং বিকল্পভাবে আচরণকে অতিরিক্ত চালানোর জন্য অন্য কোনও কিছুতে প্রেরণা দেয়। আরও অনেক রক্ষণাবেক্ষণ সমাধান। এটি ডিরেক্টরিতে পাস করার প্রক্রিয়াটি খুব সহজ করে দেয় এবং user.dirকিছুই পাস না করে পিছনে পড়তে সক্ষম হয় ।


আমি যখন পারবো তখন এটি পরীক্ষা করে নেব। আমি সত্যিই সেই জার ইস্যুতে ডুবে আছি: পি
জাস্টিয়ান মেয়ার

আপনি যে জার ইস্যুটির উত্তরটিতে লিঙ্কটি পরিদর্শন করেছেন, যেখানে আমি কীভাবে এএনটি দিয়ে .jar ফাইলটি তৈরি করব তা দেখিয়েছি?

জারোডের কোড যা বর্তমান সম্পত্তি ডিরেক্টরি ডিরেক্টরি থেকে সম্পত্তি সম্পত্তি থেকে প্রত্যাহার করে user.dirতা ব্যবহার করা অনেক সহজ। System.getProperty ( "user.dir");

74

ব্যবহার CodeSource#getLocation()। এটি JAR ফাইলগুলিতেও কাজ করে fine আপনি 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());
    }
}

ওপির মন্তব্য অনুসারে আপডেট করুন:

আমি একটি ফোল্ডারে সিএসভি ফাইলগুলির একগুচ্ছ ডাম্প করতে চাই, প্রোগ্রামটি সমস্ত ফাইল সনাক্ত করতে পারে, তারপরে ডেটা লোড করে এবং এগুলি পরিচালনা করে। আমি সত্যিই এই ফোল্ডারে কীভাবে নেভিগেট করব তা জানতে চাই।

এটির জন্য আপনার প্রোগ্রামে হার্ডকডিং / তাদের আপেক্ষিক পথটি জানা দরকার require ক্লাসপথে এর পথ যুক্ত করার বিষয়টি বিবেচনা করুন যাতে আপনি ব্যবহার করতে পারেন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 টি। এই কাজটি করার জন্য বেশ কয়েকটি শর্ত রয়েছে; সর্বাধিক গুরুত্বপূর্ণটি হ'ল আপনার "প্রধান শ্রেণি" ফাইল সিস্টেম থেকে লোড হয়। জাভাতে, এই অনুমানটি মিথ্যা হওয়ার পক্ষে মারাত্মক অস্বাভাবিক কিছু নয়। তবে, আপনি যদি নিশ্চিত হন যে আপনি ফাইল সিস্টেমে কোনও জআর থেকে আপনার ক্লাসটি লোড করছেন, এটি সেই পদ্ধতি যা কাজ করে।
এরিকসন

এটি সব নির্ভর করে, সত্যই। আমি আমার জেআর কে সংকলিত করার চেষ্টা করছি , তবে এই মুহুর্তে এটি একটি পৃথক সমস্যা। আপনি যদি মনে করেন যে আপনি এটিতে সহায়তা করতে পারেন, তাহলে দেখুন: stackoverflow.com/questions/3152240/… । আমি নিশ্চিত যে এটি পোস্ট করা কোনও প্রকারের অনুভূতি তবে এটি এই সমস্যার সাথে সম্পর্কিত। যদি আমি এটি স্থির করতে পারি তবে এটি অবশ্যই আমার উত্তর।
জাস্টিয়ান মেয়ার

আমার কেন হার্ডকোড লাগবে? আমি আগেও একই রকম কাজ করেছি। অনুমান করুন যে আমার জার এবং ফোল্ডারটির সর্বদা একই সম্পর্ক থাকবে (অর্থাত্ একই ডিরেক্টরিতে)। যদি এটি সত্য হয় তবে আমি জারের ডিরেক্টরিটি পেতে পারি, তারপরে ফোল্ডারটি সন্ধানের জন্য এটি পরিবর্তন করুন।
জাস্টিয়ান মেয়ার

যদি এটি JAR ফাইলের মতো একই ফোল্ডারে থাকে তবে এটি ইতিমধ্যে ক্লাসপথে রয়েছে। "হার্ডকোডিং" শব্দটি কিছুটা অতিরঞ্জিত, আমার আসলে "জেআর ফাইলের সাথে সম্পর্কিত তাদের পথটি জানা" অর্থ ছিল।
বালাসসি

1
@ মোবিবিস: হাহ? আপনি জাভা নতুন? জাভাদোক পরীক্ষা করুনgetLocation()পদ্ধতি দ্বারা ফিরে হিসাবে ঠিক যে এক ব্যবহার করুন । অন্যগুলি অবশ্যই কাজ করবে না work
বালুসসি

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

দ্রষ্টব্য যে এটি "বিন / শ্রেণি /" -র দিকে ফিরে আসবে, এবং কেবল "বিন" নয়।
অ্যান্ড্রয়েড বিকাশকারী

ইন্টেলিজ আইডিয়া ব্যবহার করে একটি চলমান অ্যাপ্লিকেশন ডিবাগ করার সময়, এটি ফিরে এসেছে "/ সি: / প্রোগ্রাম ১০০ ফাইলেস / জাভা / জেডিকি ১.৮.০.১২ / ১২:"
বেগ

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 আমি লিখেছি "আমার / ফাইল" স্ট্রিং না ""
করতে ক্রা

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

আপনি যখন এটি কোনও আইডিইতে চালিত করেন বা উদাহরণটি স্পিন করার জন্য কোনও কিছু ব্যবহার করেন এটি কাজ করে না।
সরপ কেয়া

অভ্যন্তরীণ পথটি জাভা \ ল্যাং \ শ্রেণি বহিরাগত পাথ ই: \ ব্রাঞ্চপ্রডাকশন ১.৪.০ T ফাইলস্টেস্টপ্রজেক্ট \ এসআরসি ওয়ার্কিং ডিরেক্টরি হ'ল ই: \ ব্রাঞ্চপ্রডাকশন ১.৪.০ T ফাইলসটেষ্টপ্রজেক্ট \ এসআরসি \ জাভা \ ল্যাং আপনি আউটপুটটি ব্যাখ্যা করতে পারবেন?
জাভা

3

কে বলেছে আপনার স্থানীয় শ্রেণি একটি স্থানীয় হার্ডডিস্কের একটি ফাইল আছে? ক্লাসগুলি প্রায়শই জেআর ফাইলগুলির মধ্যে বান্ডিল হয়ে থাকে এবং কখনও কখনও নেটওয়ার্কের ওপরে বা এমনকি ফ্লাইতে উত্পন্ন হয়।

সুতরাং এটি আসলে আপনি কি করতে চান? এটি করার সম্ভবত একটি উপায় রয়েছে যা ক্লাসগুলি কোথা থেকে আসে তা অনুমান করে না।


আমি একটি ফোল্ডারে সিএসভি ফাইলগুলির একগুচ্ছ ডাম্প করতে চাই, প্রোগ্রামটি সমস্ত ফাইল সনাক্ত করতে পারে, তারপরে ডেটা লোড করে এবং এগুলি পরিচালনা করে। আমি সত্যিই এই ফোল্ডারে কীভাবে নেভিগেট করব তা জানতে চাই।
জাস্টিয়ান মেয়ার

হয়তো আমি কিছু মিস করছি তবে মনে হচ্ছে কোনও পরম পথ কাজ করবে। আপনি বলেছিলেন যে আপনি এটিকে হার্ডকোড করতে পারবেন না, তবে কী ফোল্ডারটি শুরু করতে হবে তা আপনি কীভাবে জানতে পারবেন?
ক্রিস থম্পসন

ভাল সমস্যাটি হ'ল আমি এটি কেবল নিজের নয়, অন্য কম্পিউটারগুলিতেও আনতে চাই। আমি দেখি না যে হার্ডকোডিংটি কীভাবে কাজ করবে। "ধরে নিন যে আমার জার এবং ফোল্ডারটির সর্বদা একই সম্পর্ক থাকবে (যেমন একই ডিরেক্টরিতে) If এটি সত্য হলে আমি জারের ডিরেক্টরিটি পেতে পারি, তবে ফোল্ডারটি সন্ধানের জন্য এটি পরিবর্তন করুন।" আমি হার্ডকোডের একমাত্র উপায় হ'ল যদি আমাকে হার্ড ড্রাইভ থেকে ফাইলের পুরো পথটি অন্তর্ভুক্ত না করতে হয়। সম্ভবত আমি মাত্র 3 ফোল্ডার ফিরে যেতে পারি (যেমন "ডকুমেন্টস \ প্রকল্প \ ডাম্প \ [ফাইল / ফোল্ডার]")
জাস্টিয়ান মেয়ার

আমি বলব আপনি যা করতে চান তা হ'ল জার ফাইলটি যে ডিরেক্টরিটিতে থাকে সেটির একটি হ্যান্ডেল পাওয়া যায় that তা কি আপনার প্রয়োজনীয়তা পূরণ করবে?
ক্রিস থম্পসন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.