我是一個(gè)CPU:這個(gè)世界慢!死!了! ,可以感受到CPU,內(nèi)存和硬盤之間的速度比較。
文件的本質(zhì)
OS(操作系統(tǒng))的目的就是可以讓上層程序可以通過(guò)一種統(tǒng)一的方式去拿到無(wú)論什么磁盤里的文件(即一段字節(jié)流)。
一切文件的本質(zhì):
- 一段字節(jié)流
- 文本文件(txt,代碼,html等)
- 二進(jìn)制文件
- 每個(gè)程序負(fù)責(zé)解釋文件中的字節(jié)流
即文件本身就是一段字節(jié)流,不管是圖片、音頻還是文本等等,文件的展示形式取決于用什么軟件打開(kāi),例如播放器可以解析mp3文件等,但是本質(zhì)上這個(gè)文件就是一段字節(jié)流。
文件和IO
程序和文件之間的雙向流讀取和輸出,和網(wǎng)絡(luò)連接時(shí),從機(jī)器到遠(yuǎn)程主機(jī)上的雙向的讀取輸出流十分相似,所以Java針對(duì)這種流抽象出了InputStream和OutputStream。
InputStream/OutputStream
- 抽象的輸入/輸出流,無(wú)論是:
- 從文件中讀取字節(jié)流
- 從網(wǎng)絡(luò)中讀取字節(jié)流
- 從任何地方讀取字節(jié)流
輸入和輸出都是以程序?yàn)榛鶞?zhǔn)來(lái)判定的
對(duì)于文件讀取,永遠(yuǎn)建議使用絕對(duì)路徑。
Java中的File類
- File并不代表一個(gè)“文件”,它只代表一個(gè)“路徑”
- 抽象的“文件”路徑: 可以指文件也可以指文件夾
- File的常見(jiàn)方法
isFile()isDirectory()exists()getAbsolutePath()等等 - 絕對(duì)路徑和相對(duì)路徑
相對(duì)路徑相對(duì)的是JVM當(dāng)前的工作目錄,永遠(yuǎn)建議使用絕對(duì)路徑。 - 讀寫文件
NIO
- NIO是Java7之后引入的,解釋為:1.new IO 2.Non-blocking IO非阻塞的IO
- NIO中的Path其實(shí)就是舊版的File,可以通過(guò)toFile方法進(jìn)行轉(zhuǎn)換
- NIO的Files工具類,提供了walkFileTree等方法
NIO解決的問(wèn)題是,對(duì)于舊版的流式讀取,因?yàn)槠涫峭ㄟ^(guò)字節(jié)流的形式傳輸?shù)?,一個(gè)字節(jié)一個(gè)字節(jié)的進(jìn)行讀寫,沒(méi)法插隊(duì)等等,速度較慢。NIO改為了按塊讀寫,中間塊和塊是也是沒(méi)有順序的,是比舊版IO快的。
IO太慢的解決方法
使用BufferedReader/BufferedWriter