Bagaimana cara mendapatkan direktori kerja saat ini di Java?


112

Katakanlah saya memiliki kelas utama saya C:\Users\Justian\Documents\. Bagaimana saya bisa membuat program saya menunjukkan bahwa itu masuk C:\Users\Justian\Documents?

Hard-Coding bukanlah pilihan - ini harus dapat disesuaikan jika dipindahkan ke lokasi lain.

Saya ingin membuang banyak file CSV ke dalam folder, meminta program mengenali semua file, lalu memuat data dan memanipulasinya. Saya benar-benar hanya ingin tahu cara menavigasi ke folder itu.



1
Bagaimana jika kelas utama Anda ada dalam file jar? Hasil seperti apa yang Anda inginkan?
Mattias Nilsson

1
Mengapa Anda harus melakukan ini juga?
Ed S.

1
Kedengarannya seperti yang Anda butuhkan adalah direktori tempat file CSV berada, dan file .jar dapat merujuk ke direktori itu, lihat jawaban saya jika itu masalahnya.

Jawaban:


149

Salah satu caranya adalah dengan menggunakan properti sistem System.getProperty("user.dir"); ini akan memberi Anda "Direktori kerja saat ini ketika properti diinisialisasi". Ini mungkin yang Anda inginkan. untuk mengetahui di mana javaperintah dikeluarkan, dalam kasus Anda di direktori dengan file yang akan diproses, meskipun file .jar yang sebenarnya mungkin berada di tempat lain di mesin. Memiliki direktori dari file .jar sebenarnya tidak terlalu berguna dalam banyak kasus.

Berikut ini akan mencetak direktori saat ini dari mana perintah dipanggil terlepas dari di mana file .class atau .jar file .class berada.

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

jika Anda masuk /User/me/dan file .jar Anda yang berisi kode di atas ada di /opt/some/nested/dir/ perintah java -jar /opt/some/nested/dir/test.jar Testakan keluar current dir = /User/me.

Sebagai bonus, Anda juga harus menggunakan parser argumen baris perintah berorientasi objek yang baik. Saya sangat merekomendasikan JSAP , Java Simple Argument Parser. Ini akan memungkinkan Anda menggunakan System.getProperty("user.dir")dan sebagai alternatif meneruskan sesuatu yang lain untuk mengatasi perilaku tersebut. Solusi yang jauh lebih mudah dirawat. Ini akan membuat pengoperan direktori ke proses sangat mudah dilakukan, dan dapat digunakan kembali user.dirjika tidak ada yang diteruskan.


Saya akan mengujinya saat saya bisa. Saya benar-benar sibuk dengan masalah .jar: P
Justian Meyer

apakah Anda mengunjungi tautan dalam jawaban saya untuk masalah .jar itu, di mana saya menunjukkan cara membuat file .jar dengan ANT?

Kode dari Jarrod yang mengembalikan jalur absolut direktori kerja saat ini dari Properti Sistem user.dirjauh lebih mudah digunakan. System.getProperty ("user.dir");

74

Gunakan CodeSource#getLocation(). Ini berfungsi dengan baik di file JAR juga. Anda dapat memperoleh CodeSourceoleh ProtectionDomain#getCodeSource()dan ProtectionDomainpada gilirannya dapat diperoleh dengan 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());
    }
}

Perbarui sesuai komentar OP:

Saya ingin membuang banyak file CSV ke dalam folder, meminta program mengenali semua file, lalu memuat data dan memanipulasinya. Saya benar-benar hanya ingin tahu cara menavigasi ke folder itu.

Itu akan membutuhkan hardcoding / mengetahui jalur relatifnya di program Anda. Lebih baik pertimbangkan untuk menambahkan jalurnya ke classpath sehingga Anda bisa menggunakanClassLoader#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");
    }
});

Atau melewati jalannya sebagai main()argumen.


3
+1. Ada beberapa syarat untuk membuat ini berhasil; yang paling penting adalah bahwa "kelas utama" Anda dimuat dari sistem file. Di Jawa, tidak jarang asumsi ini salah. Tapi, jika Anda yakin bahwa Anda memuat kelas Anda dari JAR pada sistem file, ini adalah yang metode yang bekerja.
erickson

Itu semua tergantung, sungguh. Saya mencoba mendapatkan JAR saya untuk dikompilasi, tetapi itu adalah masalah terpisah saat ini. Jika Anda merasa dapat membantu, lihat: stackoverflow.com/questions/3152240/… . Saya yakin bahwa memposting ini adalah sejenis pelanggaran, tetapi terkait dengan masalah ini. Jika saya bisa memperbaikinya, ini pasti akan menjadi jawaban saya.
Justian Meyer

Mengapa saya perlu melakukan hardcode itu? Saya telah melakukan hal serupa sebelumnya. Asumsikan bahwa jar dan folder saya akan selalu memiliki hubungan yang serupa (yaitu dalam direktori yang sama). Jika ini benar, saya bisa mendapatkan direktori jar, lalu memodifikasinya untuk menemukan foldernya.
Justian Meyer

Jika ada di folder yang sama dengan file JAR, maka file tersebut sudah ada di classpath. Kata "hardcoding" agak dilebih-lebihkan, sebenarnya yang saya maksud adalah "mengetahui jalur relatif ke file JAR".
BalusC

1
@Moebius: Hah? Apakah Anda baru mengenal Java? Periksa javadoc tersebut . Cukup gunakan persis seperti yang dikembalikan oleh getLocation()metode. Yang lain jelas tidak akan berhasil.
BalusC

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

Mencetak sesuatu seperti:

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

Perhatikan bahwa File.getCanonicalPath()melempar IOException yang dicentang tetapi akan menghapus hal-hal seperti ../../../


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

perhatikan bahwa ini akan mengembalikan jalur ke "bin / kelas /", dan bukan hanya "bin".
Pengembang android

saat men-debug aplikasi yang sedang berjalan menggunakan Intellij Idea, ini mengembalikan "/C:/Program%20Files/Java/jdk1.8.0_112/:"
kecepatan

5

Saya baru saja menggunakan:

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

...

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

9
Milik Anda tidak berfungsi, ini benarPaths.get("").toAbsolutePath();
Kepada Kra

@ToKra Jika saya melakukan Paths.get("my/file").toAbsolutePath()saya mendapatkan /my/file, yang pasti bukan cwd.
abergmeier

1
@abergmeier Saya menulis "" dalam string bukan "/ file saya"
Kepada Kra

5

Jika Anda ingin mendapatkan direktori kerja Anda saat ini, gunakan baris berikut

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

4

Jika Anda menginginkan jalur absolut dari kode sumber saat ini, saran saya adalah:

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

Ini tidak berfungsi ketika Anda menjalankannya di IDE atau menggunakan sesuatu untuk memutar instance.
Sarp Kaya

Jalur internal adalah java \ lang \ Class Jalur eksternal adalah E: \ BranchProduction1.4.0 \ FilesTestProject \ src Direktori kerja adalah E: \ BranchProduction1.4.0 \ FilesTestProject \ src \ java \ lang dapatkah Anda menjelaskan hasilnya?
JAWA

3

Siapa bilang kelas utama Anda ada dalam file di harddisk lokal? Kelas lebih sering digabungkan di dalam file JAR, dan terkadang dimuat melalui jaringan atau bahkan dihasilkan dengan cepat.

Jadi, apa yang sebenarnya ingin Anda lakukan? Mungkin ada cara untuk melakukannya yang tidak membuat asumsi tentang asal kelas.


Saya ingin membuang banyak file CSV ke dalam folder, meminta program mengenali semua file, lalu memuat data dan memanipulasinya. Saya benar-benar hanya ingin tahu cara menavigasi ke folder itu.
Justian Meyer

Mungkin aku melewatkan sesuatu tapi sepertinya jalur absolut akan berhasil. Anda bilang Anda tidak bisa membuat hardcode, tapi bagaimana Anda tahu folder mana yang harus dicari?
Chris Thompson

Masalahnya adalah saya ingin membawanya ke komputer lain, bukan hanya milik saya sendiri. Saya tidak melihat bagaimana hardcode jalur akan bekerja. "Asumsikan bahwa jar dan folder saya akan selalu memiliki hubungan yang serupa (yaitu dalam direktori yang sama). Jika ini benar, saya bisa mendapatkan direktori dari jar, lalu memodifikasinya untuk menemukan folder tersebut." Satu-satunya cara saya dapat membuat kode keras adalah jika saya tidak harus menyertakan jalur lengkap dari hard drive ke file. Mungkin saya bisa mundur hanya 3 folder (yaitu "Documents \ Project \ Dump \ [file / folder]")
Justian Meyer

Saya akan mengatakan apa yang ingin Anda lakukan adalah mendapatkan pegangan ke direktori tempat file jar berada. Apakah itu memenuhi kebutuhan Anda?
Chris Thompson
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.