2009-08-05 26 views
6

Hầu như mọi bài viết tôi đọc đều nói với tôi rằng bạn không thể có chdir bằng Java. Câu trả lời được chấp nhận cho this question nói rằng bạn không thể làm điều đó trong Java.Tại sao thuộc tính hệ thống user.dir hoạt động trong Java?

Tuy nhiên, đây là một số những thứ tôi đã cố gắng:

 
[email protected]:~$ java -version 
java version "1.6.0_14" 
Java(TM) SE Runtime Environment (build 1.6.0_14-b08) 
Java HotSpot(TM) Client VM (build 14.0-b16, mixed mode, sharing) 

Dưới đây là một lớp học thử nghiệm Tôi đang sử dụng:

import java.io.*; 

public class Ch { 
    public static void main(String[] args) { 
     System.out.println(new File(".").getAbsolutePath()); 
     System.setProperty("user.dir","/media"); 
     System.out.println(new File(".").getAbsolutePath()); 
    } 
} 
 
[email protected]:~$ pwd 
/home/geo 
[email protected]:~$ java Ch 
/home/geo/. 
/media/. 

Xin giải thích tại sao điều này làm việc. Tôi có thể sử dụng điều này từ bây giờ và mong đợi nó hoạt động theo cùng một cách trên tất cả các nền tảng?

Trả lời

10

Chỉ vì new File(".") cho câu trả lời mong muốn không có nghĩa là nó đang làm những gì bạn muốn.

Ví dụ, hãy thử:

new FileOutputStream("foo.txt").close(); 

Trường hợp nào mà cuối lên? Trên hộp Windows của tôi, mặc dù new File(".").getAbsolutePath() di chuyển xung quanh dựa trên user.dir, foo.txt luôn được tạo trong thư mục làm việc ban đầu. Nó tấn công tôi rằng thiết lập user.dir sao cho new File(".")không tham chiếu tới thư mục làm việc hiện tại chỉ yêu cầu sự cố.

+0

Tôi đã không kiểm tra điều đó :). Tôi dừng lại khi tôi thấy rằng việc thay đổi thuộc tính user.dir được thể hiện bởi lớp File. – Geo

+1

Đó là ... nên ... vậy ... *** sai ***. :-) –

6

Trích:

Thuộc tính user.dir được đặt ở VM nghiệp mới thành lập thư mục làm việc. Bạn không nên thay đổi thuộc tính này hoặc đặt nó trên dòng lệnh. Nếu bạn làm như vậy, thì bạn sẽ thấy một số hành vi không nhất quán như có những nơi trong thực hiện giả định rằng user.dir là thư mục làm việc và nó không thay đổi trong suốt vòng đời của VM.

Các cuộc thảo luận là here

1

File.getAbsoluteFile() được chỉ nhìn vào tài sản hệ thống user.dir, mà là một bản sao của thư mục làm việc của quá trình tại VM khởi động.

Bài kiểm tra tốt hơn có thể là kiểm tra xem thư mục làm việc của quy trình có thay đổi không. Cách bạn có thể thực hiện việc này thay đổi theo nền tảng, nhưng trên Linux, bạn có thể thực hiện điều gì đó như:

$ ls -l /proc/18037/cwd 
lrwxrwxrwx 1 laurence laurence 0 2009-08-05 11:16 /proc/18037/cwd -> /home/laurence/ 

nơi "18037" là phần của quy trình được đề cập. Nếu bạn làm điều này tôi tin rằng bạn sẽ thấy rằng thư mục làm việc của quá trình không thực sự thay đổi khi bạn cập nhật user.dir.

Các vấn đề liên quan