一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

PHP教程|ASP.NET教程|Java教程|ASP教程|編程技術|正則表達式|C/C++|IOS|C#|Swift|Android|VB|R語言|JavaScript|易語言|vb.net|

服務器之家 - 編程語言 - Java教程 - Java常用數據流全面大梳理

Java常用數據流全面大梳理

2022-01-26 12:45葉綠體不忘呼吸 Java教程

計算機程序中,獲取數據的方式有多種,比如:程序中直接給出、鍵盤輸入、從數據文件中讀取、從數據庫中讀取、通過網絡讀取等。為了更有效地進行數據的輸入/輸出操作,Java將各種數據源的數據,抽象為“數據流”,及strea

緩沖流

為了提高數據讀寫的速度,Java API提供了帶緩沖功能的流類,在使用這些流類時,會創建一個內部緩沖區數組,缺省使用8192個字節(8Kb)的緩沖區。

Java常用數據流全面大梳理

緩沖流要“套接”在相應的節點流之上,根據數據操作單位可以把緩沖流分為:
BufferedInputStreamBufferedOutputStream
BufferedReaderBufferedWriter

當讀取數據時,數據按塊讀入緩沖區,其后的讀操作則直接訪問緩沖區。當使用BufferedInputStream讀取字節文件時,BufferedInputStream會一次性從文件中讀取8192個(8Kb),存在緩沖區中,直到緩沖區裝滿了,才重新從文件中讀取下一個8192個字節數組。

向流中寫入字節時,不會直接寫到文件,先寫到緩沖區中直到緩沖區寫滿,
BufferedOutputStream才會把緩沖區中的數據一次性寫到文件里。使用方法
flush()可以強制將緩沖區的內容全部寫入輸出流。

關閉流的順序和打開流的順序相反。只要關閉最外層流即可,關閉最外層流也
會相應關閉內層節點流。

flush()方法的使用:手動將buffer中內容寫入文件。使用帶緩沖區的流對象的close()方法,不但會關閉流,還會在關閉流之前刷新緩沖區,相當于自動調用了flush()方法,關閉后不能再寫出。

Java常用數據流全面大梳理

以字節流BufferedInputStreamBufferedOutputStream示例具體操作:

import java.io.*;

/**
* @Author: Yeman
* @Date: 2021-09-25-22:36
* @Description:
*/
public class BufferedTest {
  public static void main(String[] args) {
      FileInputStream fis = null;
      FileOutputStream fos = null;
      BufferedInputStream bfi = null;
      BufferedOutputStream bfo = null;
      try {
          //1、實例化File對象,指定文件
          File inFile = new File("IO\\input.jpg");
          File outFile = new File("IO\\output.jpg");
          //2、創建節點流(文件流)對象
          fis = new FileInputStream(inFile);
          fos = new FileOutputStream(outFile);
          //3、創建處理節點流的緩沖流對象
          bfi = new BufferedInputStream(fis);
          bfo = new BufferedOutputStream(fos);
          //4、通過緩沖流進行讀寫操作
          byte[] bytes = new byte[1024];
          int length = bfi.read(bytes);
          while (length != -1){
              bfo.write(bytes,0,length);
              length = bfi.read(bytes);
          }
      } catch (IOException e) {
          e.printStackTrace();
      } finally {
          //5、關閉外層流,內存流便自動關閉
          try {
              if (bfi != null) bfi.close();
          } catch (IOException e) {
              e.printStackTrace();
          }
          try {
              if (bfo != null) bfo.close();
          } catch (IOException e) {
              e.printStackTrace();
          }
      }
  }
}

 

轉換流

轉換流提供了在字節流和字符流之間的轉換。

InputStreamReader:將InputStream轉換為Reader(字節轉為字符輸入)
OutputStreamWriter:將Writer轉換為OutputStream(字節轉為字符輸出)

字節流中的數據都是字符時,轉成字符流操作更高效。使用轉換流來處理文件亂碼問題,實現編碼和解碼的功能。

Java常用數據流全面大梳理

InputStreamReader:
實現將字節的輸入流按指定字符集轉換為字符的輸入流。需要和InputStream“套接”。
構造器:
public InputStreamReader(InputStream in)
public InputSreamReader(InputStream in,String charsetName)

Java常用數據流全面大梳理

OutputStreamWriter:
實現將字符的輸出流按指定字符集轉換為字節的輸出流。需要和OutputStream“套接”。
構造器:
public OutputStreamWriter(OutputStream out)
public OutputSreamWriter(OutputStream out,String charsetName)

import java.io.*;

/**
* @Author: Yeman
* @Date: 2021-09-26-20:13
* @Description:
*/
public class Test {
  public static void main(String[] args) {
      InputStreamReader isr = null;
      OutputStreamWriter osw = null;
      try {
          //1、指明輸入輸出文件
          File inFile = new File("IO\\hi.txt");
          File outFile = new File("IO\\hello.txt");
          //2、提供字節節點流
          FileInputStream fis = new FileInputStream(inFile);
          FileOutputStream fos = new FileOutputStream(outFile);
          //3、提供轉換流
          isr = new InputStreamReader(fis,"gbk");
          osw = new OutputStreamWriter(fos,"utf-8");
          //4、讀寫操作
          char[] chars = new char[10];
          int len = isr.read(chars);
          while (len != -1){
              osw.write(chars,0,len);
              len = isr.read(chars);
          }
      } catch (IOException e) {
          e.printStackTrace();
      } finally {
          //5、關閉外層流
          try {
              if (osw != null) osw.close();
          } catch (IOException e) {
              e.printStackTrace();
          }
          try {
              if (isr != null) isr.close();
          } catch (IOException e) {
              e.printStackTrace();
          }
      }
  }
}

 

標準輸入輸出流

System.inSystem.out分別代表了系統標準的輸入和輸出設備
默認輸入設備是:鍵盤,輸出設備是:顯示器(控制臺)

System.in的類型是InputStream
System.out的類型是PrintStream,其是OutputStream的子類

重定向:通過System類的setIn()setOut()方法對默認設備進行改變:
public static void setIn(InputStream in)
public static void setOut(PrintStream out)

Java常用數據流全面大梳理

import java.io.*;

/**
* @Author: Yeman
* @Date: 2021-09-26-20:13
* @Description:
*/
public class Test {
  public static void main(String[] args) {
      BufferedReader bis = null;
      try {
          //1、提供轉換流(System.in是字節流,將其轉換為字符流)
          System.out.println("請輸入信息(退出輸入e或exit):");
          InputStreamReader isr = new InputStreamReader(System.in);
          //2、提供緩沖流將輸入的一行讀取
          bis = new BufferedReader(isr);
          //3、讀操作
          String s = null;
          while ((s = bis.readLine()) != null){
              if ("e".equalsIgnoreCase(s) || "exit".equalsIgnoreCase(s)){
                  System.out.println("程序結束,退出程序!");
                  break;
              }
              System.out.println("==" + s.toUpperCase());
              System.out.println("繼續輸入(退出輸入e或exit):");
          }
      } catch (IOException e) {
          e.printStackTrace();
      } finally {
          //4、關閉外層流
          try {
              if (bis != null) bis.close();
          } catch (IOException e) {
              e.printStackTrace();
          }
      }
  }
}

 

打印流

實現將基本數據類型的數據格式轉化為字符串輸出。

打印流:PrintStreamPrintWriter
提供了一系列重載的print()println()方法,用于多種數據類型的輸出:
PrintStream和PrintWriter的輸出不會拋出IOException異常,
PrintStream和PrintWriter有自動flush功能,
PrintStream打印的所有字符都使用平臺的默認字符編碼轉換為字節
在需要寫入字符而不是寫入字節的情況下,應該使用PrintWriter類。

System.out返回的是PrintStream的實例。

常與System.out搭配使用,可以不在控制臺輸出,而是輸出到指定位置:

import java.io.*;

/**
* @Author: Yeman
* @Date: 2021-09-26-20:13
* @Description:
*/
public class Test {
  public static void main(String[] args) {
      PrintStream ps = null;
      try {
          FileOutputStream fos = new FileOutputStream(new File("IO\\text.txt"));
// 創建打印輸出流,設置為自動刷新模式(寫入換行符或字節 '\n' 時都會刷新輸出緩沖區)
          ps = new PrintStream(fos, true);
          if (ps != null) {// 把標準輸出流(控制臺輸出)改成文件
              System.setOut(ps);
          }
          for (int i = 0; i <= 255; i++) { // 輸出ASCII字符
              System.out.print((char) i);
              if (i % 50 == 0) { // 每50個數據一行
                  System.out.println(); // 換行
              }
          }
      } catch (FileNotFoundException e) {
          e.printStackTrace();
      } finally {
          if (ps != null) {
              ps.close();
          }
      }

  }
}

 

數據流

為了方便地操作Java語言的基本數據類型和String的數據,可以使用數據流。

數據流有兩個類:(用于讀取和寫出基本數據類型、String類的數據)
DataInputStreamDataOutputStream
分別“套接”在 InputStream 和 OutputStream 子類的流上。

Java常用數據流全面大梳理

import java.io.*;

/**
* @Author: Yeman
* @Date: 2021-09-26-20:13
* @Description:
*/
public class Test {
  public static void main(String[] args) {

      //寫
      DataOutputStream dos = null;
      try {
          dos = new DataOutputStream(new FileOutputStream("IO\\test.txt"));
          dos.writeUTF("葉綠體");
          dos.writeInt(22);
          dos.writeBoolean(true);
      } catch (IOException e) {
          e.printStackTrace();
      } finally {
          try {
              if (dos != null) dos.close();
          } catch (IOException e) {
              e.printStackTrace();
          }
      }

      //讀
      DataInputStream dis = null;
      try {
          dis = new DataInputStream(new FileInputStream("IO\\test.txt"));
          //注意讀的順序要和寫的順序一樣
          String name = dis.readUTF();
          int age = dis.readInt();
          boolean isMan = dis.readBoolean();
          System.out.println(name + age + isMan);
      } catch (IOException e) {
          e.printStackTrace();
      } finally {
          try {
              if (dis != null) dis.close();
          } catch (IOException e) {
              e.printStackTrace();
          }
      }
  }
}

 

對象流

ObjectInputStreamOjbectOutputSteam

用于存儲和讀取基本數據類型數據或對象的處理流。它的強大之處就是可以把Java中的對象寫入到數據源中,也能把對象從數據源中還原回來。

序列化:用ObjectOutputStream類保存基本類型數據或對象的機制
反序列化:用ObjectInputStream類讀取基本類型數據或對象的機制

ObjectOutputStreamObjectInputStream不能序列化statictransient修飾的成員變量。

實現Serializable或者Externalizable兩個接口之一的類的對象才可序列化,關于對象序列化詳見:

可序列化對象:

import java.io.Serializable;

/**
* @Author: Yeman
* @Date: 2021-09-27-8:27
* @Description:
*/

class pet implements Serializable {
  public static final long serialVersionUID = 999794470754667999L;
  private String name;

  public pet(String name) {
      this.name = name;
  }

  @Override
  public String toString() {
      return "pet{" +
              "name='" + name + '\'' +
              '}';
  }
}

public class Person implements Serializable {
  public static final long serialVersionUID = 6849794470754667999L;
  private String name;
  private int age;
  private pet pet;

  public Person(String name, int age, pet pet) {
      this.name = name;
      this.age = age;
      this.pet = pet;
  }

  @Override
  public String toString() {
      return "Person{" +
              "name='" + name + '\'' +
              ", age=" + age +
              ", pet=" + pet +
              '}';
  }
}

序列化(ObjectOutputStream):

import java.io.*;

/**
* @Author: Yeman
* @Date: 2021-09-26-20:13
* @Description:
*/
public class Test {
  public static void main(String[] args) {
      ObjectOutputStream oos = null;
      try {
          oos = new ObjectOutputStream(new FileOutputStream("IO\\test.txt"));
          oos.writeUTF(new String("你好世界!"));
          oos.flush();
          oos.writeObject(new Person("Lily",20,new pet("Xinxin")));
          oos.flush();
      } catch (IOException e) {
          e.printStackTrace();
      } finally {
          try {
              if (oos != null) oos.close();
          } catch (IOException e) {
              e.printStackTrace();
          }
      }
  }
}

反序列化(ObjectInputStream):

import java.io.*;

/**
* @Author: Yeman
* @Date: 2021-09-26-20:13
* @Description:
*/
public class Test {
  public static void main(String[] args) {
      ObjectInputStream ois = null;
      try {
          ois = new ObjectInputStream(new FileInputStream("IO\\test.txt"));
          String s = ois.readUTF();
          Person o = (Person) ois.readObject();
          System.out.println(o.toString());
      } catch (IOException e) {
          e.printStackTrace();
      } catch (ClassNotFoundException e) {
          e.printStackTrace();
      } finally {
          if (ois != null) {
              try {
                  ois.close();
              } catch (IOException e) {
                  e.printStackTrace();
              }
          }
      }
  }
}

 

隨機存取文件流

RandomAccessFile聲明在java.io包下,但直接繼承于java.lang.Object類。并且它實現了DataInputDataOutput這兩個接口,也就意味著這個類既可以讀也可以寫。

RandomAccessFile類支持 “隨機訪問” 的方式,程序可以直接跳到文件的任意地方來讀寫文件:①支持只訪問文件的部分內容②可以向已存在的文件后追加內容③若文件不存在,則創建④若文件存在,則從指針位置開始覆蓋內容,而不是覆蓋文件。

RandomAccessFile對象包含一個記錄指針,用以標示當前讀寫處的位置,RandomAccessFile類對象可以自由移動記錄指針:
long getFilePointer():獲取文件記錄指針的當前位置
void seek(long pos):將文件記錄指針定位到 pos 位置

構造器:

public RandomAccessFile(File file, String mode)
public RandomAccessFile(String name, String mode)
創建 RandomAccessFile 類實例需要指定一個 mode 參數,該參數指定 RandomAccessFile 的訪問模式:

Java常用數據流全面大梳理

如果模式為只讀r。則不會創建文件,而是會去讀取一個已經存在的文件,如果讀取的文件不存在則會出現異常。 如果模式為rw讀寫。如果文件不存在則會去創建文件,如果存在則不會創建。

import java.io.*;

/**
* @Author: Yeman
* @Date: 2021-09-26-20:13
* @Description:
*/
public class Test {
  public static void main(String[] args) {
      RandomAccessFile r1 = null;
      RandomAccessFile rw = null;
      try {
          r1 = new RandomAccessFile("IO\\input.jpg", "r");
          rw = new RandomAccessFile("IO\\output.jpg", "rw");

          byte[] bytes = new byte[1024];
          int len = r1.read(bytes);
          while (len != -1){
              rw.write(bytes,0,len);
              len = r1.read(bytes);
          }
      } catch (IOException e) {
          e.printStackTrace();
      } finally {
          try {
              if (rw != null) rw.close();
          } catch (IOException e) {
              e.printStackTrace();
          }
          try {
              if (r1 != null) r1.close();
          } catch (IOException e) {
              e.printStackTrace();
          }
      }

  }
}

 

Java NIO

Java NIO (New IO,Non-Blocking IO)是從Java 1.4版本開始引入的一套新的IO API,可以替代標準的Java IO API。NIO與原來的IO有同樣的作用和目的,但是使用的方式完全不同,NIO支持面向緩沖區的(IO是面向流的)、基于通道的IO操作,NIO將以更加高效的方式進行文件的讀寫操作。

Java API中提供了兩套NIO,一套是針對標準輸入輸出NIO,另一套就是網絡編程NIO。

Java常用數據流全面大梳理

隨著 JDK 7 的發布,Java對NIO進行了極大的擴展,增強了對文件處理和文件系統特性的支持,以至于我們稱他們為 NIO.2。因為 NIO 提供的一些功能,NIO已經成為文件處理中越來越重要的部分。

早期的Java只提供了一個File類來訪問文件系統,但File類的功能比較有限,所提供的方法性能也不高。而且,大多數方法在出錯時僅返回失敗,并不會提供異常信息。
NIO. 2為了彌補這種不足,引入了Path接口,代表一個平臺無關的平臺路徑,描述了目錄結構中文件的位置。Path可以看成是File類的升級版本,實際引用的資源也可以不存在。

在以前IO操作都是這樣寫的:

import java.io.File;
File file = new File("index.html");

但在Java7 中,可以這樣寫:

import java.nio.file.Path; 
import java.nio.file.Paths; 
Path path = Paths.get("index.html");

同時,NIO.2在java.nio.file包下還提供了Files、Paths工具類,Files包含了大量靜態的工具方法來操作文件;Paths則包含了兩個返回Path的靜態工廠方法。

Paths 類提供的靜態 get() 方法用來獲取 Path 對象:
static Path get(String first, String … more) : 用于將多個字符串串連成路徑
static Path get(URI uri): 返回指定uri對應的Path路徑

Java常用數據流全面大梳理

Java常用數據流全面大梳理

Java常用數據流全面大梳理

到此這篇關于Java常用數據流全面大梳理的文章就介紹到這了,更多相關Java 數據流內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://blog.csdn.net/m0_46653805/article/details/120477615

延伸 · 閱讀

精彩推薦
  • Java教程Java8中Stream使用的一個注意事項

    Java8中Stream使用的一個注意事項

    最近在工作中發現了對于集合操作轉換的神器,java8新特性 stream,但在使用中遇到了一個非常重要的注意點,所以這篇文章主要給大家介紹了關于Java8中S...

    阿杜7482021-02-04
  • Java教程Java使用SAX解析xml的示例

    Java使用SAX解析xml的示例

    這篇文章主要介紹了Java使用SAX解析xml的示例,幫助大家更好的理解和學習使用Java,感興趣的朋友可以了解下...

    大行者10067412021-08-30
  • Java教程小米推送Java代碼

    小米推送Java代碼

    今天小編就為大家分享一篇關于小米推送Java代碼,小編覺得內容挺不錯的,現在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧...

    富貴穩中求8032021-07-12
  • Java教程升級IDEA后Lombok不能使用的解決方法

    升級IDEA后Lombok不能使用的解決方法

    最近看到提示IDEA提示升級,尋思已經有好久沒有升過級了。升級完畢重啟之后,突然發現好多錯誤,本文就來介紹一下如何解決,感興趣的可以了解一下...

    程序猿DD9332021-10-08
  • Java教程xml與Java對象的轉換詳解

    xml與Java對象的轉換詳解

    這篇文章主要介紹了xml與Java對象的轉換詳解的相關資料,需要的朋友可以參考下...

    Java教程網2942020-09-17
  • Java教程20個非常實用的Java程序代碼片段

    20個非常實用的Java程序代碼片段

    這篇文章主要為大家分享了20個非常實用的Java程序片段,對java開發項目有所幫助,感興趣的小伙伴們可以參考一下 ...

    lijiao5352020-04-06
  • Java教程Java實現搶紅包功能

    Java實現搶紅包功能

    這篇文章主要為大家詳細介紹了Java實現搶紅包功能,采用多線程模擬多人同時搶紅包,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙...

    littleschemer13532021-05-16
  • Java教程Java BufferWriter寫文件寫不進去或缺失數據的解決

    Java BufferWriter寫文件寫不進去或缺失數據的解決

    這篇文章主要介紹了Java BufferWriter寫文件寫不進去或缺失數據的解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望...

    spcoder14552021-10-18
主站蜘蛛池模板: 91久久偷偷做嫩草影院免费看 | 成人在线免费播放 | 女人把私密部位张开让男人桶 | 日本妻子迷妹网 | freee×xx性欧美 | 欧美一区不卡二区不卡三区 | 精品一区二区三区五区六区 | 亚洲第一二三四区 | 国产一区二区三区久久精品小说 | 美女扒开粉嫩尿口漫画 | 狠狠久久久久综合网 | 9久热久爱免费精品视频在线观看 | 青青在线国产视频 | 香蕉久久久久久狠狠色 | 36美女厕所撒尿全过程 | s8sp加密路线和免费路线首页 | 波多野结衣被绝伦强在线观看 | 国产九九在线观看播放 | 手机看片一区二区 | 色偷偷影院 | 国产第一页在线视频 | 天美传媒tm0065 | 百合漫画咱啪全彩抚慰 | 国产探花视频 | 欧美精品一二三区 | 国产精品猎奇系列在线观看 | 天天夜夜草草久久伊人天堂 | 星空无限传媒xk8027穆娜 | 国产91精品久久久久久 | 美女gif趴跪式抽搐动态图 | 欧美精品一国产成人性影视 | 国产欧美一区二区三区精品 | 午夜亚洲一区二区福利 | www.男人的天堂.com | 国模娜娜a4u1546全套 | 五月天婷婷亚洲 | 95在线观看精品视频 | 成人小视频在线免费观看 | 亚洲人成在线观看一区二区 | 欧美一区精品二区三区 | 第一福利在线视频 |