摘要:上一篇寫(xiě)到了流,這篇文章著重談?wù)勢(shì)斎肓?,再下次再說(shuō)輸出流。一輸入流字節(jié)流和字符流的操作方式幾乎完全一樣,只是操作的數(shù)據(jù)單元不同而已。返回結(jié)果為時(shí)表明到了輸入流的結(jié)束點(diǎn)。
親愛(ài)的樂(lè)字節(jié)的小伙伴們,小樂(lè)又來(lái)分享Java技術(shù)文章了。上一篇寫(xiě)到了IO流,這篇文章著重 談?wù)勢(shì)斎肓?,再下次再說(shuō)輸出流。
一、 輸入流字節(jié)流和字符流的操作方式幾乎完全一樣,只是操作的數(shù)據(jù)單元不同而已 。字節(jié)流可
以操作所有文件,字符流僅操作純文本。
1、抽象類(lèi):InputStream 和 ReaderInputStream和Reader是所有輸入流的基類(lèi),它們是兩個(gè)抽象類(lèi),是所有輸入流的模版,其中定義的方法在所有輸入流中都可以使用。
在InputStream里包含如下三個(gè)方法:
在Reader中包含如下三個(gè)方法:
對(duì)比InputStream和Reader 所提供的方法,可以看出這兩個(gè)基類(lèi)的功能基本相似。返回結(jié)果為-1 時(shí)表明到了輸入流的結(jié)束點(diǎn)。 InputStream 和 Reade 都是抽象的,不能直接創(chuàng)建它們的實(shí)例,可以使用它們的子類(lèi)。
2、文件節(jié)點(diǎn)類(lèi): FileInputStream 和 FileReaderFileInputStream 和 FileReader,它們都是節(jié)點(diǎn)流,直接和指定文件關(guān)聯(lián)。 操作方式
基本一致。
1)、單個(gè)字節(jié)讀取
以FileInputStream為例:
public class SingleFileRead { public static void main(String[] args) { // 1、建立聯(lián)系 File對(duì)象 File file = new File("f:/IO/test.txt"); // 2、選擇流 InputStream in = null;// 提升作用域 try { in = new FileInputStream(file); // 3、操作 單個(gè)字節(jié)讀取 long fileLength = file.length(); // 接收實(shí)際讀取的字節(jié)數(shù) // 計(jì)數(shù)器 System.out.println(fileLength); long num = 0; // 循環(huán)讀取 while (num < fileLength) { char ch = (char) in.read(); System.out.println(ch); num++; } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); System.out.println("文件不存在,不能進(jìn)行下一步操作"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); System.out.println("讀取文件失敗"); } finally { try { // 4、釋放資料 if (in != null) { in.close(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); System.out.println("關(guān)閉文件輸入流失敗"); } } } }
2)、批量讀取(字節(jié)|字符重點(diǎn))
public class ReadFile { public static void main(String[] args) { //1、字節(jié)讀?。航⒙?lián)系 File對(duì)象 File file=new File("f:/IO/test.txt"); //2、選擇流 InputStream in=null;//提升作用域 try { in=new FileInputStream(file); //3、操作 不斷讀取 緩沖數(shù)組 byte[]car=new byte[1024]; int len=0; //接收實(shí)際讀取的大小 //循環(huán)讀取 while(-1!=(len=in.read(car))){ //輸出,字節(jié)數(shù)組轉(zhuǎn)成字符串 String info=new String(car,0,len); System.out.println(info); } } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); System.out.println("文件不存在"); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); System.out.println("讀取文件失敗"); }finally{ try { //4、釋放資料 if(in!=null){ in.close(); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); System.out.println("關(guān)閉文件輸入流失敗"); } } } } //字符讀取1、創(chuàng)建源 File src=new File("f:/char.txt"); //2、選擇流 Reader reader=new FileReader(src); //3、讀取操作 char[] flush=new char[1024]; int len=0; while(-1!=(len=reader.read(flush))){ //字符數(shù)組轉(zhuǎn)換為字符串 String str=new String(flush,0,len); System.out.println(str); } //4、釋放資源 reader.close(); 樂(lè)字節(jié)原創(chuàng)3、緩沖處理類(lèi):BufferedInputStream和 BufferedReader(重點(diǎn))
緩沖提高性能: 字節(jié)流直接套上即可;字符緩沖流 +新增方法(不能使用多態(tài))
//1、創(chuàng)建源,建立聯(lián)系 File src =new File("test.txt"); //2、選擇緩沖流 InputStream is =new BufferedInputStream(new FileInputStream(src)); //3、操作 : 多個(gè)讀取 byte[] car =new byte[2]; int len =0; while(-1!=(len=is.read(car))){ //獲取數(shù)組的內(nèi)容 字節(jié)數(shù)組轉(zhuǎn)字符串 new String(字節(jié)數(shù)組,0,length) System.out.println(new String(car,0,len)); } //4、釋放資源 is.close(); //創(chuàng)建源: File src =new File("test.txt"); //使用字符緩沖流 提高性能讀取文件 +新增方法(不能使用多態(tài)) BufferedReader br =new BufferedReader(new FileReader(src)); //操作 行讀取 String line=null; while(null!=(line=br.readLine())){ System.out.println(line); } //釋放資源 br.close();4、轉(zhuǎn)換處理流: InputStreamReader
轉(zhuǎn)換流:將字節(jié)流轉(zhuǎn)為字符流 處理亂碼(編碼集、解碼集)。
//讀取文件 File src =new File("test.txt"); //轉(zhuǎn)換流 BufferedReader br =new BufferedReader( new InputStreamReader( new BufferedInputStream( new FileInputStream( src ) ),"utf-8" ) ); //行讀取 String msg =null; while(null!=(msg =br.readLine())){ System.out.println(msg); } br.close();5、字節(jié)數(shù)組節(jié)點(diǎn)類(lèi): ByteArrayInputStream
操作的節(jié)點(diǎn)為字節(jié)數(shù)組,數(shù)組在jvm 內(nèi)存中,由垃圾回收機(jī)制管理,不需要手動(dòng)關(guān)閉
//1、創(chuàng)建源 byte[] src ="io 學(xué)習(xí)入門(mén)".getBytes(); //2、選擇流 InputStream is = new ByteArrayInputStream(src); //3、操作 與文件一致 byte[] flush =new byte[10]; int len =0; while(-1!=(len =is.read(flush))){ System.out.println(new String(flush,0,len)); } //4、釋放 is.close();6、數(shù)據(jù)處理流:DataInputStream
可以處理基本類(lèi)型+String,保留數(shù)據(jù)的類(lèi)型。前提是讀取順序與寫(xiě)出順序一致,否則讀取數(shù)據(jù)不正確
/** * 數(shù)據(jù)+類(lèi)型 輸出到文件 * @param destPath * @throws IOException */ public static void write(String destPath) throws IOException{ int point=2; long num=100L; String str="數(shù)據(jù)類(lèi)型"; //創(chuàng)建源 File dest=new File(destPath); //選擇流 DataOutputStream dos=new DataOutputStream(new BufferedOutputStream(new FileOutputStream(dest))); //操作 寫(xiě)出的順序 為讀取作準(zhǔn)備 dos.writeInt(point); dos.writeLong(num); dos.writeUTF(str); dos.flush(); //釋放資源 dos.close(); }7、對(duì)象處理流(反序列化):ObjectInputStream
/** * 反序列化: * 1、先寫(xiě)入再讀取 * 2、讀取對(duì)象需要知道具體類(lèi)型,依次讀取 * 注意: * 1)不是所有的對(duì)象都可以序列化 Serializable * 2)不是所有的屬性都需要序列化 transient */ public static void read(String srcPath) throws FileNotFoundException, IOException, ClassNotFoundException{ //創(chuàng)建源 File src=new File(srcPath); //選擇流 OjbectInputStream ObjectInputStream dis=new ObjectInputStream( new BufferedInputStream( new FileInputStream(src) ) ); //操作 讀取的順序與寫(xiě)出的順序一致 必須存在才能讀取 Object obj=dis.readObject(); if(obj instanceof Employee){ Employee emp=(Employee)obj; System.out.println(emp.getName()); System.out.println(emp.getSalary()); } obj=dis.readObject(); int[]arr=(int[])obj; System.out.println(Arrays.toString(arr)); //釋放資源 dis.close(); }
Java中的IO流-輸入流就介紹到這里了,下次再說(shuō)輸出流。
樂(lè)字節(jié)原創(chuàng),更多Java技術(shù)干貨持續(xù)更新,歡迎關(guān)注。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/75722.html
摘要:大家好,樂(lè)字節(jié)小樂(lè)又來(lái)了。上一篇給大家?guī)?lái)的是中的流之輸入流樂(lè)字節(jié),本文將繼續(xù)講述流之輸出流。一輸出流抽象類(lèi)和和也非常相似。從上述的字節(jié)數(shù)組中,讀取字符串。 大家好,樂(lè)字節(jié)小樂(lè)又來(lái)了。上一篇給大家?guī)?lái)的是:Java中的IO流之輸入流|樂(lè)字節(jié),本文將繼續(xù)講述IO流之輸出流。showImg(https://segmentfault.com/img/bVbvQx1?w=600&h=338);...
摘要:換句話說(shuō),套接字起到通信端點(diǎn)的作用。單個(gè)套接字是一個(gè)端點(diǎn),而一對(duì)套接字則構(gòu)成一個(gè)雙向通信信道,使非關(guān)聯(lián)進(jìn)程可以在本地或通過(guò)網(wǎng)絡(luò)進(jìn)行數(shù)據(jù)交換。 大家好,我是樂(lè)字節(jié)小樂(lè),上次給大家講述了Java中的IO流之輸出流|樂(lè)字節(jié),本文將會(huì)給大家講述網(wǎng)絡(luò)編程。 主要內(nèi)容如下: 網(wǎng)絡(luò) 網(wǎng)絡(luò)分層 列表項(xiàng)目 IP位置 端口port 網(wǎng)絡(luò)編程 showImg(https://segmentfault.c...
摘要:流分類(lèi)由此可見(jiàn),流很龐大從不同角度進(jìn)行分類(lèi)數(shù)據(jù)分類(lèi)按處理數(shù)據(jù)單位分為字節(jié)流和字符流。處理數(shù)據(jù)是音頻視頻文本等一切為字節(jié)流,僅能處理文本的為字符流。功能分類(lèi)節(jié)點(diǎn)流和處理流。從向一個(gè)特定的設(shè)備磁盤(pán)網(wǎng)絡(luò)等讀寫(xiě)數(shù)據(jù)的流稱(chēng)為節(jié)點(diǎn)流,也常被稱(chēng)為低級(jí)流。 嗨嘍,小樂(lè)又來(lái)了,今天要給大家送上的技術(shù)文章是Java重點(diǎn)知識(shí)-IO流。 先來(lái)看看IO流的思維導(dǎo)圖吧。showImg(https://segmen...
摘要:但它融合了和的功能。支持對(duì)隨機(jī)訪問(wèn)文件的讀取和寫(xiě)入。的概述和作為集合的使用了解的概述類(lèi)表示了一個(gè)持久的屬性集??杀4嬖诹髦谢驈牧髦屑虞d。屬性列表中每個(gè)鍵及其對(duì)應(yīng)值都是一個(gè)字符串。 1_序列流(了解) 1.什么是序列流 序列流可以把多個(gè)字節(jié)輸入流整合成一個(gè), 從序列流中讀取數(shù)據(jù)時(shí), 將從被整合的第一個(gè)流開(kāi)始讀, 讀完一個(gè)之后繼續(xù)讀第二個(gè), 以此類(lèi)推. 2.使用方式 整合兩個(gè): S...
摘要:需要注意的是很多流操作本身就會(huì)返回一個(gè)流,所以多個(gè)操作可以直接連接起來(lái),如下圖這樣,操作可以進(jìn)行鏈?zhǔn)秸{(diào)用,并且并行流還可以實(shí)現(xiàn)數(shù)據(jù)流并行處理操作。為集合創(chuàng)建并行流。 上一篇文章,小樂(lè)給大家介紹了《Java8新特性之方法引用》,下面接下來(lái)小樂(lè)將會(huì)給大家介紹Java8新特性之Stream,稱(chēng)之為流,本篇文章為上半部分。 1、什么是流? Java Se中對(duì)于流的操作有輸入輸出IO流,而Jav...
閱讀 1713·2021-11-22 13:53
閱讀 2991·2021-11-15 18:10
閱讀 2889·2021-09-23 11:21
閱讀 2594·2019-08-30 15:55
閱讀 567·2019-08-30 13:02
閱讀 852·2019-08-29 17:22
閱讀 1869·2019-08-29 13:56
閱讀 3535·2019-08-29 11:31