IO流:System.in、SequenceInputStream合并流、内存输入输出流、数据流

1、System.in
   System.out 是常用的在控制台输出数据的 
   System.in 可以从控制台输入数据
   
   InputStream is = System.in
   while (true) {
      // 敲入a,然后敲回车可以看到
      // 97 13 10
      // 97是a的ASCII码
      // 13 10分别对应回车换行
      int i = is.read();
      System.out.println(i);
  
   字节输入流转化为字符输入流:
   InputStream is =System.in;
   InputStreamReader isr = new InputStreamReader(is);
   BufferedReader br = new BufferedReader(isr);

2、SequenceInputStream合并流

SequenceInputStream(Enumeration<? extends InputStream> e) //整合多个输入流
   SequenceInputStream(InputStream s1, InputStream s2) //整合2个输入流

整合2个输入流

public class Test03 {

public static void main(String[] args) throws IOException {
        FileInputStream fis01 = new FileInputStream("d:\\text\\st01.txt");
        FileInputStream fis02 = new FileInputStream("d:\\text\\st02.txt");
        FileInputStream fis03 = new FileInputStream("d:\\text\\st03.txt");

//SequenceInputStream合并流,将与之相连接的流集组合成一个输入流,并从第一个输入流开始读取
        SequenceInputStream sis = new SequenceInputStream(fis01, fis02);

BufferedInputStream bis = new BufferedInputStream(sis);
        byte[] b = new byte[1024];
        int n = 0;
        while((n = bis.read(b))!=-1) {
            String s = new String (b,0,n);
            System.out.println(s);
        }
    }
   }

整合多个输入流
   
   public class Test03 {

public static void main(String[] args) throws IOException {
        FileInputStream fis01 = new FileInputStream("d:\\text\\st01.txt");
        FileInputStream fis02 = new FileInputStream("d:\\text\\st02.txt");
        FileInputStream fis03 = new FileInputStream("d:\\text\\st03.txt");
        
        Vector<InputStream> vt = new Vector<InputStream>();
        vt.add(fis03);vt.add(fis02);vt.add(fis01);
        //通过vector的elements方法,得到关于多个流的枚举
        Enumeration<InputStream> en = vt.elements();

SequenceInputStream sis = new SequenceInputStream(en);

BufferedInputStream bis = new BufferedInputStream(sis);
        byte[] b = new byte[1024];
        int n = 0;
        while((n = bis.read(b))!=-1) {
            String s = new String (b,0,n);
            System.out.println(s);
        }
    }
   }

3、内存输出流ByteArrayOutputStream、内存输入流ByteArrayInputStream

①ByteArrayInputStream:

包含一个内部缓冲区,其中包含可以从流中读取的字节,内部计数器跟踪由read方法提供的下一个字节
   关闭一个ByteArrayInputStream没有任何效果,该流中的方法可以在流关闭后调用,而不生成IOException 
   意思就是说,比如文件流的处理对象的外存中的文件,而它的处理对象是内存中的缓冲区。它是从一个内存读到另一个内存方式。

构造方法:
   ByteArrayInputStream(byte[] buf);
  创建一个ByteArrayInputStream实例,使用字节数组buf作为其缓冲区数组。

  ByteArrayInputStream(byte[] buf,int offset,int length);
  创建一个ByteArrayInputStream实例,使用字节数组buf从offset开始的len个字节作为其缓冲区数组。

主要方法:
  - int available(): 输入流中可读取的字节个数
  - void close(): 关闭此输入流并释放与该流有关的系统资源.
  - void mark(int readlimit): 在此输入流中标记当前的位置.
  - boolean markSupported(): 检测此输入流是否支持mark和reset.
  - int read(): 从输入流中读取下一个字节数据.
  - int read(byte[] b,int off,int len): 从输入流中读取len个字节,并将其存储在字节数组b中off位置开始的地方
  - void reset(): 将此流重新定位到最后一次对此输入流调用mark方法时的位置.
  - long skip(long n): 跳过和丢弃此输入流中n个字节的数据.

②ByteArrayOutputStream :
   
   现了一个输出流,其中的数据被写入一个byte数组。缓冲区会随着数据的不断写入而自动增长。
   缓冲区会随着数据的不断写入而自动增长。可以使用toByteArray()和toString()方法来获取数据
   关闭ByteArrayOutputStream无效,此类中的方法在关闭此流后仍可被调用,而不会产生IOException
   
   构造方法:
  ByteArrayOutputStream(): 创建一个新的byte数组输出流。

  ByteArrayOutputStream(int size): 创建一个新的byte数组输出流,它具有指定大小的缓冲区容量(以字节为单位)。

主要方法:
  - void close(): 无效
  - void reset(): 
  - int size(): 返回缓冲区的当前大小/返回输出流中字节个数
  - byte[] toByteArray(): 将输出流中的字节数据以字节数组的形式返回
  - String toString():将输出流中的字节数据转换成字符串
  - String toString(String charsetName):
  - void write(byte[] b,int off,int len):将指定的字节数组b 从off位置开始的len个字节 写入到此输出流中
  - void write(int b):将指定的数据,写入到此输出流中(b = 97,则存入‘a’)
  - void writeTo(OutputStream out):将此 byte 数组输出流的 count(缓冲区中的有效字节数) 字段重置为零,从而丢弃输出流中目前已累积的所有输出

public class Test01 {

public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("d:\\test\\test01.txt");
        ByteArrayOutputStream bos = new ByteArrayOutputStream();
        int n = 0;
        while((n = fis.read())!=-1) {
            bos.write(n);
        }

String s = bos.toString();
        System.out.println(s);

ByteArrayInputStream bis = new ByteArrayInputStream(bos.toByteArray());
        byte [] b = new byte[1024];
        n = 0;
        while((n = bis.read(b))!=-1) {
            String ss = new String(b,0,n);
            System.out.println(ss);
        }
    }
   }

4、数据流
   
   DataInputStream 数据输入流 
   DataOutputStream 数据输出流

DataOutputStream 在写出的时候会做一些特殊标记,只有DataInputStream 才能成功的读取
   所以DataInputStream 读取一个文件,这个文件必须是由DataOutputStream 写出的,否则会出现EOFException

DataInputStream 与 DataOutputStream 分别继承自 InputStream、OutputStream, 它属于处理流,需要分别套接在 InputStream、OutputStream 类型的节点流上面
   DataOutputStream则能够直接将JAVA基本类型和String类型数据写入到其他的字节输入流。
   DataInputStream能以一种与机器无关(当前操作系统等)的方式,直接从地从字节输入流读取JAVA基本类型和String类型的数据
   读取数据的时候要按照写入的数据类型的顺序读取

DataOutputStream方法:
   void flush()  清空此数据输出流。
   int size()  返回计数器 written 的当前值,即到目前为止写入此数据输出流的字节数。
   void write(byte[] b, int off, int len)  将指定 byte 数组中从偏移量 off 开始的 len 个字节写入基础输出流。
   void write(int b)  将指定字节(参数 b 的八个低位)写入基础输出流。
   void writeBoolean(boolean v)  将一个 boolean 值以 1-byte 值形式写入基础输出流。
   void writeByte(int v)  将一个 byte 值以 1-byte 值形式写出到基础输出流中。
   void writeBytes(String s)  将字符串按字节顺序写出到基础输出流中。
   void writeChar(int v)  将一个 char 值以 2-byte 值形式写入基础输出流中,先写入高字节。
   void writeChars(String s)  将字符串按字符顺序写入基础输出流。
   void writeDouble(double v)  使用 Double 类中的 doubleToLongBits 方法将 double 参数转换为一个 long 值,然后将该 long 值以 8-byte 值形式写入基础输出流中,先写入高字节。
   void writeFloat(float v)  使用 Float 类中的 floatToIntBits 方法将 float 参数转换为一个 int 值,然后将该 int 值以 4-byte 值形式写入基础输出流中,先写入高字节。
   void writeInt(int v)  将一个 int 值以 4-byte 值形式写入基础输出流中,先写入高字节。
   void writeLong(long v)  将一个 long 值以 8-byte 值形式写入基础输出流中,先写入高字节。
   void writeShort(int v)  将一个 short 值以 2-byte 值形式写入基础输出流中,先写入高字节。
   void writeUTF(String str)  以与机器无关方式使用 UTF-8 修改版编码将一个字符串写入基础输出流。

public class TestStream {
      
    public static void main(String[] args) {
        write();
        read();
    }
 
    private static void read() {
        File f =new File("d:/lol.txt");
        try (
                FileInputStream fis  = new FileInputStream(f);
                DataInputStream dis =new DataInputStream(fis);
        ){
            boolean b= dis.readBoolean();
            int i = dis.readInt();
            String str = dis.readUTF();
             
            System.out.println("读取到布尔值:"+b);
            System.out.println("读取到整数:"+i);
            System.out.println("读取到字符串:"+str);
 
        } catch (IOException e) {
            e.printStackTrace();
        }
         
    }
 
    private static void write() {
        File f =new File("d:/lol.txt");
        try (
                FileOutputStream fos  = new FileOutputStream(f);
                DataOutputStream dos =new DataOutputStream(fos);
        ){
            dos.writeBoolean(true);
            dos.writeInt(300);
            dos.writeUTF("123 this is gareen");
        } catch (IOException e) {
            e.printStackTrace();
        }
         
    }
   }

原文地址:https://www.cnblogs.com/snzd9958/p/9594086.html

时间: 2024-11-06 17:25:36

IO流:System.in、SequenceInputStream合并流、内存输入输出流、数据流的相关文章

字符流;字节流;带缓冲的输入输出流;以及用scanner读文件

概念: InputStream类是字节输入流的抽象类,是所有字节输入流的父类. OutputStream类是字节输入流的抽象类,是所有字节输出流的父类. In(可以理解为读)Out(可以理解为写) 一.字节流的读与写 FileInputStream类与FileOutStream类都是用来操作磁盘文件的. 1. FileInputStream(String name); 填String类型的路径名 FileInputStream(File file); 填入File对象 2. FileOutStr

Java API —— IO流(数据操作流 &amp; 内存操作流 &amp; 打印流 &amp; 标准输入输出流 &amp; 随机访问流 &amp; 合并流 &amp; 序列化流 &amp; Properties &amp; NIO)

1.操作基本数据类型的流 1) 操作基本数据类型 · DataInputStream:数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型.应用程序可以使用数据输出流写入稍后由数据输入流读取的数据. · DataOutputStream:数据输出流允许应用程序以适当方式将基本 Java 数据类型写入输出流中.然后,应用程序可以使用数据输入流将数据读入. package datastreamdemos; import java.io.*; /** * Created b

Java基础---IO(二)--File类、Properties类、打印流、序列流(合并流)

第一讲     File类 一.概述 1.File类:文件和目录路径名的抽象表现形式 2.特点: 1)用来将文件或文件夹封装成对象 2)方便于对文件与文件夹的属性信息进行操作 3)File类的实例是不可变的:也就是说,一旦创建,File 对象表示的抽象路径名将永不改变 4)File对象可以作为参数传递给流的构造函数 二.File对象创建 方式一: File f =new File("a.txt"); 将a.txt封装成File对象.可以将已有的和未出现的文件或者文件夹封装成对象. 方式

Java基础系列10:内存操作流,管道流,合并流,压缩流以及回退流

前言:这篇文章将对几个"非主流"的IO流进行简单的介绍 一 内存操作流 内存操作流的主要作用是完成内存的输入和输出.比如说在某些情况下需要生成一些临时信息,而将这些临时信息保存在文件中不仅要进行文件的读写而且在功能完成之后还需要删除这个临时文件,因此比较麻烦,这时或许就需要用到内存操作流了. 需要用到的API是:ByteArrayInputStream和ByteArrayOutputStream,分别表示输入流和输出流,示例代码如下: package javase.io; import

java基础8(io流3)

1.LineNumberReader: public int getLineNumber():获取行号 public void setLineNumber(int lineNumber):设置起始行号 String readLine():读取一行 2.操作基本数据类型的流 DataInputStream:读数据 DataOutputStream:写数据 作用:可以操作基本类型的流对象,其读写顺序必须一致,否则数据有问题. public static void main(String[] args

Java IO流详解

初学java,一直搞不懂java里面的io关系,在网上找了很多大多都是给个结构图草草描述也看的不是很懂.而且没有结合到java7 的最新技术,所以自己来整理一下,有错的话请指正,也希望大家提出宝贵意见. 首先看个图:(如果你也是初学者,我相信你看了真个人都不好了,想想java设计者真是煞费苦心啊!) 这是java io 比较基本的一些处理流,除此之外我们还会提到一些比较深入的基于io的处理类,比如console类,SteamTokenzier,Externalizable接口,Serializa

关于JAVA IO流的学习

初学Java,一直搞不懂java里面的io关系,在网上找了很多大多都是给个结构图草草描述也看的不是很懂.而且没有结合到java7 的最新技术,所以自己来整理一下,有错的话请指正,也希望大家提出宝贵意见. 首先看个图:(如果你也是初学者,我相信你看了真个人都不好了,想想java设计者真是煞费苦心啊!) 这是java io 比较基本的一些处理流,除此之外我们还会提到一些比较深入的基于io的处理类,比如console类,SteamTokenzier,Externalizable接口,Serializa

IO流 2

File类   用来将文件或者文件夹封装成对象 方便对文件与文件夹的属性信息进行操作 . File对象可以作为参数传递给流的构造函数. 了解File类中的常用方法.   1.概述 //将a.txt封装成File对象 //可以将已有的和未出现的文件或者文件夹封装成对象. //文件路径 File f1 = new File("d:\\FileDemo\\a.txt"); //父目录,文件名 File f2 = new File("d:\\FileDemo\\abc",

java的io流(又一大神之作)

初学java,一直搞不懂java里面的io关系,在网上找了很多大多都是给个结构图草草描述也看的不是很懂.而且没有结合到java7 的最新技术,所以自己来整理一下,有错的话请指正,也希望大家提出宝贵意见. 首先看个图:(如果你也是初学者,我相信你看了真个人都不好了,想想java设计者真是煞费苦心啊!) 这是java io 比较基本的一些处理流,除此之外我们还会提到一些比较深入的基于io的处理类,比如console类,SteamTokenzier,Externalizable接口,Serializa