最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

舉例講解Java中的Stream流概念

 更新時間:2015年09月14日 08:52:54   投稿:goldensun  
這篇文章主要介紹了舉例講解Java中的Stream流概念,是Java入門學(xué)習(xí)中的基礎(chǔ)知識,需要的朋友可以參考下

1、基本的輸入流和輸出流
流是 Java 中最重要的基本概念之一。文件讀寫、網(wǎng)絡(luò)收發(fā)、進(jìn)程通信,幾乎所有需要輸入輸出的地方,都要用到流。

流是做什么用的呢?就是做輸入輸出用的。為什么輸入輸出要用“流”這種方式呢?因為程序輸入輸出的基本單位是字節(jié),輸入就是獲取一串字節(jié),輸出就是發(fā)送一串字節(jié)。但是很多情況下,程序不可能接收所有的字節(jié)之后再進(jìn)行處理,而是接收一點(diǎn)處理一點(diǎn)。比方你下載魔獸世界,不可能全部下載到內(nèi)存里再保存到硬盤上,而是下載一點(diǎn)就保存一點(diǎn)。這時,流這種方式就非常適合。

在 Java 中,每個流都是一個對象。流分為兩種:輸入流(InputStream)和輸出流(OutputStream)。對于輸入流,你只要從流當(dāng)中不停地把字節(jié)取出來就是了;而對于輸出流,你只要把準(zhǔn)備好的字節(jié)串傳給它就行。

流對象是怎么獲得的呢?不同的外部系統(tǒng),獲取流的方式也不同。例如,文件讀寫就要創(chuàng)建 FileInputStream/FileOutputStream 對象,而網(wǎng)絡(luò)通信是通過 Socket 對象來獲取輸入輸出流的。一般來說,如果一個類有 getInputStream() 或 getOutputStream() 這樣的方法,就表明它是通過流對象來進(jìn)行輸入輸出的。
 
InputStream 是輸入流,下面是一個通過 InputStream 讀取文件的例子:

import java.io.File; 
import java.io.FileInputStream; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.FileNotFoundException; 
import java.util.Arrays; 
 
/** 
 * 通過流讀取文件 
 */ 
public class ReadFileDemo { 
 
 // 程序入口 
 public static void main(String[] args) { 
  String path = "c:/boot.ini"; 
  File file = new File(path); 
 
  // 創(chuàng)建輸入流 
  InputStream is; 
  try { 
   is = new FileInputStream(file); 
  } catch (FileNotFoundException e) { 
   System.err.println("文件 " + path + " 不存在。"); 
   return; 
  } 
 
  // 開始讀取 
  byte[] content = new byte[0];  // 保存讀取出來的文件內(nèi)容 
  byte[] buffer = new byte[10240]; // 定義緩存 
 
  try { 
   int eachTime = is.read(buffer); // 第一次讀取。如果返回值為 -1 就表示沒有內(nèi)容可讀了。 
   while (eachTime != -1) { 
    // 讀取出來的內(nèi)容放在 buffer 中,現(xiàn)在將其合并到 content。 
    content = concatByteArrays(content, buffer, eachTime); 
    eachTime = is.read(buffer); // 繼續(xù)讀取 
   } 
  } catch (IOException e) { 
   System.err.println("讀取文件內(nèi)容失敗。"); 
   e.printStackTrace(); 
  } finally { 
   try { 
    is.close(); 
   } catch (IOException e) { 
    // 這里的異??梢院雎圆惶幚?
   } 
  } 
 
  // 輸出文件內(nèi)容 
  String contentStr = new String(content); 
  System.out.println(contentStr); 
 } 
 
 /** 
  * 合并兩個字節(jié)串 
  * 
  * @param bytes1  字節(jié)串1 
  * @param bytes2  字節(jié)串2 
  * @param sizeOfBytes2 需要從 bytes2 中取出的長度 
  * 
  * @return bytes1 和 bytes2 中的前 sizeOfBytes2 個字節(jié)合并后的結(jié)果 
  */ 
 private static byte[] concatByteArrays(byte[] bytes1, byte[] bytes2, int sizeOfBytes2) { 
  byte[] result = Arrays.copyOf(bytes1, (bytes1.length + sizeOfBytes2)); 
  System.arraycopy(bytes2, 0, result, bytes1.length, sizeOfBytes2); 
  return result; 
 } 
} 

雖然寫得很啰嗦,但這確實是 InputStream 的基本用法。注意,這只是一個例子,說明如何從輸入流中讀取字節(jié)串。實際上,Java 提供更簡單的方式來讀取文本文件。以后將會介紹。

相比從流中讀取,使用 OutputStream 輸出則是非常簡單的事情。下面是一個例子:

import java.io.OutputStream; 
import java.io.FileOutputStream; 
import java.io.File; 
import java.io.IOException; 
import java.util.Date; 
 
/** 
 * 將當(dāng)前日期保存到文件 
 */ 
public class SaveFileDemo { 
 
 public static void main(String[] args) throws IOException { 
  String path = "c:/now.txt"; 
 
  File file = new File(path); 
  if (!file.exists() && !file.createNewFile()) { 
   System.err.println("無法創(chuàng)建文件。"); 
   return; 
  } 
 
  OutputStream os = new FileOutputStream(file); // 創(chuàng)建輸出流(前提是文件存在) 
  os.write(new Date().toString().getBytes());  // 將當(dāng)前時間寫入文件 
  os.close();          // 必須關(guān)閉流,內(nèi)容才會寫入文件。 
  System.out.println("文件寫入完成。"); 
 } 
} 

 
Java 還提供其它的流操作方式,但它們都是對 InputStream 和 OutputStream 進(jìn)行擴(kuò)展或包裝。所以這兩個類是基礎(chǔ),必須要理解它們的使用。

2、Reader 和 Writer
介紹了 InputStream 和 OutputStream,接下來介紹 Reader 和 Writer。這兩個類其實就是將 InputStream 和 OutputStream 包裝了一下。不過它們處理的不是字節(jié)(byte),而是字符(char)。如果一個流當(dāng)中的內(nèi)容都是文本,那么用 Reader/Writer 處理起來會簡單些。下面是一個用 Reader 讀取文本文件的例子:

import java.io.FileReader; 
import java.io.IOException; 
import java.io.Reader; 
 
/** 
 * 讀取文本文件 
 */ 
public class ReadTextFileDemo { 
 
 // 程序入口 
 public static void main(String[] args) { 
  String path = "c:/boot.ini"; 
  String content = ""; 
 
  try { 
   Reader reader = new FileReader(path); 
   char[] buffer = new char[10240]; 
   int count; 
 
   while ((count = reader.read(buffer)) != -1) { 
    content += new String(buffer, 0, count); 
   } 
  } catch (IOException e) { 
   System.err.println("讀取文件失敗。"); 
   e.printStackTrace(); 
  } 
 
  System.out.println(content); 
 } 
 
} 

至于如何用 Writer 將文本內(nèi)容寫入文件,這里就不給出例子了,看官自己試著寫一下吧。

上面這個例子,仍然不是讀取文本文件最常用的方式。Java 提供 BufferedReader,我們通常用它來讀取文本文件。下面是一個例子:

import java.io.BufferedReader; 
import java.io.FileReader; 
import java.io.IOException; 
 
/** 
 * 用 BufferedReader 讀取文本文件 
 */ 
public class ReadTextDemo2 { 
 
 public static void main(String[] args) { 
  String path = "c:/boot.ini"; 
  String content = ""; 
 
  try { 
   BufferedReader reader = new BufferedReader(new FileReader(path)); 
   String line; 
   while ((line = reader.readLine()) != null) { 
    content += line + "/n"; 
   } 
  } catch (IOException e) { 
   System.err.println("讀取文件失敗。"); 
   e.printStackTrace(); 
  } 
 
  System.out.println(content); 
 } 
} 

3、對象序列化
對象序列化也是流應(yīng)用的一個重要方面。序列化就是把一個對象轉(zhuǎn)換成一串字節(jié),既可以保存起來,也可以傳給另外的 Java 程序使用。ObjectOutputStream 和 ObjectInputStream 就是專門用來進(jìn)行序列化和反序列化的。下面就是一個簡單的例子:

import java.io.ObjectOutputStream; 
import java.io.FileOutputStream; 
import java.io.File; 
import java.io.IOException; 
import java.io.Serializable; 
import java.io.ObjectInputStream; 
import java.io.FileInputStream; 
import java.io.EOFException; 
  
/** 
 * ObjectOutputStream/ObjectInputStream 示例。 
 * 這兩個類分別用于序列化和反序列化。 
 */ 
public class SerializationDemo { 
  
  public static void main(String[] args) throws Exception { 
    String path = "c:/persons.data"; 
    File f = new File(path); 
    if (!f.exists()) { 
      f.createNewFile(); 
    } 
  
    writePersons(path); 
    readPersons(path); 
  } 
  
  // 從指定的文件中讀取 Person 對象 
  private static void readPersons(String path) throws IOException, ClassNotFoundException { 
    ObjectInputStream ois = new ObjectInputStream(new FileInputStream(path)); 
  
    Person p; 
    while (true) { 
      try { 
        p = (Person) ois.readObject(); 
        System.out.println(p); 
      } catch (EOFException e) { 
        break; 
      } 
    } 
  } 
  
  // 將 Person 對象保存到指定的文件中 
  private static void writePersons(String path) throws IOException { 
    Person[] persons = new Person[]{ 
        new Person("張三", 23), 
        new Person("李四", 24) 
    }; 
  
    ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(path)); 
    for (Person person : persons) { 
      oos.writeObject(person); 
    } 
    oos.close(); 
  } 
  
  /////////////////////////////////////////////////////////// 
  
  private static class Person implements Serializable { 
  
    private String name; 
  
    private int age; 
  
    public Person() { 
    } 
  
    public Person(String name, int age) { 
      this.name = name; 
      this.age = age; 
    } 
  
    public String getName() { 
      return name; 
    } 
  
    public void setName(String name) { 
      this.name = name; 
    } 
  
    public int getAge() { 
      return age; 
    } 
  
    public void setAge(int age) { 
      this.age = age; 
    } 
  
    @Override 
    public String toString() { 
      return "Person{" + 
          "name='" + name + '/'' + 
          ", age=" + age + 
          '}'; 
    } 
  } 
} 

這個例子里面看不到字節(jié)和字符的讀寫,因為這兩個類都包裝好了。上面只是一個簡單的例子,序列化要寫好的話還是有不少講究的。想深入了解序列化,可以看看這里。本文只關(guān)注跟流有關(guān)的部分。其實序列化用的很少,因為序列化降低了靈活性,所以可以不用的話一般都不會用。

相關(guān)文章

  • 讀取xml文件中的配置參數(shù)實例

    讀取xml文件中的配置參數(shù)實例

    下面小編就為大家?guī)硪黄x取xml文件中的配置參數(shù)實例。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-10-10
  • Java實現(xiàn)簡單的貪吃蛇游戲

    Java實現(xiàn)簡單的貪吃蛇游戲

    這篇文章主要介紹了Java實現(xiàn)簡單的貪吃蛇游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • Java JDK1.7對字符串的BASE64編碼解碼方法

    Java JDK1.7對字符串的BASE64編碼解碼方法

    今天小編就為大家分享一篇Java JDK1.7對字符串的BASE64編碼解碼方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-10-10
  • 在Java中FreeMarker?模板來定義字符串模板

    在Java中FreeMarker?模板來定義字符串模板

    這篇文章主要介紹了在Java中FreeMarker?模板來定義字符串模板,文章基于Java的相關(guān)資料展開詳細(xì)內(nèi)容,需要的小伙伴可以參考一下
    2022-04-04
  • 如何解決項目中java heap space的問題

    如何解決項目中java heap space的問題

    這篇文章主要介紹了如何解決項目中java heap space的問題,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2020-07-07
  • Java 基礎(chǔ)面試真題:String 為什么是不可變的?

    Java 基礎(chǔ)面試真題:String 為什么是不可變的?

    本文主要介紹了String、StringBuffer和StringBuilder的區(qū)別,以及String不可變的原因,String不可變的原因是其內(nèi)部使用final修飾的char數(shù)組保存字符串,同時String類沒有提供修改字符串的方法,在Java9之后,String的底層實現(xiàn)由char[]改成了byte[],這是為了節(jié)省內(nèi)存空間
    2025-01-01
  • java批量下載生成zip壓縮包的思路詳解

    java批量下載生成zip壓縮包的思路詳解

    這篇文章主要介紹了java批量下載生成zip壓縮包的思路詳解,設(shè)計思路大概是本地先創(chuàng)建一個zip文件,將批量下載的文件依次放入zip文件中,將zip文件返回給前端,本文結(jié)合實例代碼講解的非常詳細(xì),需要的朋友可以參考下
    2024-01-01
  • SpringBoot 配置文件中配置的中文,程序讀取出來是亂碼的解決

    SpringBoot 配置文件中配置的中文,程序讀取出來是亂碼的解決

    這篇文章主要介紹了SpringBoot 配置文件中配置的中文,程序讀取出來是亂碼的解決,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • Java9新特性Stream流API優(yōu)化與增強(qiáng)

    Java9新特性Stream流API優(yōu)化與增強(qiáng)

    這篇文章主要為大家介紹了Java9新特性Stream流API優(yōu)化與增強(qiáng)的用法詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助祝大家多多進(jìn)步,早日升職加薪
    2022-03-03
  • Spring Boot 數(shù)據(jù)校驗@Valid+統(tǒng)一異常處理的實現(xiàn)

    Spring Boot 數(shù)據(jù)校驗@Valid+統(tǒng)一異常處理的實現(xiàn)

    這篇文章主要介紹了Spring Boot 數(shù)據(jù)校驗@Valid+統(tǒng)一異常處理的實現(xiàn),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2019-04-04

最新評論

称多县| 漳平市| 甘谷县| 荥阳市| 昌乐县| 乌拉特后旗| 湟源县| 永年县| 壶关县| 大荔县| 盐池县| 西乡县| 仁怀市| 马鞍山市| 龙山县| 青州市| 政和县| 荔浦县| 梅河口市| 吉林市| 乐昌市| 朝阳区| 平原县| 乐业县| 留坝县| 衡阳市| 永顺县| 蕲春县| 临澧县| 越西县| 马山县| 潼关县| 武宣县| 天等县| 青铜峡市| 仁怀市| 光泽县| 青河县| 香格里拉县| 宁津县| 赤峰市|