2010-12-13 38 views
12

Đây là đầu vào như chuỗi:Java phân chia đường dẫn ..?

"C:\jdk1.6.0\bin\program1.java" 

tôi cần đầu ra như:

Path-->C:\jdk1.6.0\bin\ 
file--->program1.java 
extension--->.java 

Coi chừng những "\" char. Tôi dễ dàng có đầu ra cho "/".

+2

Bạn hiện có mã nào? –

+0

Làm theo bình luận của bạn để giải pháp @Kurt đó là bài tập về nhà. Vui lòng xóa thẻ này. –

+0

Nó không phải là một bài tập về nhà. Tôi đã tách nó bằng cách sử dụng indexOf() và subString(). Tôi chỉ cần lý do tại sao chúng tôi không thể phân chia này bằng cách sử dụng split() ...? Tôi vẫn chưa nhận được câu trả lời cho điều này. – yuvaraj

Trả lời

21

Lớp File cung cấp cho bạn mọi thứ bạn cần:

File f = new File("C:\\jdk1.6.0\\bin\\program1.java"); 
    System.out.println("Path-->" + f.getParent()); 
    System.out.println("file--->" + f.getName());  
    int idx = f.getName().lastIndexOf('.'); 
    System.out.println("extension--->" + ((idx > 0) ? f.getName().substring(idx) : "")); 

EDIT: '' Cảm ơn Dave cho lưu ý rằng String.lastIndexOf sẽ trở về -1 nếu File.getName does not contain.

+0

cảm ơn bạn .. :) Có giải pháp nào sử dụng String.split() ... ??? – yuvaraj

+3

Nếu bạn đang cố gắng giới hạn mình với String.split, hãy lưu ý cách Kurt đang sử dụng 'lastIndexOf()' –

+1

'Tệp f = new File (" C: \\ jdk1.6.0 \\ doc \\ readme "); Mã của bạn làm gì trong trường hợp đó? –

3

Kể từ lớp File Java không hỗ trợ thăm dò cho việc gia hạn, tôi khuyên bạn nên tạo một lớp con của File cung cấp khả năng này:

package mypackage; 

/** 
* Enhances java.io.File functionality by adding extension awareness. 
*/ 
public class File extends java.io.File { 
    /** 
    * Returns the characters after the last period. 
    * 
    * @return An empty string if there is no extension. 
    */  
    public String getExtension() { 
    String name = getName(); 
    String result = ""; 
    int index = name.lastIndexOf('.'); 

    if(index > 0) { 
     result = name.substring(index); 
    } 

    return result; 
    } 
} 

Bây giờ chỉ đơn giản là thay thế các phiên bản của tập tin cho phiên bản Java và, khi kết hợp với câu trả lời của Kurt, cung cấp cho bạn mọi thứ bạn cần.

Lưu ý rằng việc sử dụng phân lớp là lý tưởng vì nếu bạn muốn thay đổi hành vi (do một hệ điều hành khác sử dụng dấu phân cách mở rộng khác), bạn chỉ cần cập nhật một phương pháp duy nhất và toàn bộ ứng dụng của bạn tiếp tục hoạt động. (Hoặc nếu bạn cần phải sửa chữa một lỗi, chẳng hạn như cố gắng để thực hiện str.substring(-1).)

Nói cách khác, nếu bạn trích xuất một phần mở rộng tập tin trong hơn một nơi trong cơ sở mã của bạn, bạn đã thực hiện một sai lầm.

Hơn thế nữa, nếu bạn muốn hoàn toàn trừu tượng những kiến ​​thức của các loại tập tin (vì một số hệ điều hành có thể không sử dụng . separator), bạn có thể viết:

/** 
* Enhances java.io.File functionality by adding extension awareness. 
*/ 
public class File extends java.io.File { 
    public File(String filename) { 
    super(filename); 
    } 

    /** 
    * Returns true if the file type matches the given type. 
    */ 
    public boolean isType(String type) { 
    return getExtension().equals(type); 
    } 

    /** 
    * Returns the characters after the last period. 
    * 
    * @return An empty string if there is no extension. 
    */  
    private String getExtension() { 
    String name = getName(); 
    String result = ""; 
    int index = name.lastIndexOf('.'); 

    if(index > 0) { 
     result = name.substring(index); 
    } 

    return result; 
    } 
} 

tôi sẽ xem xét việc này một nhiều hơn nữa giải pháp mạnh mẽ. Điều này sẽ liên tục cho phép thay thế một cơ chế phát hiện loại tệp nâng cao hơn (phân tích nội dung tệp để xác định loại), mà không phải thay đổi mã gọi. Ví dụ:

File file = new File("myfile.txt"); 
if(file.isType("png")) { 
    System.out.println("PNG image found!"); 
} 

Nếu người dùng lưu "myfile.png" là "myfile.txt", hình ảnh vẫn sẽ được xử lý vì các phiên bản cao cấp (không hiển thị ở đây) sẽ tìm kiếm các "PNG" đánh dấu bắt đầu mọi tệp PNG duy nhất trong thế giới (cyber).

+0

Có thể bạn đã đúng. Tất cả những gì tôi muốn biết là tại sao chúng ta không thể phân chia điều này bằng cách sử dụng String.split() ..? – yuvaraj

+0

Tôi không thể tách chuỗi bằng String.split() bằng cách sử dụng "\\" làm dấu phân cách. Toàn bộ chuỗi được trả về phần tử đầu tiên của mảng. Tôi không biết tại sao .. Bạn có thể viết mã cho điều đó ..? – yuvaraj

+0

@yuvaraj: Điều tôi đang nói là 'String.split()' không phải là cách viết đúng chức năng này. Bạn thực sự nên sử dụng 'indexOf()' như đã được đề cập. –

8

Cân nhắc sử dụng giải pháp hiện tại thay vì tự giải pháp và giới thiệu thêm mã cần được kiểm tra. FilenameUtils từ Apache Commons IO là một ví dụ:

http://commons.apache.org/proper/commons-io/javadocs/api-2.4/org/apache/commons/io/FilenameUtils.html

+0

Có thể bạn đã đúng. Tất cả những gì tôi muốn biết là tại sao chúng ta không thể phân chia điều này bằng cách sử dụng String.split() ..? – yuvaraj

+0

Tôi, cá nhân, có xu hướng cảnh giác với các lớp học tiện ích; họ smack chức năng, không lập trình hướng đối tượng. Gói Apache Commons đã mở rộng 'File' trực tiếp để nâng cao hành vi của nó, như tôi đã chỉ ra. –

+1

@Dave Jarvis: Tôi không thể tranh cãi rằng đó là một API chức năng và vào cuối ngày tùy theo sở thích cá nhân. Đối với tôi, nó đi đến lợi ích của việc duy trì khả năng triển khai API. – Rhysyngsun

3

Bạn cần phải bù đắp cho sự slashes đôi trở trong đường dẫn (nếu nó đã được tạo lập trình).

//Considering that strPath holds the Path String 
String[] strPathParts = strPath.split("\\\\"); 

//Now to check Windows Drive 
System.out.println("Drive Name : "+strPathParts[0]); 
Các vấn đề liên quan