当前位置: 首页 > 编程笔记 >

简单总结Java IO中stream流的使用方法

姜凯风
2023-03-14
本文向大家介绍简单总结Java IO中stream流的使用方法,包括了简单总结Java IO中stream流的使用方法的使用技巧和注意事项,需要的朋友参考一下


Java语言的输入输出功能是十分强大而灵活的,对于数据的输入和输出操作以“流”(stream)的方式进行。J2SDK提供了各种各样的“流”类,用以获取不同种类的数据,定义在包java.io中。程序中通过标准的方法输入或输出数据
Java中的流可以从不同的角度进行分类:
按照流的方向不同:分为输入流和输出流。
按照处理数据单位的不同:分为字节流(8位)和字符流(16位)。
按照功能不同:分为节点流和处理流。
节点流:是可以从一个特定的数据源(节点)读写数据的流(例如文件,内存)。就像是一条单一的管子接到水龙头上开始放水。
处理流:是“连接”在已经存在的流(节点流或处理流)之上,通过对数据的处理为程序提供更为强大的读写功能。就像在已经接了一条管子(节点流)的基础上,又套上几个更粗,具有特殊功能的管子(处理流)对流出的水进一步的处理。
  
J2SDK所提供的所有位于包java.io内的流类型都分别继承以下四种抽象流类型。

四种基本流InputStream,OutputStream,Reader,Writer又分别有更具体的子类,分为文件流,缓冲流,数据流,转换流,Print流,Object流等,都分别有特定的功能或用来操作特定的数据。其中深颜色的代表节点流,浅颜色的代表处理流。

这里通过节点流和处理流总结一下流的具体用法。
节点流的分类:

节点流分别对File(文件),Array(内存中的一个数组),String(字符串),Pipe(管道)进行处理。
处理流的分类:

常用的处理流有:缓冲流,转换流,数据流,对象流,打印流。
缓冲流:要套接在相应的字节流之上,对读写的数据提供了缓冲功能,提高了读写的效率,同时也增加了一些更方便方法。
缓冲流的作用就像一个桶,原本的字节流是个水管,水管直接连到目的地,加了缓冲流之后,就是在水管下接了一个桶,等桶接满水后再倒入目的地。起到了缓冲的作用。这样就可以一次读到更多的数据,避免了频繁的读写硬盘。由于带了缓冲功能,所以就写数据的时候需要使用flush方法。

import java.io.*; 
public class TestBufferStream{ 
  public static void main(String[] args){ 
    try{ 
       BufferedWriter bw=new BufferedWriter(new FileWriter("F:\\Java\\IO\\dat.txt"));//在对写文件的字节流上套接上缓冲流 
       BufferedReader br=new BufferedReader(new FileReader("F:\\Java\\IO\\dat.txt"));//在对读文件的字节流上套接上缓冲流 
       String s=null; 
       for(int i=1;i<=100;i++){ 
        s=String.valueOf(Math.random());//通过随机函数给s赋值 
        bw.write(s);          //将s写入到dat.txt文件中 
        bw.newLine();          //写入一个分行符。缓冲流比较好用的方法就是可以写入或读取一行的数据。 
       } 
       bw.flush();            //使内存中的所有数据立刻写出,不再缓冲。 
       while((s=br.readLine())!=null){  //按行读取文件内容 
        System.out.println(s); 
       } 
       bw.close();            //关闭处理流同时关闭里面的节点流。 
       br.close(); 
       
    } 
    catch(IOException e){ 
       e.printStackTrace(); 
    } 
  } 
} 

转换流:用与字节数据到字符数据之间的转化。InputStreamReader需要和InputStream套接,OutputStreamWriter需要和outputStream套接。
数据流:DataInputStream 和DataOutputStream  提供将基础数据类型写入到文件中,或者读取出来,这个流的用处还是很大的,如果没有这种流的话,有一个long,本身只占8个字节,如果我要写入到文件,需要转成字符串,然后在转成字符数组,那空间会占用很多,但是有了这种流之后就很方便了,直接将这8个字节写到文件就可以了,既节约了内存空间也使程序写起来更加方便简单。但是读取的时候需要注意了,根据读取的数据类型,指针会往下移,所以你读的顺序必须要和写的顺序一致才能完成你正确的需求。否则就相当与把数据拆分了。

import java.io.*; 
public class TestDataStream{ 
   public static void main(String[] args){ 
     ByteArrayOutputStream baos=new ByteArrayOutputStream();  //建一个节点流。 
     DataOutputStream dos=new DataOutputStream(baos);     //在节点流上接一根数据流“管道”                  try{ 
       dos.writeDouble(Math.random());            //double型 ,占8个字节  
       dos.writeBoolean(true);                //boolean型,占一个字节 
       ByteArrayInputStream bais=new ByteArrayInputStream(baos.toByteArray());  
       System.out.println(bais.available());         //输出流中总的可用字节数--9 
       DataInputStream dis=new DataInputStream(bais);    //同样在输出流的外面接上数据流“管道” 
       System.out.println(dis.readDouble());         //直接读出double型的数 
       System.out.println(dis.readBoolean());        //直接读出boolean型 
       dos.close(); 
       dis.close(); 
     }catch(IOException e){ 
       e.printStackTrace(); 
     } 
 
   } 
} 

 
打印流:java.io中专门提供用于打印的流,这类流在写入的时候有自动flush的功能,所以不需要每打印一个东西都flush一次。

import java.io.*; 
public class TestPrintStream1{ 
    public static void main(String[] args){ 
      PrintStream ps=null; 
      try{ 
       FileOutputStream fos=new FileOutputStream("F:\\Java\\IO\\log.dat");//创建输出流,指定输出地点 
       ps=new PrintStream(fos);                      //在流外面包装打印流 
      }catch(IOException e){ 
       e.printStackTrace(); 
      } 
      if(ps!=null){ 
       System.setOut(ps);                         //将系统的打印设置成打印流ps 
      } 
      int ln=0; 
      for(char c=0;c<=60000;c++){ 
        System.out.print(c+" ");                     //不在打印到dos窗口,输出流直接打印到指定文件中 
        if(ln++>=100){ 
           System.out.println();ln=0; 
        } 
      } 
    } 
} 
 类似资料:
  • 本文向大家介绍java8使用Stream API方法总结,包括了java8使用Stream API方法总结的使用技巧和注意事项,需要的朋友参考一下 Stream是java8中处理集合的关键抽象概念,它可以指定您希望对集合进行的操作,可以执行非常复杂的查找、过滤和映射数据等操作。使用Stream API对集合数据进行操作,就类似于使用SQL执行的数据库查询。 Stream 的三个操作步骤 1、创建S

  • 本文向大家介绍Node.js中流(stream)的使用方法示例,包括了Node.js中流(stream)的使用方法示例的使用技巧和注意事项,需要的朋友参考一下 前言 本文主要给大家介绍了关于Node.js 流(stream)的使用方法,分享出来供大家参考学习,下面话不多说,来一起看看详细的介绍: 流是基于事件的API,用于管理和处理数据,而且有不错的效率.借助事件和非阻塞I/O库,流模块允许在其可

  • 本文向大家介绍Java中String.format的使用方法总结,包括了Java中String.format的使用方法总结的使用技巧和注意事项,需要的朋友参考一下 Java中String.format的用法总结 1.对整数进行格式化:%[index$][标识][最小宽度]转换方式         我们可以看到,格式化字符串由4部分组成,其中%[index$]的含义我们上面已经讲过,[最小宽度]的含

  • 本文向大家介绍android使用mysql的方法总结,包括了android使用mysql的方法总结的使用技巧和注意事项,需要的朋友参考一下 android可以使用mysql数据库,android连接数据库的方式有两种。 第一种是通过连接服务器,再由服务器读取数据库来实现数据的增删改查,这也是我们常用的方式。 第二种方式是android直接连接数据库,这种方式非常耗手机内存,而且容易被反编译造成安全

  • 本文向大家介绍javascript Promise简单学习使用方法小结,包括了javascript Promise简单学习使用方法小结的使用技巧和注意事项,需要的朋友参考一下 解决回调函数嵌套太深,并行逻辑必须串行执行,一个Promise代表一个异步操作的最终结果,跟Promise交互的主要方式是通过他的then()方法来注册回调函数,去接收Promise的最终结果值 Promise相关的协议有P

  • 令牌名称:mytoken Auth URL:localhost:8080/admin/oauth 访问令牌URL:localhost:8080/admin/oauth/Token

  • 本文向大家介绍简单总结Java的反射机制的运用,包括了简单总结Java的反射机制的运用的使用技巧和注意事项,需要的朋友参考一下 Java 的反射机制是使其具有动态特性的非常关键的一种机制,也是在JavaBean 中广泛应用的一种特性。 简单来说,一个类或者一个对象是拥有下面几种属性的: Method,Constructor,Field,其大致结构类图如下: 我们现在用代码来说明问题: 首先,我们看

  • 本文向大家介绍Android 布局中的android:onClick的使用方法总结,包括了Android 布局中的android:onClick的使用方法总结的使用技巧和注意事项,需要的朋友参考一下 Android 布局中的android:onClick的使用方法总结 Android布局中的 android:onClick=“...”属性设置点击时从上下文中调用指定的方法。该属性值和要调用的方法名