2009-12-17 53 views
83

Tôi đã sử dụng biến môi trường TMP để kiểm soát những thứ như nơi gcc ghi các tệp tạm thời của nó, nhưng dường như tôi không thể tìm thấy tương đương với API createTempFile của java.Biến môi trường để kiểm soát java.io.tmpdir?

Biến môi trường như vậy có tồn tại không?

+0

Các liên kết thực tế là http://java.sun.com/javase/6/docs/api/java/io/File.html#createTempFile(java.lang.String , java.lang.String, java.io.File) Stackoverflow không làm điều đúng khi tôi đặt URL đó vào (hoặc khi tôi thay thế dấu ngoặc đơn bằng% 28 và% 29). Tôi biết bằng cách sử dụng url ngắn hút, nhưng tôi figured nó là tốt hơn so với không có liên kết nào cả. –

+0

Tôi đã sửa liên kết. SO làm điều đúng đắn. – rmeador

+1

Cảm ơn. Tôi đoán mẹo này cũng thay thế không gian bằng% 20 –

Trả lời

100

Hmmm - - vì điều này được xử lý bởi JVM, tôi đã tìm hiểu mã nguồn OpenJDK VM một chút, nghĩ rằng có thể những gì được thực hiện bởi OpenJDK bắt chước những gì được thực hiện bởi Java 6 và trước đó. Nó không phải là yên tâm rằng có một cách để làm điều này khác hơn trên Windows.

Trên Windows, chức năng get_temp_directory() của OpenJDK thực hiện cuộc gọi API Win32 tới GetTempPath(); đây là cách trên Windows, Java phản ánh giá trị của biến môi trường TMP.

Trên LinuxSolaris, cùng một chức năng get_temp_directory() trả lại giá trị tĩnh /tmp/.

Tôi không biết liệu JDK6 thực tế có tuân theo các quy ước chính xác này hay không, nhưng theo hành vi trên mỗi nền tảng được liệt kê, có vẻ như chúng hoạt động.

+12

Câu trả lời tuyệt vời, bao gồm cả việc sử dụng "sử dụng nguồn" nổi tiếng bao giờ hết. +1 –

+28

Để rõ ràng, những gì bạn đang xem là mã gốc cung cấp * giá trị mặc định * cho thuộc tính "java.io.tmpdir" khi JVM tạo đối tượng thuộc tính Hệ thống. Điều này sẽ bị ghi đè bởi (ví dụ) một tùy chọn "-Djava.io.tmpdir = ...". –

+0

Cảm ơn, delfuego. Điều đó chắc chắn có ý nghĩa. –

22

Nó không phải là một biến môi trường, nhưng vẫn cung cấp cho bạn kiểm soát các thư mục temp:

-Djava.io.tmpdir 

cũ .:

java -Djava.io.tmpdir=/mytempdir 
86

Theo java.io.File Java Docs

Thư mục tệp tạm thời mặc định được chỉ định bởi thuộc tính hệ thống java.io.tmpdir. Trên các hệ thống UNIX, giá trị mặc định của thuộc tính này thường là "/ tmp" hoặc "/ var/tmp"; trên các hệ thống Microsoft Windows, nó thường là "c: \ temp". Một giá trị khác có thể được trao cho thuộc tính hệ thống này khi máy ảo Java được gọi, nhưng các thay đổi có lập trình đối với thuộc tính này không được bảo đảm có bất kỳ tác dụng nào đối với thư mục tạm thời được sử dụng bởi phương thức này.

Để xác định tài sản java.io.tmpdir hệ thống, bạn có thể gọi JVM như sau:

java -Djava.io.tmpdir=/path/to/tmpdir 

Theo mặc định giá trị này phải xuất phát từ biến TMP môi trường trên hệ thống Windows

+0

Điều này không trả lời được câu hỏi của tôi. Có một biến môi trường kiểm soát điều này? –

+1

Mặc dù chỉnh sửa của bạn, Bryan, java.io.tmpdir chắc chắn không tuân theo biến môi trường TMPDIR trên Mac hoặc trên Ubuntu (thử nghiệm trên 6.06). – delfuego

+0

Oy và một chỉnh sửa khác, khiến tất cả các nhận xét này có vẻ vô nghĩa. – delfuego

12

Để được rõ ràng về những gì đang xảy ra ở đây:

  • Cách khuyến khích để thiết lập vị trí thư mục tạm thời là để thiết lập thuộc tính hệ thống được gọi là "java.io.tmpdir", ví dụ bằng cách đưa ra tùy chọn -Djava.io.tmpdir=/mytempdir đến lệnh java. Tài sản cũng có thể được thay đổi từ bên trong một chương trình bằng cách gọi số System.setProperty("java.io.tmpdir", "/mytempdir) ... vấn đề bảo mật hộp cát modulo.

  • Nếu bạn không đặt thuộc tính "java.io.tmpdir" rõ ràng khi khởi động, JVM sẽ khởi tạo thuộc tính giá trị mặc định nền tảng cụ thể. Đối với Windows, mặc định thu được bằng cách gọi hàm Win32 API.Đối với Linux/Solaris, mặc định có vẻ như có dây cứng. Đối với các JVM khác, nó có thể là cái gì khác.

Theo kinh nghiệm, biến môi trường "TMP" hoạt động trên Windows (với JVM hiện tại), nhưng không hoạt động trên các nền tảng khác. Nếu bạn quan tâm đến tính di động, bạn nên đặt thuộc tính hệ thống một cách rõ ràng.

47

Bạn có thể đặt biến môi trường _JAVA_OPTIONS. Ví dụ trong bash này sẽ làm các trick:

export _JAVA_OPTIONS=-Djava.io.tmpdir=/new/tmp/dir 

tôi đặt đó vào kịch bản đăng nhập bash của tôi và nó dường như làm các trick.

+1

Trong khi điều này dường như hoạt động trên Linux và MacOSX, nó có tác dụng phụ không may khi in một số đầu ra bổ sung trên mỗi lần khởi chạy java: 'Đã chọn _JAVA_OPTIONS:' Điều này hoàn toàn gây nhầm lẫn quá trình xây dựng của chúng tôi. –

+3

Tôi đã bỏ phiếu cho câu trả lời này bởi vì nó trả lời câu hỏi của người dùng và người dùng không chỉ định hệ điều hành hoặc muốn tránh bất kỳ tác động phụ nào khác. Tôi tin rằng điều này nên được đặt là câu trả lời hay nhất –

+1

Biến này dường như cụ thể đối với Sun JVM - f.e. JVM J9 của IBM không hỗ trợ nó; nó hỗ trợ IBM_JAVA_OPTIONS thay vì – sendmoreinfo

31

Sử dụng

$ java -XshowSettings 
Property settings: 
    java.home = /home/nisar/javadev/javasuncom/jdk1.7.0_17/jre 
    java.io.tmpdir = /tmp 
+0

chính xác những gì tôi cần – yatendra

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