您好,登錄后才能下訂單哦!
這篇文章主要講解了“Java節(jié)點流與字符流分別有什么用”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“Java節(jié)點流與字符流分別有什么用”吧!
file是文件和目錄路徑名的抽象表示
用法:
File file = new File("路徑名"); //如 File file = new File("L:\\FileTestDemo\\AAA\\aaa.txt");
注意:在windows中,路徑名不能使用單個的\
,單個的\
為轉(zhuǎn)義字符,可以使用\\
,//
或/
1.boolean createNewFile()
當(dāng)且僅當(dāng)具有此名稱的文件尚不存在時,以原子方式創(chuàng)建由此抽象路徑名命名的新空文件。 注意: 不能創(chuàng)建文件夾,只能創(chuàng)建文件
System.out.println(file.createNewFile()); //true or false表示是否創(chuàng)建成功
2.boolean delete()
刪除此抽象路徑名表示的文件或目錄。
System.out.println(file.delete());
3.boolean exists()
測試此抽象路徑名表示的文件或目錄是否存在。
if(!file.exists()){ System.out.println("文件不存在,創(chuàng)建"+ file.createNewFile()); }
4.String getName()
返回此抽象路徑名表示的文件或目錄的名稱。
System.out.println(file.getName());
5.long lastModified()
返回上次修改此抽象路徑名表示的文件的時間。
System.out.println(new SimpleDateFormat().format(new Date(file.lastModified())));
File 類:
只能操作文件外部的內(nèi)容,無法操作文件內(nèi)部內(nèi)容的讀寫
流:
數(shù)據(jù)以先入先出的順序進行傳輸,流就是管道,就是用來 傳輸數(shù)據(jù)的
IO 流:
java提供了一個io包,提供了很多類,提供了很多功能能夠?qū)崿F(xiàn)數(shù)據(jù)的讀寫
數(shù)據(jù)源就像水箱,流就像水管中流著的水流,程序就是我們最終的用戶。 流是一個抽象、動態(tài)的概念, 是一連串連續(xù)動態(tài)的數(shù)據(jù)集合
按流向可分為輸入流(InputStream和Reader)和輸出流(OutputStream和Writer)
按操作單元可分為字節(jié)流(InputStream 和 OutputStream)和字符流(Reader 和 Writer)
按功能可分為節(jié)點流(可以直接從數(shù)據(jù)源或目的地讀寫數(shù)據(jù))和功能流(是處理流的流。通過對其他流的處理提高程序的性能)
在進行任何操作之前,首先要明確目的(讀還是寫),找準(zhǔn)源頭(讀取),找準(zhǔn)目的地(寫出)
1.建立聯(lián)系 :這一步驟是為了獲取流,如果此時是文件,則需要將文件抽象到內(nèi)存形成對象。后期也 可以是其他的數(shù)據(jù)源
2.選擇流:從讀寫、數(shù)據(jù)單元和功能方面考慮。輸入|輸出,字節(jié)|字符,結(jié)點流|處理流。
3.執(zhí)行操作:該讀就讀,該寫就寫??紤]是一次性完成還行需要循環(huán)。
4.釋放資源:程序中打開的文件 IO 資源不屬于內(nèi)存中的資源,垃圾回收無法回收,需要顯示關(guān)閉。
int read() -> 返回值是這一次讀取到的內(nèi)容(一個字節(jié)的值, 一個字符的值)
int read(byte[] car) -> 將讀取到的字節(jié)臨時存儲到car數(shù)組中, 返回實際讀取到的字節(jié)數(shù)量
int reade(char[] car) -> 將讀取到的字符臨時存儲到car數(shù)組中, 返回實際讀取到的字符數(shù)量
無論以何種方式 read(), read([]) 讀取文件, -1,就意味著讀取到文件末尾
字符 -> 只能操作文本,直接讀取到的就是字符
字節(jié) -> 任意數(shù)據(jù), 但是如果操作是字符的話,還需要我們轉(zhuǎn)換(麻煩)
單個字節(jié)讀取
以InputStream為例,Reader同理
public class IOTest { public static void main(String[] args) throws IOException { //選擇流,建立聯(lián)系 InputStream is = new FileInputStream("L:\\FileTestDemo\\123.txt"); //無論以何種方式 read(), read([]) 讀取文件, -1,就意味著讀取到文件末尾 //則當(dāng)result的值為-1時結(jié)束 int result = -1; while((result = is.read()) != -1){ System.out.println((char)result); } //關(guān)閉 is.close(); } }
多個字節(jié)讀取
public class IOTest { public static void main(String[] args) throws IOException { //選擇流,建立聯(lián)系 InputStream is = new FileInputStream("L:\\FileTestDemo\\123.txt"); //定義運輸數(shù)組 byte[] car = new byte[1024]; int len = -1; //當(dāng)result的值為-1時結(jié)束 while ((len = is.read(car)) != -1){ System.out.println(new String(car,0,len)); } //關(guān)閉 is.close(); } }
以O(shè)utputStream為例,Writer同理
注意:在關(guān)閉(close)輸出流前需要先清空(flush)緩存區(qū)的數(shù)據(jù)
flush()一般主要用在IO中,即清空緩沖區(qū)數(shù)據(jù),就是說你用讀寫流的時候,其實數(shù)據(jù)是先被讀到了內(nèi)存中,然后用數(shù)據(jù)寫到文件中,當(dāng)你數(shù)據(jù)讀完的時候不代表你的數(shù)據(jù)已經(jīng)寫完了,因為還有一部分有可能會留在內(nèi)存這個緩沖區(qū)中。這時候如果你調(diào)用了 close()方法關(guān)閉了讀寫流,那么這部分數(shù)據(jù)就會丟失,所以應(yīng)該在關(guān)閉讀寫流之前先flush(),先清空數(shù)據(jù)。
單字節(jié)寫入
public class OutputStream01 { public static void main(String[] args) throws IOException { 選擇流,建立聯(lián)系 OutputStream os = new FileOutputStream("L:\\FileTestDemo\\abc.txt",true); //寫入數(shù)據(jù) os.write('a'); //刷出流 os.flush(); //關(guān)閉 os.close(); } }
多字節(jié)輸入
public class OutputStream02 { public static void main(String[] args) throws IOException { //構(gòu)建輸出流 OutputStream os = new FileOutputStream("L:\\FileTestDemo\\abc.txt"); //需要寫入的數(shù)據(jù) String str = "我好菜啊\n" + "就這?\n" + "\t\t\t不是吧,阿sir"; //轉(zhuǎn)為字節(jié)數(shù)據(jù)存入數(shù)組 byte[] arr = str.getBytes(); //寫入數(shù)據(jù) os.write(arr); //刷出數(shù)據(jù) os.flush(); //關(guān)閉 os.close(); } }
以InputStream和OutputStream為例
public class In_Out { public static void main(String[] args){ //提升作用域范圍 InputStream is = null; OutputStream os = null; try { //創(chuàng)建輸入流 is = new FileInputStream("L:\\FileTestDemo\\aaa.txt"); os = new FileOutputStream("L:\\FileTestDemo\\abc\\bbb.txt"); //創(chuàng)建輸入數(shù)組 byte[] arr = new byte[1024]; int len = -1; while ((len = is.read(arr)) != -1){ //write(byte[] b, int off, int len) 將從偏移量 off開始的指定字節(jié)數(shù)組中的 len字節(jié)寫入此輸出流 os.write(arr,0,len); } //刷出 os.flush(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); }finally { //后打開,先關(guān)閉 //先關(guān)閉輸出流 if(os != null){ try { os.close(); } catch (IOException e) { e.printStackTrace(); } } //再關(guān)閉輸入流 if(is != null){ try { is.close(); } catch (IOException e) { e.printStackTrace(); } } } } }
在使用IO流的時候會出現(xiàn)編譯時異常,可以使用拋出異常或抓取異常來處理
拋出異常
public class IOTest { public static void main(String[] args) throws IOException { //建立聯(lián)系可能會遇到找不到文件位置(FileNotFoundException)異常 //這時候可以拋出(throw)異常 InputStream is = new FileInputStream("L:\\FileTestDemo\\123.txt"); } }
抓取異常
public class IOTest { public static void main(String[] args){ //通過try...carch...來抓取異常 try { InputStream is = new FileInputStream("L:\\FileTestDemo\\123.txt"); } catch (FileNotFoundException e) { e.printStackTrace(); } } }
字節(jié)流和字符流的區(qū)別:
1.每次讀寫的字節(jié)數(shù)不同;
2.字符流是塊讀寫,字節(jié)流是字節(jié)讀寫;
3.字符流帶有緩存,字節(jié)流沒有。
java流在處理上分為字符流和字節(jié)流。字符流處理的單元為2個字節(jié)的Unicode字符,分別操作字符、字符數(shù)組或字符串,而字節(jié)流處理單元為1個字節(jié),操作字節(jié)和字節(jié)數(shù)組。
字符流和字節(jié)流,一個屬性范圍小,一個屬性范圍大,字符流只能是字符這一種類型,但是字節(jié)流中可以是字符,可以是二進制文件,可以是音頻,可以是各種各樣的類型,只要符合字節(jié)形式存儲的都可以接字節(jié)流,而字符流只能接字符。
感謝各位的閱讀,以上就是“Java節(jié)點流與字符流分別有什么用”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對Java節(jié)點流與字符流分別有什么用這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關(guān)知識點的文章,歡迎關(guān)注!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。