簡體   English   中英

File.canRead()返回false

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM