<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
IO流概述:
IO:輸入/輸出(Input/Output)
流:是一種抽象概念,是對資料傳輸的總稱。也就是說資料在裝置間的傳輸稱為流,流的本質是資料傳輸IO流就是用來處理裝置間資料傳輸問題的, 常見的應用:檔案複製;檔案上傳;檔案下載等等,總而言之,涉及到傳輸的,都涉及到流。
IO流體系圖:
既然IO是涉及檔案的操作,那麼一定離不開檔案操作的技術:
File 類是 java.io 包中唯一代表磁碟檔案本身的物件。File 類定義了一些方法來操作檔案,主要用來獲取或處理與磁碟檔案相關的資訊,像檔名、 檔案路徑、存取許可權和修改日期等,還可以瀏覽子目錄層次結構。
File 類表示處理檔案和檔案系統的相關資訊。File 類不具有從檔案讀取資訊和向檔案寫入資訊的功能,它僅描述檔案本身的屬性。所以和IO搭配在一起進行讀出和寫入的操作。
先看一張File類常用的方法總彙圖:
使用createNewFile()建立一個檔案:
public class test01 { public static void main(String[] args) throws IOException { //先建立一個File物件,並傳入路徑 File file1 = new File("G://abc.txt"); //建立空檔案,如果沒有存在則新建一個,並且返回True,如果存在了就返回false System.out.println(file1.createNewFile()); }
如果執行後,該目錄沒有這個檔案,那麼會建立一個,並且返回true,如果已經存在了,就會返回false,代表建立失敗。
使用mkdir()建立一個目錄:
File file2 = new File("G://a"); System.out.println(file2.mkdir()); //建立一個目錄,如果沒有存在則新建一個,並且返回True,如果存在了就返回false
使用mkdirs()建立多級目錄:
File file3 = new File("G://a//b//c"); System.out.println(file3.mkdirs()); //建立多級目錄,如果沒有存在則新建一個,並且返回True,如果存在了就返回false
接著我們需要使用IO流裡面的功能對檔案進行輸入和輸出:
先介紹四個常用的流:
為什麼會有位元組和字元兩種流呢?
ASCII 碼中,一個英文字母(不分大小寫)為一個位元組,一箇中文漢字為兩個位元組。
UTF-8 編碼中,一個英文字為一個位元組,一箇中文為三個位元組。
Unicode 編碼中,一個英文為一個位元組,一箇中文為兩個位元組。
所以我們知道計算機讀取資料是一個一個的讀取,當檔案裡面是數位或者英文的時候,因為都佔了一個位元組,所以可以正常讀取出來。
那麼如果是漢字呢?最少也佔了兩個位元組,如果把一個漢字拆分讀取,顯示出來肯定是有問題的。
小結:如果資料通過Window自帶的記事本軟體開啟,我們還可以讀懂裡面的內容,就使用字元流,否則使用位元組流。如果你不知道該使用哪種型別的流,就使用位元組流!
下面是四種流對應功能的方法名總彙表:
我們使用位元組輸出流給abc.txt檔案裡面寫一句話:
public class test01 { public static void main(String[] args) { try{ //建立輸出流物件: OutputStream fos = null; fos = new FileOutputStream("G://abc.txt"); String str = "今天的部落格是IO流"; //先將需要寫入的字元打散成陣列: byte[] words = str.getBytes(); //使用寫入的功能 fos.write(words); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } } }
執行後:
我們知道如果檔案內是漢字,使用位元組輸入流,那麼顯示的肯定是亂碼,如果現在檔案裡面是“我愛中國”這四個字,使用下面這段程式碼:
public class test02 { public static void main(String[] args) { //建立位元組輸入流物件: InputStream fis = null; try{ fis = new FileInputStream("G://abc.txt"); int data; //fis.read()取到每一個位元組通過Ascll碼錶轉換成0-255之間的整數,沒有值返回-1 while((data=fis.read())!=-1){ //(char) data 將讀到的位元組轉成對應的字元 //中文的字元是2+個位元組組成 System.out.print((char) data); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally { try{ fis.close(); } catch (IOException e) { e.printStackTrace(); } } } }
輸出的結果是:
然後把檔案內資訊換成英文和數位:
結論:有漢字的檔案讀取不能用位元組流
我們使用字元輸出流給abc.txt檔案裡面寫幾句話:
public class test03 { public static void main(String[] args) { try{ //使用字元輸出流的FileWriter寫入資料 Writer fw = new FileWriter("G://abc.txt"); fw.write("我們在學Java"); fw.write("一起加油"); fw.close(); //關閉資源 } catch (IOException e) { e.printStackTrace(); } } }
也沒用問題,我們發現,使用字元流寫中文漢字更方便。
可以設定快取流提高獲取值的效率:
public class test04 { public static void main(String[] args) throws IOException { //建立字元輸入流物件: Reader fr = null; try{ fr = new FileReader("G:/abc.txt"); //藉助字元流物件建立了字元快取區 把字元一個一個的取到後先放到快取區 //然後一起再讀寫到程式記憶體來,效率更高 BufferedReader br = new BufferedReader(fr); //先去快取區一行一行的讀取 String line = br.readLine(); while(line != null){ System.out.println(line); line = br.readLine(); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally { try { fr.close(); } catch (IOException e) { e.printStackTrace(); } } }
當檔案內的資訊為多行的時候:
位元組流和字元流總結:
IO流還有很多方法操作,比如複製檔案、緩衝流(增加緩衝功能,避免頻繁讀寫硬碟)、轉換流(實現位元組流和字元流之間的轉換)、資料流(提供將基礎資料型別寫入到檔案中,或者讀取出來)等等
本篇文章就到這裡了,希望能夠給你帶來幫助,也希望您能夠多多關注it145.com的更多內容!
相關文章
<em>Mac</em>Book项目 2009年学校开始实施<em>Mac</em>Book项目,所有师生配备一本<em>Mac</em>Book,并同步更新了校园无线网络。学校每周进行电脑技术更新,每月发送技术支持资料,极大改变了教学及学习方式。因此2011
2021-06-01 09:32:01
综合看Anker超能充系列的性价比很高,并且与不仅和iPhone12/苹果<em>Mac</em>Book很配,而且适合多设备充电需求的日常使用或差旅场景,不管是安卓还是Switch同样也能用得上它,希望这次分享能给准备购入充电器的小伙伴们有所
2021-06-01 09:31:42
除了L4WUDU与吴亦凡已经多次共事,成为了明面上的厂牌成员,吴亦凡还曾带领20XXCLUB全队参加2020年的一场音乐节,这也是20XXCLUB首次全员合照,王嗣尧Turbo、陈彦希Regi、<em>Mac</em> Ova Seas、林渝植等人全部出场。然而让
2021-06-01 09:31:34
目前应用IPFS的机构:1 谷歌<em>浏览器</em>支持IPFS分布式协议 2 万维网 (历史档案博物馆)数据库 3 火狐<em>浏览器</em>支持 IPFS分布式协议 4 EOS 等数字货币数据存储 5 美国国会图书馆,历史资料永久保存在 IPFS 6 加
2021-06-01 09:31:24
开拓者的车机是兼容苹果和<em>安卓</em>,虽然我不怎么用,但确实兼顾了我家人的很多需求:副驾的门板还配有解锁开关,有的时候老婆开车,下车的时候偶尔会忘记解锁,我在副驾驶可以自己开门:第二排设计很好,不仅配置了一个很大的
2021-06-01 09:30:48
不仅是<em>安卓</em>手机,苹果手机的降价力度也是前所未有了,iPhone12也“跳水价”了,发布价是6799元,如今已经跌至5308元,降价幅度超过1400元,最新定价确认了。iPhone12是苹果首款5G手机,同时也是全球首款5nm芯片的智能机,它
2021-06-01 09:30:45