請考慮以下代碼:import java.io.IOException;import java.nio.file.attribute.DosFileAttributeView;import java.nio.file.Files;import java.nio.file.Path;import java.nio.file.Paths;import java.nio.file.attribute.FileTime;import java.time.Instant;public class Word { public static void main(String[] args){ try{ Path path = Paths.get("readonly.txt"); Files.createFile(path); DosFileAttributeView dos = Files.getFileAttributeView(path,DosFileAttributeView.class); dos.setReadOnly(true); //Files.delete(path); Access denied exception dos.setHidden(true); //can change attributes all we want dos.setTimes(null,FileTime.from(Instant.now()),null); dos.setReadOnly(false); Files.delete(path); } catch(IOException e){ e.printStackTrace(); } }}當然,嘗試修改只讀文件將給我們一個訪問消除例外。但是,如代碼中所示,這不適用于文件的屬性,可以根據需要對其進行修改。當然,這意味著任何人都可以輕松地將只讀屬性更改回false并根據需要修改文件。那么,為什么這是允許的,有人會如何在Java中創建一個實際的只讀文件呢?
1 回答

慕妹3242003
TA貢獻1824條經驗 獲得超6個贊
Windows 文件的安全性由文件上的安全描述符控制。
當然,這意味著任何人都可以輕松地將只讀屬性更改回false并根據需要修改文件。
不是“任何人” - 只有那些擁有權限的人(見下文)才能這樣做。如果您創建了該文件,那么您可以做自己想做的事情也就不足為奇了。但一般來說,我希望其他用戶(不是管理員)默認情況下無法影響您的文件。
誰可以更改DOS屬性是通過安全描述符控制的 - 特別是通過授予FILE_WRITE_ATTRIBUTES訪問權限。當然,必須有人可以清除DOS只讀屬性,否則......一旦文件被標記為只讀,就沒有回頭路了。通常,如果您創建一個文件,您將完全控制它。
給定用戶或用戶組是否可以將數據寫入文件由訪問掩碼中的FILE_WRITE_ACCESS位(可能還有其他一些,但這是介紹性答案)控制。如果不向用戶授予寫入權限,則他們無法寫入。如果您真的想阻止某人寫入文件,請按照以下步驟操作。
DOS“只讀”屬性的存在是為了兼容,并且可能作為提示非常有用,表明您確實不想寫入此文件,但它不是安全限制。
這些都與Java無關,而是操作系統中文件系統的工作方式。您可以使用 Windows 資源管理器檢查文件上的安全設置。
添加回答
舉報
0/150
提交
取消