Apakah ada padanan Java untuk System.IO.Path.Combine()
dalam C # /. NET? Atau kode apa saja untuk mencapai ini?
Metode statis ini menggabungkan satu atau lebih string ke jalur.
Apakah ada padanan Java untuk System.IO.Path.Combine()
dalam C # /. NET? Atau kode apa saja untuk mencapai ini?
Metode statis ini menggabungkan satu atau lebih string ke jalur.
Jawaban:
Daripada menjaga semua berbasis string, Anda harus menggunakan kelas yang dirancang untuk mewakili jalur sistem file.
Jika Anda menggunakan Java 7 atau Java 8, Anda harus mempertimbangkan untuk menggunakan java.nio.file.Path
; Path.resolve
dapat digunakan untuk menggabungkan satu jalur dengan yang lain, atau dengan string. Kelas Paths
pembantu juga berguna. Sebagai contoh:
Path path = Paths.get("foo", "bar", "baz.txt");
Jika Anda perlu memenuhi lingkungan pra-Java-7, Anda dapat menggunakan java.io.File
, seperti ini:
File baseDirectory = new File("foo");
File subDirectory = new File(baseDirectory, "bar");
File fileInDirectory = new File(subDirectory, "baz.txt");
Jika Anda ingin mengembalikannya sebagai string nanti, Anda dapat menelepon getPath()
. Memang, jika Anda benar-benar ingin meniru Path.Combine
, Anda bisa menulis sesuatu seperti:
public static String combine(String path1, String path2)
{
File file1 = new File(path1);
File file2 = new File(file1, path2);
return file2.getPath();
}
path2
(mengabaikan path1
) jika path2
merupakan jalur absolut. Versi Java akan menjatuhkan yang pertama /
atau \
dan memperlakukannya sebagai jalur relatif.
File.getCanonicalPath
.
File
di C # jika Anda mau. (Saya berasumsi maksud Anda keberadaan File
adalah manfaat, yang akan saya setujui.)
Di Java 7, Anda harus menggunakan resolve
:
Path newPath = path.resolve(childPath);
Sementara kelas Path NIO2 mungkin tampak sedikit berlebihan untuk File dengan API berbeda yang tidak perlu, itu sebenarnya secara halus lebih elegan dan kuat.
Perhatikan bahwa Paths.get()
(seperti yang disarankan oleh orang lain) tidak memiliki kelebihan mengambil Path
, dan melakukan Paths.get(path.toString(), childPath)
TIDAK sama dengan resolve()
. Dari Paths.get()
dokumen :
Perhatikan bahwa walaupun metode ini sangat nyaman, menggunakannya akan menyiratkan referensi yang diasumsikan ke Sistem File default dan membatasi utilitas kode panggilan. Oleh karena itu tidak boleh digunakan dalam kode perpustakaan yang dimaksudkan untuk digunakan kembali secara fleksibel. Alternatif yang lebih fleksibel adalah dengan menggunakan instance Path yang ada sebagai jangkar, seperti:
Path dir = ... Path path = dir.resolve("file");
Fungsi saudari resolve
adalah yang terbaik relativize
:
Path childPath = path.relativize(newPath);
Jawaban utamanya adalah menggunakan objek File. Namun Commons IO memiliki kelas FilenameUtils yang dapat melakukan hal semacam ini, seperti metode concat () .
Saya tahu ini sudah lama sejak jawaban asli Jon, tetapi saya memiliki persyaratan yang serupa dengan OP.
Dengan cara memperluas solusi Jon saya datang dengan yang berikut, yang akan mengambil satu atau lebih segmen jalan mengambil banyak segmen jalan yang bisa Anda lemparkan ke sana.
Pemakaian
Path.combine("/Users/beardtwizzle/");
Path.combine("/", "Users", "beardtwizzle");
Path.combine(new String[] { "/", "Users", "beardtwizzle", "arrayUsage" });
Kode di sini untuk orang lain dengan masalah yang sama
public class Path {
public static String combine(String... paths)
{
File file = new File(paths[0]);
for (int i = 1; i < paths.length ; i++) {
file = new File(file, paths[i]);
}
return file.getPath();
}
}
pendekatan independen platform (menggunakan File.separator, yaitu akan berfungsi tergantung pada sistem operasi tempat kode berjalan:
java.nio.file.Paths.get(".", "path", "to", "file.txt")
// relative unix path: ./path/to/file.txt
// relative windows path: .\path\to\filee.txt
java.nio.file.Paths.get("/", "path", "to", "file.txt")
// absolute unix path: /path/to/filee.txt
// windows network drive path: \\path\to\file.txt
java.nio.file.Paths.get("C:", "path", "to", "file.txt")
// absolute windows path: C:\path\to\file.txt
Untuk meningkatkan jawaban JodaStephen, Apache Commons IO memiliki FilenameUtils yang melakukan ini. Contoh (di Linux):
assert org.apache.commons.io.FilenameUtils.concat("/home/bob", "work\\stuff.log") == "/home/bob/work/stuff.log"
Ini platform independen dan akan menghasilkan pemisah apa pun yang dibutuhkan sistem Anda.
Inilah solusi yang menangani beberapa bagian jalur dan kondisi tepi:
public static String combinePaths(String ... paths)
{
if ( paths.length == 0)
{
return "";
}
File combined = new File(paths[0]);
int i = 1;
while ( i < paths.length)
{
combined = new File(combined, paths[i]);
++i;
}
return combined.getPath();
}
Jika Anda tidak membutuhkan lebih dari string, Anda dapat menggunakan com.google.common.io.Files
Files.simplifyPath("some/prefix/with//extra///slashes" + "file//name")
mendapatkan
"some/prefix/with/extra/slashes/file/name"
Mungkin terlambat ke pesta, tapi aku ingin berbagi pendapat tentang ini. Saya menggunakan pola Builder dan memungkinkan append
panggilan yang dirantai . Itu dapat dengan mudah diperluas untuk mendukung bekerja dengan Path
objek juga.
public class Files {
public static class PathBuilder {
private File file;
private PathBuilder ( File root ) {
file = root;
}
private PathBuilder ( String root ) {
file = new File(root);
}
public PathBuilder append ( File more ) {
file = new File(file, more.getPath()) );
return this;
}
public PathBuilder append ( String more ) {
file = new File(file, more);
return this;
}
public File buildFile () {
return file;
}
}
public static PathBuilder buildPath ( File root ) {
return new PathBuilder(root);
}
public static PathBuilder buildPath ( String root ) {
return new PathBuilder(root);
}
}
Contoh penggunaan:
File root = File.listRoots()[0];
String hello = "hello";
String world = "world";
String filename = "warez.lha";
File file = Files.buildPath(root).append(hello).append(world)
.append(filename).buildFile();
String absolute = file.getAbsolutePath();
Hasilnya absolute
akan berisi sesuatu seperti:
/hello/world/warez.lha
atau bahkan mungkin:
A:\hello\world\warez.lha
Ini juga berfungsi di Java 8:
Path file = Paths.get("Some path");
file = Paths.get(file + "Some other path");
Solusi ini menawarkan antarmuka untuk menggabungkan fragmen jalur dari array String []. Ini menggunakan java.io.File.File (induk String, String child) :
public static joinPaths(String[] fragments) {
String emptyPath = "";
return buildPath(emptyPath, fragments);
}
private static buildPath(String path, String[] fragments) {
if (path == null || path.isEmpty()) {
path = "";
}
if (fragments == null || fragments.length == 0) {
return "";
}
int pathCurrentSize = path.split("/").length;
int fragmentsLen = fragments.length;
if (pathCurrentSize <= fragmentsLen) {
String newPath = new File(path, fragments[pathCurrentSize - 1]).toString();
path = buildPath(newPath, fragments);
}
return path;
}
Maka Anda bisa melakukan:
String[] fragments = {"dir", "anotherDir/", "/filename.txt"};
String path = joinPaths(fragments);
Pengembalian:
"/dir/anotherDir/filename.txt"