![](/img/trans.png)
[英]getResourceAsStream returns null but File.canRead() returns true
[英]File.canRead() returns false
我有一個服務器客戶端程序,服務器在Raspberry Pi(運行Linux)上運行,客戶端為Android應用程序。 我正在編寫一個應用程序內文件瀏覽器,該瀏覽器僅將路徑發送到服務器,然后服務器使用file.listFiles()
返回文件列表(服務器用Java編寫)。
我以sudo
身份運行服務器/ Java程序,希望它可以訪問整個系統中的所有文件,但是令我驚訝的是,該用戶沒有對Pi的/home
目錄的讀取權限。
所以這是順序發生的事情:
我請求file.listFiles(new File("/"));
通過套接字從Pi發送到Android應用。 在應用程序中,在發出下一個請求之前,我檢查是否可以使用file.canRead();
讀取文件file.canRead();
對於/home
目錄,這將返回false。
Pi的文件權限:
pi@raspberrypi ~ $ ls -l / | grep home
drwxr-xr-x 3 root root 4096 Dec 31 1969 home
我如何運行Java服務器:
pi@raspberrypi ~ $ sudo java -cp "/usr/local/lib/bluecovelib/bluecove/target/bluecove-2.1.1-SNAPSHOT.jar:/usr/local/lib/bluecovelib/bluecove-gpl-2.1.1-SNAPSHOT/target/bluecove-gpl-2.1.1-SNAPSHOT.jar:/home/pi/severinteractionutils.jar:." AppConnect
為什么sudo
用戶無法從Java程序訪問/home
目錄?
編輯:
我在Pi上運行了一個簡單的程序,以測試是否是因為底層操作系統已更改。 顯然它確實有作用。
public class TestFileBrowser {
public static void main(String[] args) {
System.out.println("Hello, World");
File file = new File("/");
File [] files = file.listFiles();
for(int i=0; i<files.length; ++i) {
if(files[i].getAbsolutePath().equals("/home")) {
File homeDir = files[i];
if(homeDir.canRead()) {
System.out.println("Can Read");
if (homeDir.isDirectory()) {
System.out.println("Is directory");
}
}
}
}
}
}
這是控制台快照:
pi@raspberrypi ~ $ sudo javac TestFileBrowser.java
pi@raspberrypi ~ $ sudo java TestFileBrowser
Hello, World
Can Read
Is directory
對於/ home目錄,這將返回false。
正確,因為您無法使用典型的文件流IO從目錄讀取。 您可以調用File.isDirectory()
(根據Javadoc)
測試此抽象路徑名表示的文件是否為目錄。
如果需要將I / O異常與文件不是目錄的情況區分開,或者同時需要同一文件的多個屬性,則可以使用
Files.readAttributes
方法。
並且您可以檢查讀取屬性的權限。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.