【Java笔记分享】数据流 & 标准输出流

笔记源代码地址:B站 库米豪斯巴达锅铲祖师 空间

IDEA官方已经成功帮助我修好了IDEA耶

标准输出流

其中一个标准输出流是我们从刚见到Java开始到现在一直在使用的流:System.out,类型是PrintStream

标准输出流专门为输出而生,在输出方面没有比标准输出流更方便的了。原因主要有两点:

  • 标准输出流提供了它们专有的printprintln方法,能够将任何类型的数据转换成字符串输出,在输出字符方面功能强大
  • 标准输出流不需要关流,操作方便

除此之外,还需要知道,System.out的指向是可以改变的。可以用System.setOut()方法,传入一个PrintStream,就可以将out赋值,out就会指向你告诉它的文件

没啥好讲的,会用System.out.println()就差不多会用标准输出流了

数据专用流

这两个流的使用有点困难,不是操作上的困难,而是。。。当你代码写多了翻不到的时候,它可能很考验你的记忆力

是这样啊,数据专用流可以读取或写入Java的8种数据类型加上一个String,共9种数据类型,完全是记录数据用的,适合记在那种打不开的文件里

数据流的read和write方法是没有用的,它们将这两个方法细分为11个方法(8 + 3),分别对应8种数据类型与String

数据流从文件中读写,所以数据流作为包装流使用,一般需要包FileInputStream或FileOutputSteam

一般使用时,我们会先用输出流将数据记录在文件中。这里我们按序记录一组数据

try (var dos = new DataOutputStream(new FileOutputStream(pathOut))) {
    dos.writeBoolean(true);
    dos.writeByte(28);
    dos.writeChar('a');
    dos.writeDouble(3.14);
    dos.writeFloat(1.57f);
    dos.writeInt(2147483647);
    dos.writeShort(2018);
    dos.writeLong(31415926535L);

    dos.flush();
} catch (IOException e) {
    e.printStackTrace();
}

(其中写入byte,char,short的方法的参数都是int,写的时候超范围不会报错,而读的时候会发生一些偏差)

文件里就出现了一堆我们看不懂的字符,但是如果用DataInputStream按顺序读取的话,我们可以原样获取这些数据。可以将代码复制下来测试

try (var dis = new DataInputStream(new FileInputStream(pathOut))) {
    boolean data1 = dis.readBoolean();
    byte data2 = dis.readByte();
    char data3 = dis.readChar();
    double data4 = dis.readDouble();
    float data5 = dis.readFloat();
    int data6 = dis.readInt();
    short data7 = dis.readShort();
    long data8 = dis.readLong();
} catch (IOException e) {
    e.printStackTrace();
}

将这些数据输出后,你会发现,与我们输入的数据是相同的

然而,别忘了这个还能操作String,而对于String的操作,JDK提供了3个方法,其read或write后面跟的分别是:BytesCharsUTF

后缀为Bytes的方法输出方式取决于你的系统默认编码,写入时没有影响,而读取时会根据这一默认编码组装字符串

后缀Chars的方法输出和输入障碍都不大,按照Java原来的样子把一个或两个字节拼成一个字符

后缀UTF的方法其实是按照UTF-8编码输出和输入,其中字母占一个字节,汉字在utf-8中占3个字节。这个方法能够保证输入和输出字符编码相同,读错概率小

finally——

这俩。。太少了,再加上一个对象流又太多

还有一篇,现学的,错误可能很多

java
91 views
Comments
登录后评论
Sign In
·

虽然我不知道我的想法对不对,但是“能够将任何类型的数据转换成字符串输出”也太绝对了,我自定义一个类型不实现toString()那它也不能打印出我想要的结果啊,无非是调用了String.valueOf()怎么能叫它转换的