欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中IO流 字節(jié)流實例詳解

 更新時間:2017年05月14日 15:05:52   投稿:lqh  
這篇文章主要介紹了Java中IO流 字節(jié)流實例詳解的相關資料,需要的朋友可以參考下

Java中IO流 字節(jié)流實例詳解

IO流(輸入流、輸出流),又分為字節(jié)流、字符流。

  流是磁盤或其它外圍設備中存儲的數(shù)據(jù)的源點或終點。

  輸入流:程序從輸入流讀取數(shù)據(jù)源。數(shù)據(jù)源包括外界(鍵盤、文件、網(wǎng)絡…),即是將數(shù)據(jù)源讀入到程序的通信通道。

  輸出流:程序向輸出流寫入數(shù)據(jù)。將程序中的數(shù)據(jù)輸出到外界(顯示器、打印機、文件、網(wǎng)絡…)的通信通道。

字節(jié)流

  1.InputStream、OutputStream

  InputStream抽象了應用程序讀取數(shù)據(jù)的方式

  OutputStream抽象了應用程序?qū)懗鰯?shù)據(jù)的方式

  2.讀到文件結(jié)尾,稱為EOF = end,讀到-1就讀到結(jié)尾

  3.輸入流基本方法

  int b = in.read();讀取一個字節(jié),無符號填充到int的低八位.-1是EOF

  int.read(byte[] buf)讀取數(shù)據(jù)填充到字節(jié)數(shù)組buf

  int.read(byte[] buf, int start, int size)讀取數(shù)據(jù)填充到字節(jié)數(shù)組buf,從buf的start位置開始存儲size長度的數(shù)據(jù)

  4.輸出流基本方法

  out.write(int b);寫出一個byte到流,b的低八位

  out.write(byte[] buf);將buf字節(jié)數(shù)組都寫入到流

  out.write(byte[] buf, int start, int size);字節(jié)數(shù)組buf從start位置開始寫size長度的字節(jié)到流

  5.FileInputStream是InputStream的子類,具體實現(xiàn)了在文件上讀取數(shù)據(jù)

    6.FileOutputStream是OutputStream的子類,實現(xiàn)了向文件中寫出字節(jié)數(shù)據(jù)的方法

  FileInputStream的demo:

package com.test.io;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class IOUtils {
  /**
   * 讀取指定文件內(nèi)容,按照十六進制輸出到控制臺
   * 并且每輸出10個byte換行
   * @param fileName
   * @throws IOException
   */
  public static void printHex(String fileName) throws IOException {
    //把文件作為字節(jié)流進行讀操作
    FileInputStream in = new FileInputStream(fileName);
    int b;
    int i = 1;
    while ((b = in.read()) != -1) {
      if (b <= 0xf) {
        System.out.print("0");
      }
      System.out.print(Integer.toHexString(b) + " ");
      if (i % 10 == 0) {
        System.out.println("");
      }
      i++;
    }
    in.close();
  }

  public static void printHexByByteArray(String fileName) throws IOException {
    FileInputStream in = new FileInputStream(fileName);
    byte[] buf = new byte[20*1024];
    
    //如果字節(jié)數(shù)組夠大,可以一次性讀完
    //從in中批量讀取字節(jié),放入到buf這個字節(jié)數(shù)組中,從第0個位置開始放,最多放buf.length個,返回的是讀到的字節(jié)的個數(shù)
    /* int bytes = in.read(buf, 0, buf.length);
    int j = 1;
    for(int i = 0;i < bytes; i++) {
      if (buf[i] <= 0xf) {
        System.out.print("0");
      }
      System.out.print(Integer.toHexString(buf[i] & 0xff) + " ");
      if (j % 10 == 0) {
        System.out.println("");
      }
      j++;
    } */
    
    //如果字節(jié)數(shù)組不夠大,不能一次性讀完
    int bytes = 0;
    int j = 1;
    while ((bytes = in.read(buf, 0, buf.length)) != -1) {
      for (int i = 0; i <bytes; i++) {
        if (buf[i] <= 0xf) {
          System.out.print("0");
        }
        System.out.print(Integer.toHexString(buf[i] & 0xff) + " ");
        if (j % 10 == 0) {
          System.out.println("");
        }
        j++;
      }
    }
  }

}

  FileOutputStream的demo:

package com.test.io;

import java.io.FileOutputStream;
import java.io.IOException;

public class FileOutputDemo {

  public static void main(String[] args) throws IOException {
    //如果該文件不存在,則直接創(chuàng)建,如果存在,刪除后創(chuàng)建。(如果第二個參數(shù)為 true,則將字節(jié)寫入文件末尾處,而不是寫入文件開始處。)
    FileOutputStream out = new FileOutputStream("F:\\javaio\\out.dat");
    out.write('A');//寫入了‘A'的低八位(一次只寫入一個字節(jié))
    int a = 10;
    out.write(a >>> 24);
    out.write(a >>> 16);
    out.write(a >>> 8);
    out.write(a);
    
    byte[] b = "10".getBytes();
    out.write(b);
    
    out.close();
    
    IOUtils.printHex("F:\\javaio\\out.dat");    
  }
}

  7.DataOutputStream和DataInputStream,對流功能的擴展,可以更加方便的讀取int,long,字符等類型數(shù)據(jù)。

package com.test.io;

import java.io.DataOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class DataOutputDemo {

  public static void main(String[] args) throws IOException {
    String file = "F:\\javaio\\b.txt";
    DataOutputStream dos = new DataOutputStream(new FileOutputStream(file));
    dos.writeInt(10);
    dos.writeInt(-10);
    dos.writeLong(10l);
    dos.writeDouble(10.5);
    dos.writeUTF("你好");
    dos.writeChars("中國");
    dos.close();
    IOUtils.printHex(file);
  }
}

  運行結(jié)果:

00 00 00 0a ff ff ff f6 00 00 
00 00 00 00 00 0a 40 25 00 00 
00 00 00 00 00 06 e4 bd a0 e5 
a5 bd 4e 2d 56 fd 

  其中,00 06兩個字節(jié)是“你好”這兩個中文的字節(jié)個數(shù)。

package com.test.io;

import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.IOException;

public class DataInputDemo {

  public static void main(String[] args) throws IOException {
    String file = "F:\\javaio\\b.txt";
    DataInputStream dis = new DataInputStream(new FileInputStream(file));
    int i = dis.readInt();
    System.out.println(i);
    i = dis.readInt();
    System.out.println(i);
    long l = dis.readLong();
    System.out.println(l);
    double d = dis.readDouble();
    System.out.println(d);
    String s = dis.readUTF();
    System.out.println(s);
    dis.close();
  }

}

  運行結(jié)果:

10
-10
10
10.5
你好

   8.BufferedInputStream&BufferedOutputStream,這兩個流類為IO提供了帶緩沖區(qū)的操作,一般打開文件進行寫入或讀取操作時,都會加上緩沖,這種流模式提高了IO的性能。

  文件的拷貝:

package com.test.io;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class IOUtils {/**
   * 拷貝文件,字節(jié)批量讀取
   * @param srcFile 源文件
   * @param destFile 目標文件
   * @throws IOException
   */
  public static void copyFile(File srcFile, File destFile) throws IOException {
    if (!srcFile.exists()) {
      throw new IllegalArgumentException("文件" + srcFile + "不存在");
    }
    if (!srcFile.isFile()) {
      throw new IllegalArgumentException(srcFile + "不是文件");
    }
    FileInputStream in = new FileInputStream(srcFile);
    FileOutputStream out = new FileOutputStream(destFile);
    byte[] buf = new byte[10*1024];
    int b;
    while ((b = in.read(buf, 0, buf.length)) != -1) {
      out.write(buf,0,b);
      out.flush();//最好加上,刷新此輸出流并強制寫出所有緩沖的輸出字節(jié)。
    }
    in.close();
    out.close();
  }
  /**
   * 拷貝文件,利用帶緩沖的字節(jié)流
   * @param srcFile
   * @param destFile
   * @throws IOException
   */
  public static void copyFileByBuffer(File srcFile, File destFile) throws IOException {
    if (!srcFile.exists()) {
      throw new IllegalArgumentException("文件" + srcFile + "不存在");
    }
    if (!srcFile.isFile()) {
      throw new IllegalArgumentException(srcFile + "不是文件");
    }
    FileInputStream in = new FileInputStream(srcFile);
    FileOutputStream out = new FileOutputStream(destFile);
    
    BufferedInputStream bis = new BufferedInputStream(in);
    BufferedOutputStream bos = new BufferedOutputStream(out);
    
    int c;
    while ((c = bis.read()) != -1) {
      bos.write(c);
      bos.flush();
    }
    
    bis.close();
    bos.close();
  }
  /**
   * 拷貝文件,通過單字節(jié)讀取
   * @param srcFile
   * @param destFile
   * @throws IOException
   */
  public static void copyFileByByte(File srcFile, File destFile) throws IOException {
    if (!srcFile.exists()) {
      throw new IllegalArgumentException("文件" + srcFile + "不存在");
    }
    if (!srcFile.isFile()) {
      throw new IllegalArgumentException(srcFile + "不是文件");
    }
    FileInputStream in = new FileInputStream(srcFile);
    FileOutputStream out = new FileOutputStream(destFile);
    
    int c;
    while ((c = in.read()) != -1) {
      out.write(c);
      out.flush();
    }
    
    in.close();
    out.close();
  }
}

  測試文件拷貝:

package com.test.io;

import java.io.File;
import java.io.IOException;

public class IOUtilsTest {

  public static void main(String[] args) {
    //IOUtils.printHex("D:\\javaProgram\\Hello.java");
    try {
      long start = System.currentTimeMillis();
      //IOUtils.copyFile(new File("F:\\javaio\\1.mp3"), new File("F:\\javaio\\2.mp3"));//211ms
      //IOUtils.copyFileByBuffer(new File("F:\\javaio\\1.mp3"), new File("F:\\javaio\\3.mp3"));//18583ms
      IOUtils.copyFileByByte(new File("F:\\javaio\\1.mp3"), new File("F:\\javaio\\4.mp3"));//37822ms
      long end = System.currentTimeMillis();
      System.out.println(end - start);
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

  根據(jù)以上測試看出,文件拷貝,最快的方式是通過字節(jié)的批量讀取。

        感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關文章

  • springboot之使用logback日志框架的圖文教程

    springboot之使用logback日志框架的圖文教程

    這篇文章主要介紹了springboot之使用logback日志框架的圖文教程,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2023-06-06
  • SpringBoot利用觀察者模式實現(xiàn)聯(lián)動更新機制

    SpringBoot利用觀察者模式實現(xiàn)聯(lián)動更新機制

    觀察者模式(Observer Pattern)是一種軟件設計模式,在許多應用系統(tǒng)中,我們經(jīng)常需要處理多個表之間的關聯(lián)更新問題,本文將通過一個具體的案例,介紹如何在Spring Boot項目中利用觀察者模式來優(yōu)雅地解決這一需求,需要的朋友可以參考下
    2024-07-07
  • java使用Dijkstra算法實現(xiàn)單源最短路徑

    java使用Dijkstra算法實現(xiàn)單源最短路徑

    這篇文章主要為大家詳細介紹了java使用Dijkstra算法實現(xiàn)單源最短路徑,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-01-01
  • 詳解Maven settings.xml配置(指定本地倉庫、阿里云鏡像設置)

    詳解Maven settings.xml配置(指定本地倉庫、阿里云鏡像設置)

    這篇文章主要介紹了詳解Maven settings.xml配置(指定本地倉庫、阿里云鏡像設置),小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2018-12-12
  • Java實現(xiàn)作業(yè)調(diào)度的示例代碼

    Java實現(xiàn)作業(yè)調(diào)度的示例代碼

    這篇文章主要為大家詳細介紹了如何利用Java實現(xiàn)SJF算法調(diào)度,要求測試數(shù)據(jù)可以隨即輸入或從文件中讀入,文中的示例代碼講解詳細,需要的可以參考一下
    2023-04-04
  • SpringBoot 集成 activiti的示例代碼

    SpringBoot 集成 activiti的示例代碼

    這篇文章主要介紹了SpringBoot 集成 activiti的示例代碼,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2020-10-10
  • Spring中@Scheduled和HttpClient的連環(huán)坑

    Spring中@Scheduled和HttpClient的連環(huán)坑

    這篇文章主要給大家介紹了關于Spring中@Scheduled和HttpClient的連環(huán)坑,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧。
    2018-03-03
  • Java中反射reflect的基礎知識講解

    Java中反射reflect的基礎知識講解

    這篇文章主要介紹了Java中反射reflect的基礎知識講解,Java中的反射,它算是Java當中非常底層的一個技術,平時我們我們用得不多,實際上它也的確非常復雜同時也難以理解,但是涉及到底層的東西Java都給我們封裝好了,我們直接拿來調(diào)用即可,需要的朋友可以參考下
    2023-10-10
  • SpringBoot設置接口超時的方法小結(jié)

    SpringBoot設置接口超時的方法小結(jié)

    這篇文章主要介紹了SpringBoot設置接口超時的方法小結(jié),包括配置文件,config配置類及相關示例代碼,代碼簡單易懂,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-09-09
  • Java字符串替換的三種方法實際應用

    Java字符串替換的三種方法實際應用

    這篇文章主要給大家介紹了關于Java字符串替換的三種方法,replace和replaceAll是JAVA中常用的替換字符的方法,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-11-11

最新評論