小师妹学JavaIO之:File文件系统
文章目錄
- 簡介
- 文件權限和文件系統
- 文件的創建
- 代碼中文件的權限
- 總結
簡介
小師妹又遇到難題了,這次的問題是有關文件的創建,文件權限和文件系統相關的問題,還好這些問題的答案都在我的腦子里面,一起來看看吧。
文件權限和文件系統
早上剛到公司,小師妹就湊過來神神秘秘的問我:F師兄,我在服務器上面放了一些重要的文件,是非常非常重要的那種,有沒有什么辦法給它加個保護,還兼顧一點隱私?
更多內容請訪問www.flydean.com
什么文件這么重要呀?不會是你的照片吧,放心沒人會感興趣的。
小師妹說:當然不是,我要把我的學習心得放上去,但是F師兄你知道的,我剛剛開始學習,很多想法都不太成熟,想先保個密,后面再公開。
看到小師妹這么有上進心,我老淚縱橫,心里很是安慰。那就開始吧。
你知道,這個世界上操作系統分為兩類,windows和linux(unix)系統。兩個系統是有很大區別的,但兩個系統都有一個文件的概念,當然linux中文件的范圍更加廣泛,幾乎所有的資源都可以看做是文件。
有文件就有對應的文件系統,這些文件系統是由系統內核支持的,并不需要我們在java程序中重復造輪子,直接調用系統的內核接口就可以了。
小師妹:F師兄,這個我懂,我們不重復造輪子,我們只是輪子的搬運工。那么java是怎么調用系統內核來創建文件的呢?
創建文件最常用的方法就是調用File類中的createNewFile方法,我們看下這個方法的實現:
public boolean createNewFile() throws IOException {SecurityManager security = System.getSecurityManager();if (security != null) security.checkWrite(path);if (isInvalid()) {throw new IOException("Invalid file path");}return fs.createFileExclusively(path);}方法內部先進行了安全性檢測,如果通過了安全性檢測就會調用FileSystem的createFileExclusively方法來創建文件。
在我的mac環境中,FileSystem的實現類是UnixFileSystem:
public native boolean createFileExclusively(String path)throws IOException;看到了嗎?UnixFileSystem中的createFileExclusively是一個native方法,它會去調用底層的系統接口。
小師妹:哇,文件創建好了,我們就可以給文件賦權限了,但是windows和linux的權限是一樣的嗎?
這個問題問得好,java代碼是跨平臺的,我們的代碼需要同時在windows和linux上的JVM執行,所以必須找到他們權限的共同點。
我們先看一下windows文件的權限:
可以看到一個windows文件的權限可以有修改,讀取和執行三種,特殊權限我們先不用考慮,因為我們需要找到windows和linux的共同點。
再看下linux文件的權限:
ls -al www.flydean.com -rw-r--r-- 1 flydean staff 15 May 14 15:43 www.flydean.com上面我使用了一個ll命令列出了www.flydean.com這個文件的詳細信息。 其中第一列就是文件的權限了。
linux的基本文件權限可以分為三部分,分別是owner,group,others,每部分和windows一樣都有讀,寫和執行的權限,分別用rwx來表示。
三部分的權限連起來就成了rwxrwxrwx,對比上面我們的輸出結果,我們可以看到www.flydean.com這個文件對owner自己是可讀寫的,對Group用戶是只讀的,對other用戶也是只讀的。
你要想把文件只對自己可讀,那么可以執行下面的命令:
chmod 600 www.flydean.com小師妹立馬激動起來:F師兄,這個我懂,6用二進制表示就是110,600用二進制表示就是110000000,剛剛好對應rw-------。
對于小師妹的領悟能力,我感到非常滿意。
文件的創建
雖然我們已經不是孔乙己時代了,不需要知道茴字的四種寫法,但是多一條知識多一條路,做些充足的準備還是非常有必要的。
小師妹,那你知道在java中有哪幾種文件的創建方法呢?
小師妹小聲道:F師兄,我只知道一種new File的方法。
我滿意的撫摸著我的胡子,顯示一下自己高人的氣場。
之前我們講過了,IO有三大類,一種是Reader/Writer,一種是InputStream/OutputStream,最后一種是ObjectReader/ObjectWriter。
除了使用第一種new File之外,我們還可以使用OutputStream來實現,當然我們還要用到之前講到try with resource特性,讓代碼更加簡潔。
先看第一種方式:
public void createFileWithFile() throws IOException {File file = new File("file/src/main/resources/www.flydean.com");//Create the fileif (file.createNewFile()){log.info("恭喜,文件創建成功");}else{log.info("不好意思,文件創建失敗");}//Write Contenttry(FileWriter writer = new FileWriter(file)){writer.write("www.flydean.com");}}再看第二種方式:
public void createFileWithStream() throws IOException{String data = "www.flydean.com";try(FileOutputStream out = new FileOutputStream("file/src/main/resources/www.flydean.com")){out.write(data.getBytes());}}第二種方式看起來比第一種方式更加簡介。
小師妹:慢著,F師兄,JDK7中NIO就已經出現了,能不能使用NIO來創建文件呢?
這個問題當然難不到我:
public void createFileWithNIO() throws IOException{String data = "www.flydean.com";Files.write(Paths.get("file/src/main/resources/www.flydean.com"), data.getBytes());List<String> lines = Arrays.asList("程序那些事", "www.flydean.com");Files.write(Paths.get("file/src/main/resources/www.flydean.com"),lines,StandardCharsets.UTF_8,StandardOpenOption.CREATE,StandardOpenOption.APPEND);}NIO中提供了Files工具類來實現對文件的寫操作,寫的時候我們還可以帶點參數,比如字符編碼,是替換文件還是在append到文件后面等等。
代碼中文件的權限
小師妹又有問題了:F師兄,講了半天,還沒有給我講權限的事情啦。
別急,現在就講權限:
public void fileWithPromission() throws IOException {File file = File.createTempFile("file/src/main/resources/www.flydean.com","");log.info("{}",file.exists());file.setExecutable(true);file.setReadable(true,true);file.setWritable(true);log.info("{}",file.canExecute());log.info("{}",file.canRead());log.info("{}",file.canWrite());Path path = Files.createTempFile("file/src/main/resources/www.flydean.com", "");log.info("{}",Files.exists(path));log.info("{}",Files.isReadable(path));log.info("{}",Files.isWritable(path));log.info("{}",Files.isExecutable(path));}上面我們講過了,JVM為了通用,只能取windows和linux都有的功能,那就是說權限只有讀寫和執行權限,因為windows里面也可以區分本用戶或者其他用戶,所以是否是本用戶的權限也保留了。
上面的例子我們使用了傳統的File和NIO中的Files來更新文件的權限。
總結
好了,文件的權限就先講到這里了。
本文的例子https://github.com/ddean2009/learn-java-io-nio
更多精彩內容且看:
- 區塊鏈從入門到放棄系列教程-涵蓋密碼學,超級賬本,以太坊,Libra,比特幣等持續更新
- Spring Boot 2.X系列教程:七天從無到有掌握Spring Boot-持續更新
- Spring 5.X系列教程:滿足你對Spring5的一切想象-持續更新
- java程序員從小工到專家成神之路(2020版)-持續更新中,附詳細文章教程
本文作者:flydean程序那些事
本文鏈接:http://www.flydean.com/io-file/
本文來源:flydean的博客
歡迎關注我的公眾號:程序那些事,更多精彩等著您!
總結
以上是生活随笔為你收集整理的小师妹学JavaIO之:File文件系统的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JDK10的新特性:var泛型和多个接口
- 下一篇: JDK10的新特性:var和匿名类