JAVA IO流 字节流 字符流 缓冲流的注意点和效率

简介: 总结: stringBuilder的tostring返回的是new出来的字符串 如果没有那么返回空字符串而不是null 字符流:缓冲流内部都维护了一个数组 不是缓冲流的只有字符流的writer维护了一个数组...

总结:
stringBuilder的tostring返回的是new出来的字符串 如果没有那么返回空字符串而不是null
字符流:缓冲流内部都维护了一个数组 不是缓冲流的只有字符流的writer维护了一个数组
缓冲流中 只有字符流扩展了方法 reader扩展了readLine write扩展了newLine
但是字节流的话 缓冲流没有扩展方法
字符流读数据都是一个一个读的 而缓冲流内部维护了一个数组 也是一个一个读的
但是 字符流是从硬盘读 缓冲流是从内存读 快
字符流写数据都是写到内存中的数组 然后flush或者满了才写入硬盘
字符流的输入喜欢用缓冲 因为扩展了fileReader的功能 内部还缓冲了一个char数组
比如 readLine 一次读一行 返回的是string 到末尾返回null
字节流 :读入的话 缓冲流就是内部维护了一个数组 然后从里面读入
不是缓冲的话 自定义一个数组 然后读入会比较快

 写入的话 如果是read  缓冲流快 但是如果自定义一个数组传入read的话  那效率还是
     字节流快  因为 缓冲流就是帮我们省略了创建缓冲数组的步骤而已
缓冲流 不管是输出还是输入 都是先将里面的缓冲数组填满或者取完才再添加内容
while里面接受的是字符串就!=null 如果是 一个一个读的话 就是 -1

long j=System.currentTimeMillis();用来检测程序运行时间
字符 读入:操作 时间
缓冲流 readline 4-5 while((a=bufferedReader.readLine())!=null)
缓冲流 read 单个读入 18-25 while((a=bufferedReader.read())!=-1)
字符 read 单个读入 19-21 while((a=fileReader.read())!=-1)
字符 自定义缓冲数组 0-1 while((x=fileReader.read(a))!=-1)

字节:
缓冲流 read 单个读入 17-21 while((a=bufferedInputStream.read())!=-1)
字节 read 单个读入 20-21 while((a=fileInputStream.read())!=-1)
字节 read 自定义缓冲数组 0-1 while((a=fileInputStream.read(x))!=-1)(x是byte类型)

结果就是 自定义数组传入read效率高
如果是操作txt文本 要用字符流
如果是拷贝图片等 要用字节流
提取和写入都是一个字节一个字节的
写入511 提取出来的是211 而不是-1
因为read返回的是无符号的byte类型
缓冲流是没有操作功能的 所以要传入一个流
write的时候写入\r 或者\n没有用 只有写入\r\n才是换行
而且到换行符的时候 实际没有接受到byte

缓冲流close也把里面的流也关闭了
close和flush都可以强制将内存的东西写入硬盘
read()如果是一个一个读取的话 返回的是int 里面装着byte或者char 如果字节流是byte 字符流是char
read(数组) 返回的是接收到的长度
字节流接收到int要显示的话要(char)强制转换
while循环输出的时候判断条件得考虑 如果是read()那么就是-1 如果是read(数组)那么就是null
要追加文件内容的话:
如果目标文件已经存在了,那么默认情况会先情况文件中的数据,然后再写入数据 , 如果需要在原来的基础上追加数据,
需要使用“new FileWriter(File , boolean)”的构造方法,第二参数为true。

FileReader默认的时候是GBK格式 读取
存入的格式都是一个字节一个字节的 如果用getbyte可以存入一个字符串
如果用缓冲字节流 bufferedOutputStream的时候 要最后flush或者close不然 没法传递到硬盘
字符存储是1个字节 汉字是2个字节
UTF-8种汉字由三个字节组成
GBK是2个字节组成
读取的时候如果是字节流的read 一个一个读取的话 会出现乱码 因为汉字是2个字节
而read每次都只是读取一个字节
这个时候可以用字符流 字符流的read返回的是int类型 实际是读取的是char类型
返回的是int int是4个字节 装char2个字节 绰绰有余
我们可以 (char)read 或者 read(char数组)
显示的时候 字符串 可以new String(byte数组,0,length) 也可以char数组
写入的话 字节流 字符串.getBytes() 不建议 字符串编码
有个问题得注意一下:
File file = new File(“D:\c.txt”);
FileOutputStream fileOutputStream = new FileOutputStream(file);
fileOutputStream.write(511);
fileOutputStream.close();
FileInputStream fileInputStream=new FileInputStream(file);
System.out.println(fileInputStream.read());
fileInputStream.close();
返回的值是255而不是-1
int byte都是有符号的类型
存储的时候只保留低8位 所以是把11111111存入
取出的时候 是返回无符号的类型 所以是按照权值来 而不是补码
write(-1)答案也是255
为什么InputStream.read()读取一个byte确返回一个int呢?
java 字节读取流的read方法一次读一个byte但返回int的原因

读取二进制数据按字节读取,每次读一个字节(byte)。

read()的底层是由C++实现的,返回的是unsigned byte,取值范围为[0~255],
在java中没有对应的类型,所以只能用int类型接收,由Java接收得到的就是int[0、255]。

目录
相关文章
|
1月前
|
存储 Java 数据处理
|
1月前
|
Java API
java中IO与NIO有什么不同
java中IO与NIO有什么不同
|
26天前
|
Java 关系型数据库 MySQL
Flink1.18.1和CDC2.4.1 本地没问题 提交任务到服务器 报错java.lang.NoClassDefFoundError: Could not initialize class io.debezium.connector.mysql.MySqlConnectorConfig
【2月更文挑战第33天】Flink1.18.1和CDC2.4.1 本地没问题 提交任务到服务器 报错java.lang.NoClassDefFoundError: Could not initialize class io.debezium.connector.mysql.MySqlConnectorConfig
46 2
|
1月前
|
Java
Java文件字节流
Java文件字节流
12 0
|
1月前
|
Java
Java-.文件字节流docx
Java-.文件字节流docx
16 0
|
1月前
|
Java
|
2月前
|
存储 自然语言处理 Java
java缓冲流、转换流、序列化流、打印流
java缓冲流、转换流、序列化流、打印流介绍
|
2月前
|
Java 数据处理
如何玩转Java IO?
【2月更文挑战第7天】
218 0
如何玩转Java IO?
|
2月前
|
缓存 分布式计算 Java
Java基础深化和提高-------IO流
Java基础深化和提高-------IO流
108 0
|
2月前
|
Java 索引
JAVA零基础小白免费学习教程day16-字节流&字符流(三)
JAVA零基础小白免费学习教程day16-字节流&字符流
44 0