数据输入输出流, 内存操作流 ,打印流, 序列化流, 随机访问流 ,Properties

数据输入输出流的概述和使用

  • 数据输入输出流的概述
    通过API查看
    数据输入和输出流:
    数据输入流: DataInputStream
    数据输出流: DataOutputStream
  • 特点: 可以写基本数据类型,可以读取基本数据类型
public class MyTest {
    public static void main(String[] args) throws IOException {
        //字节流
        //数据输入输出流,此流最大的特点,是能够读写基本数据类型
      // DataInputStream
     //   DataOutputStream
        //writeData();
        //你怎么写的就怎么读取,顺序不要乱
        DataInputStream in = new DataInputStream(new FileInputStream("a.txt"));
        boolean b = in.readBoolean();
        double v = in.readDouble();
        char c = in.readChar();
        int i = in.readInt();
        System.out.println(b);
        System.out.println(v);
        System.out.println(c);
        System.out.println(i);
        
    }
    private static void writeData() throws IOException {
        DataOutputStream out = new DataOutputStream(new FileOutputStream("a.txt"));
        out.writeBoolean(true);
        out.writeDouble(3.14);
        out.writeChar('a');
        out.writeInt(2000);
        out.close();
    }
}

内存操作流的概述和使用

  • 内存操作流的概述
    a:操作字节数组
    ByteArrayOutputStream
    ByteArrayInputStream
    此流关闭无效,所以无需关闭
    b:操作字符数组
    CharArrayWrite
    CharArrayReader
    c:操作字符串
    StringWriter
    StringReader
public class MyTest2 {
    public static void main(String[] args) throws IOException {
        //内存操作流:此流不关联文件,不直接读写文件,就在内存中操作数据
        // ByteArrayOutputStream 此类实现了一个输出流,其中的数据被写入一个 byte 数组。缓冲区会随着数据的不断写入而自动增长。可使用 toByteArray () 和 toString () 获取数据。

        //关闭 ByteArrayOutputStream 无效。此类中的方法在关闭此流后仍可被调用,而不会产生任何 IOException。
        //ByteArrayOutputStream()
        //创建一个新的 byte 数组输出流。
        ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
        outputStream.write("英雄儿女".getBytes());
        outputStream.write("上甘岭".getBytes());
        outputStream.write("歌唱我们美丽的祖国".getBytes());
        //取出这个内存操作流,所维护的缓冲区
        byte[] bytes = outputStream.toByteArray();
        //System.out.println(new String(bytes));
       // System.out.println(outputStream.toString());
        //outputStream.close(); //此流无需关闭
        //ByteArrayInputStream( byte[] buf)
        //创建一个 ByteArrayInputStream,使用 buf 作为其缓冲区数组。
        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
        byte[] bytes1 = new byte[1024];
        int len = byteArrayInputStream.read(bytes1);
        System.out.println(new String(bytes1, 0, len));

    }
}

打印流的概述和特点以及作为Writer的子类使用

  • 打印流的概述
    通过API查看
    字节流打印流
    字符打印流
  • 打印流的特点
    a: 打印流只能操作目的地,不能操作数据源(不能进行读取数据)
    • b: 可以操作任意数据类型的数据 调用print() 方法可以写任意数据类型
    • c: 如果我们启用自动刷新,那么在调用println、printf 或 format 方法中的一个方法的时候,会完成自动刷新
      通过以下构造创建对象 能够启动自动刷新 然后调用println、printf 或 format 方法中的一个方法的时候,会完成自动刷新
      • public PrintWriter(OutputStream out, boolean autoFlush) 启动 自动刷新
        • public PrintWriter(Writer out, boolean autoFlush) 启动自动刷新
    • d: 这个流可以直接对文件进行操作(可以直接操作文件的流: 就是构造方法的参数可以传递文件或者文件路径)

PrintWriter实现自动刷新和换行

  • PrintWriter实现自动刷新和换行
    PrintWriter pw = new PrintWriter(new FileWriter(“printWriter2.txt”) , true) ;
    pw.println(true) ;
    pw.println(100) ;
    pw.println(“中国”) ;

打印流复制文本文件

public class MyTest {
    public static void main(String[] args) throws IOException {
        //将多个文件合成一个文件
        //将多首mp3,合并成一首mp3
        FileInputStream in1 = new FileInputStream("许巍-曾经的你.mp3");
        FileInputStream in2 = new FileInputStream("许巍-蓝莲花.mp3");

        FileOutputStream out = new FileOutputStream("许巍专辑大联唱.mp3");
        ArrayList<FileInputStream> list = new ArrayList<>();
        list.add(in1);
        list.add(in2);
        //遍历集合往出写
        int len = 0;
        byte[] bytes = new byte[1024 * 8];
        for (FileInputStream in3 : list) {
            while ((len = in3.read(bytes)) != -1) {
                out.write(bytes, 0, len);
                out.flush();
            }
            in3.close();
        }

        out.close();
    }
}

标准输入输出流概述和输出语句的本质

  • 标准输入输出流概述
    在System这个类中存在两个静态的成员变量:

    public static final InputStream in: 标准输入流, 对应的设备是键盘

    public static final PrintStream out: 标准输出流 , 对应的设备就是显示器
    System.in的类型是InputStream.
    System.out的类型是PrintStream是OutputStream的孙子类FilterOutputStream 的子类

二种方式实现键盘录入

  • A:Scanner scanner = new Scanner(System.in);
    B:BufferedReader的readLine方法。
    BufferedReader bfr = new BufferedReader(new InputStreamReader(System.in));

随机访问流概述和写出数据

  • 随机访问流概述
    RandomAccessFile概述 最大特点 能读能写
    RandomAccessFile类不属于流,是Object类的子类。但它融合了InputStream和OutputStream的功能。
    支持对随机访问文件的读取和写入。
  • RandomAccessFile的父类是Object , 这个流对象可以用来读取数据也可以用来写数据.可以操作任意数据类型的数据。

序列化流和反序列化流的概述和使用

  • 序列化流的概述
    所谓的序列化:就是把对象通过流的方式存储到文件中.注意:此对象 要重写Serializable 接口才能被序列化
    反序列化:就是把文件中存储的对象以流的方式还原成对象
    序列化流: ObjectOutputStream
    反序列化流: ObjectInputStream
  • 像这样一个接口中如果没有方法,那么这样的接口我们将其称之为标记接口(用来给类打标记的,相当于猪肉身上盖个章)
    一个对象可以被序列化的前提是这个对象对应的类必须实现Serializable接口

如何解决序列化时候的黄色警告线问题

  • 我们的一个类可以被序列化的前提是需要这个类实现Serializable接口,就需要给这个类添加一个标记。
  • 在完成序列化以后,序列化文件中还存在一个标记,然后在进行反序列化的时候,
    会验证这个标记和序列化前的标记是否一致,如果一致就正常进行反序列化,如果不一致就报错了,而我们现在把这个类做了修改,将相当于更改了标记,而导致这两个标记不一致,就报错了。
  • 解决问题: 只要让这个两个标记一致,就不会报错了。

Properties的概述和作为Map集合的使用

  • Properties的概述
    查看API
    Properties 类表示了一个持久的属性集。
    Properties 可保存在流中或从流中加载。
    属性列表中每个键及其对应值都是一个字符串。
    Properties父类是Hashtable

    属于双列集合,这个集合中的键和值都是字符串 Properties不能指定泛型。

Properties的特殊功能使用

  • Properties的特殊功能
    public Object setProperty(String key,String value)
    public String getProperty(String key)
    public Set stringPropertyNames()

Properties的load()和store()功能

  • Properties的load()和store()功能
    Properties和IO流进行配合使用:

    • public void load(Reader reader): 读取键值对数据把数据存储到Properties中。

    public void store(Writer writer, String comments)把Properties集合中的键值对数据写入到文件中, comments注释。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值