Java InputStream的多种使用详解

 更新时间:2019年12月03日 10:33:21   作者:这个很科学  
这篇文章主要介绍了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();

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

相关文章

  • Java中负数的绝对值竟然不一定是正数

    Java中负数的绝对值竟然不一定是正数

    这篇文章主要介绍了Java中负数的绝对值竟然不一定是正数,文中给大家提到Java 中怎么把负数转换为正数,需要的朋友可以参考下
    2021-07-07
  • 浅谈java中的局部变量和全局变量

    浅谈java中的局部变量和全局变量

    这篇文章主要涉及了java中的局部变量和全局变量,就二者的含义、生存时间和创建位置作了介绍,需要的朋友可以参考下。
    2017-09-09
  • Java Char的简单工具类CharUtil分享

    Java Char的简单工具类CharUtil分享

    下面小编就为大家分享一篇Java Char的简单工具类CharUtil,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • Java后台如何处理日期参数格式

    Java后台如何处理日期参数格式

    这篇文章主要介绍了Java后台如何处理日期参数格式问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • JAVAEE Filter 过滤器设置是否缓存实例详解

    JAVAEE Filter 过滤器设置是否缓存实例详解

    网页中,每次的客户端访问服务器,有部分不用重复请求的,这样可以减轻服务器的工作量。那么如何设置客户端是否都缓存呢?接下来通过本文给大家介绍JAVAEE Filter 过滤器设置是否缓存的实例,感兴趣的朋友一起学习吧
    2016-05-05
  • Java使用JDBC或MyBatis框架向Oracle中插入XMLType数据

    Java使用JDBC或MyBatis框架向Oracle中插入XMLType数据

    XMLType是Oracle支持的一种基于XML格式存储的数据类型,这里我们共同来探究Java使用JDBC或MyBatis框架向Oracle中插入XMLType数据的方法:
    2016-07-07
  • SpringBoot初始教程之Servlet、Filter、Listener配置详解

    SpringBoot初始教程之Servlet、Filter、Listener配置详解

    本篇文章主要介绍了SpringBoot初始教程之Servlet、Filter、Listener配置详解,具有一定的参考价值,有兴趣的可以了解一下
    2017-09-09
  • Java Swing 只关闭当前窗体的实现

    Java Swing 只关闭当前窗体的实现

    这篇文章主要介绍了Java Swing 只关闭当前窗体的实现,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • Sentinel热门词汇限流的实现详解

    Sentinel热门词汇限流的实现详解

    这篇文章主要介绍了使用Sentinel对热门词汇进行限流的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • MyBatis使用annonation定义类型映射的简易用法示例

    MyBatis使用annonation定义类型映射的简易用法示例

    这篇文章主要介绍了MyBatis使用annonation定义类型映射的简易用法示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09

最新评论