Java InputStream的多种使用详解

以前写东西,尤其是网络传输方面总会碰到将某种格式的文本或者图片等转幻成数据流的方式来传输,那时候用的就直接网上找点就粘贴,也没什么搞懂到底是怎么个机理。后来抽点空就死啃了点这方面的文章,稍微懂了点,特意分享一下。
InputStream  FileInputStream BufferInputStream  InputStreamreader ByteArrayInputStream这些东西到底什么关系呢?

一、首先我先理解InputStream是老大,剩下的这些都是为其服务的,先建立一个标准,而FileInputStream是其子类。他可以对文件进行数据流的转换。

String fileName = "E:\\电影\\[高清电影]";

InputStream inputstream = new FileInputStream("fileName");//然后对InputStream 进行读操作,为啥是读呢?可以把内存当作主体,这是某个网友说的,你从硬盘往内存里Input 东西就是读取数据咯。 另外这里因为FileInputStream继承InputStream 类//所以可以这样用

   byte[] by = new byte[8192];//此数字不唯一哦;

   int len ;

   while(  (len=inputStream.read(by))!=-1 ){ //len就是得出的字节流了。
         }
   inputStream.close();//最后别忘记关闭,当然应该还有个if判断是否为空和try catch 的语句。

  File f = new File("F:\\……"); 

  if (!f.exists()) {
  System.out.println("creat " + f.toString()); 

   f.createNewFile();
   }

  FileOutputStream fos = new FileOutputStream(f);//InputStream和OutputStream 一般辩证的来看,一个读,一个写,两者差不多的用法。
 fos.write(b, 0, len);
 fos.flush();
 fos.close(); 

二、在接下来说BufferInputStream,他是数据流缓存的东西,不带缓冲的操作,每读一个字节就要写入一个字节,由于涉及磁盘的IO操作相比内存的操作要慢很多,所以不带缓冲的流效率很低。带缓冲的流,可以一次读很多字节,但不向磁盘中写入,只是先放到内存里。等凑够了缓冲区大小的时候一次性写入磁盘,这种方式可以减少磁盘操作次数,速度就会提高很多!这就是两者的区别。

public class InputStreamTest {
  private static final String FILENAME="E:\\电影\\[高清电影]阿甘正传.1994.美国.中文字幕.1280x720.rmvb";
  public static void main(String[] args) throws IOException {
    long l1 = readByBufferedInputStream();
    long l2 = readByInputStream();
    System.out.println("通过BufferedInputStream读取用时:"+l1+";通过InputStream读取用时:"+l2);
  }

  public static long readByInputStream() throws IOException {
    InputStream in=new FileInputStream(FILENAME);
    byte[] b=new byte[8192];
    int l=0;
    long start=System.currentTimeMillis();
    while(in.read(b,0,8192)!=-1){
    }
    long end=System.currentTimeMillis();
    return end-start;
  }

  public static long readByBufferedInputStream() throws IOException {
    BufferedInputStream in=new BufferedInputStream(new FileInputStream(FILENAME));
    byte[] b=new byte[8192];
    int l=0;
    long start=System.currentTimeMillis();
    while(in.read(b,0,8192)!=-1){
    }
    long end=System.currentTimeMillis();
    return end-start;
  }
}

三、InputStreamreader其实就是将字节流转成字符流。

import java.io.*;
class InputStreamReaderDemo {
 public static void transReadNoBuf() throws IOException {
  /**
   * 没有缓冲区,只能使用read()方法。
   */
  //读取字节流
  //InputStream in = System.in;//读取键盘的输入。
  InputStream in = new FileInputStream("D:\\demo.txt");//读取文件的数据。
  //将字节流向字符流的转换。要启用从字节到字符的有效转换,
  //可以提前从底层流读取更多的字节.
  InputStreamReader isr = new InputStreamReader(in);//读取
  //综合到一句。
  //InputStreamReader isr = new InputStreamReader(
  //new FileInputStream("D:\\demo.txt"));

  char []cha = new char[1024];
  int len = isr.read(cha);
  System.out.println(new String(cha,0,len));
  isr.close();

 }
 public static void transReadByBuf() throws IOException {
  /**
   * 使用缓冲区 可以使用缓冲区对象的 read() 和 readLine()方法。
   */
  //读取字节流
  //InputStream in = System.in;//读取键盘上的数据
  InputStream in = new FileInputStream("D:\\demo.txt");//读取文件上的数据。
  //将字节流向字符流的转换。
  InputStreamReader isr = new InputStreamReader(in);//读取
  //创建字符流缓冲区
  BufferedReader bufr = new BufferedReader(isr);//从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的
   //高效读取。 可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值足够大。类似于BufferInputStream
   //只是两者缓冲的对象不一样。
 //BufferedReader bufr = new BufferedReader(
  //new InputStreamReader(new FileInputStream("D:\\demo.txt")));可以综合到一句。
   /*int ch =0;
  ch = bufr.read();
  System.out.println((char)ch);
  */
  String line;
  while((line = bufr.readLine())!=null){
   System.out.println(line);
  }
  isr.close();
 }
}

四、最后一个ByteArrayInputStream 这个其实用的的不多,但是ByteArrayOutputStream还是用的多点,所以拿ByteArrayOutputStream来上代码。他的作用就是把字节流转成字符。其实我感觉没啥用,可能是我知道的不多

从文件中读取二进制数据,全部存储到ByteArrayOutputStream中。

FileInputStream fis=new FileInputStream("test");

BufferedInputStream bis=new BufferedInputStream(fis);

ByteArrayOutputStream baos=new ByteArrayOutputStream();

int c=bis.read();//读取bis流中的下一个字节

while(c!=-1){

   baos.write(c);

   c=bis.read();

}

bis.close();

byte retArr[]=baos.toByteArray();

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • 解析Java的InputStream类并借助其读取ppt文件

    1. 关于InputStream.read()      在从数据流里读取数据时,为图简单,经常用InputStream.read()方法.这个方法是从流里每次只读取读取一个字节,效率会非常低.     更好的方法是用InputStream.read(byte[] b)或者InputStream.read(byte[] b,int off,int len)方法,一次读取多个字节. 2. 关于InputStream类的available()方法     要一次读取多个字节时,经常用到InputSt

  • Java的DataInputStream和DataOutputStream数据输入输出流

    DataInputStream  DataInputStream 是数据输入流.它继承于FilterInputStream. DataInputStream 是用来装饰其它输入流,它"允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型".应用程序可以使用DataOutputStream(数据输出流)写入由DataInputStream(数据输入流)读取的数据. DataInputStream 函数列表: DataInputStream(InputStream in)

  • java DataInputStream和DataOutputStream详解及实例代码

    java DataInputStream和DataOutputStream详解 操作基本数据类型的流 DataInputStream DataOutputStream import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public c

  • ByteArrayInputStream简介和使用_动力节点Java学院整理

    ByteArrayInputStream 介绍 ByteArrayInputStream 是字节数组输入流.它继承于InputStream. 它包含一个内部缓冲区,该缓冲区包含从流中读取的字节:通俗点说,它的内部缓冲区就是一个字节数组,而ByteArrayInputStream本质就是通过字节数组来实现的. 我们都知道,InputStream通过read()向外提供接口,供它们来读取字节数据:而ByteArrayInputStream 的内部额外的定义了一个计数器,它被用来跟踪 read() 方

  • Java 中的 DataInputStream 介绍_动力节点Java学院整理

    DataInputStream 介绍 DataInputStream 是数据输入流.它继承于FilterInputStream. DataInputStream 是用来装饰其它输入流,它"允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型".应用程序可以使用DataOutputStream(数据输出流)写入由DataInputStream(数据输入流)读取的数据. DataInputStream 函数列表 DataInputStream(InputStream in

  • Java中的BufferedInputStream与BufferedOutputStream使用示例

    BufferedInputStream  BufferedInputStream 是缓冲输入流.它继承于FilterInputStream. BufferedInputStream 的作用是为另一个输入流添加一些功能,例如,提供"缓冲功能"以及支持"mark()标记"和"reset()重置方法". BufferedInputStream 本质上是通过一个内部缓冲区数组实现的.例如,在新建某输入流对应的BufferedInputStream后,当我

  • java 中InputStream,String,File之间的相互转化对比

    InputStream,String,File相互转化  1. String --> InputStream InputStream String2InputStream(String str){ ByteArrayInputStream stream = new ByteArrayInputStream(str.getBytes()); return stream; } 2. InputStream --> String String inputStream2String(InputStre

  • BufferedInputStream(缓冲输入流)详解_动力节点Java学院整理

    BufferedInputStream 介绍 BufferedInputStream 是缓冲输入流.它继承于FilterInputStream. BufferedInputStream 的作用是为另一个输入流添加一些功能,例如,提供"缓冲功能"以及支持"mark()标记"和"reset()重置方法". BufferedInputStream 本质上是通过一个内部缓冲区数组实现的.例如,在新建某输入流对应的BufferedInputStream后,

  • Java中FilterInputStream和FilterOutputStream的用法详解

    FilterInputStream FilterInputStream 的作用是用来"封装其它的输入流,并为它们提供额外的功能".它的常用的子类有BufferedInputStream和DataInputStream. BufferedInputStream的作用就是为"输入流提供缓冲功能,以及mark()和reset()功能". DataInputStream 是用来装饰其它输入流,它"允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类

  • 详解PipedInputStream和PipedOutputStream_动力节点Java学院整理

    java 管道介绍 在java中,PipedOutputStream和PipedInputStream分别是管道输出流和管道输入流. 它们的作用是让多线程可以通过管道进行线程间的通讯.在使用管道通信时,必须将PipedOutputStream和PipedInputStream配套使用. 使用管道通信时,大致的流程是:我们在线程A中向PipedOutputStream中写入数据,这些数据会自动的发送到与PipedOutputStream对应的PipedInputStream中,进而存储在Piped

  • java序列化与ObjectOutputStream和ObjectInputStream的实例详解

    java序列化与ObjectOutputStream和ObjectInputStream的实例详解 一个测试的实体类: public class Param implements Serializable { private static final long serialVersionUID = 5187074869820982336L; private Integer param1; private String param2; public Integer getParam1() { re

随机推荐