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]。

目录
相关文章
|
12天前
|
Java Unix Windows
|
1天前
|
存储 缓存 Java
Java IO 流详解
Java IO 流详解
9 1
|
5天前
|
存储 Java
Java的`java.io`包包含多种输入输出类
Java的`java.io`包包含多种输入输出类。此示例展示如何使用`FileInputStream`从`input.txt`读取数据。首先创建`FileInputStream`对象,接着分配一个`byte`数组存储流中的数据。通过`read()`方法读取数据,然后将字节数组转换为字符串打印。最后关闭输入流释放资源。`InputStream`是抽象类,此处使用其子类`FileInputStream`。其他子类如`ByteArrayInputStream`、`ObjectInputStream`和`BufferedInputStream`各有特定用途。
15 1
|
6天前
|
存储 Java
java IO接口(Input)用法
【5月更文挑战第1天】Java的`java.io`包包含多种输入输出类。此示例展示了如何使用`FileInputStream`从`input.txt`读取数据。首先创建`FileInputStream`对象,接着创建一个字节数组存储读取的数据,调用`read()`方法将文件内容填充至数组。然后将字节数组转换为字符串并打印,最后关闭输入流。注意,`InputStream`是抽象类,此处使用其子类`FileInputStream`。其他子类如`ByteArrayInputStream`、`ObjectInputStream`和`BufferedInputStream`各有特定用途。
18 2
|
8天前
|
存储 Java Linux
【Java EE】 文件IO的使用以及流操作
【Java EE】 文件IO的使用以及流操作
|
13天前
|
存储 Java 数据库
[Java 基础面试题] IO相关
[Java 基础面试题] IO相关
|
13天前
|
缓存 Java API
Java NIO和IO之间的区别
NIO(New IO),这个库是在JDK1.4中才引入的。NIO和IO有相同的作用和目的,但实现方式不同,NIO主要用到的是块,所以NIO的效率要比IO高很多。在Java API中提供了两套NIO,一套是针对标准输入输出NIO,另一套就是网络编程NIO。
15 1
|
16天前
|
Java
Java基础教程(12)-Java中的IO流
【4月更文挑战第12天】Java IO涉及输入输出,包括从外部读取数据到内存(如文件、网络)和从内存输出到外部。流是信息传输的抽象,分为字节流和字符流。字节流处理二进制数据,如InputStream和OutputStream,而字符流处理Unicode字符,如Reader和Writer。File对象用于文件和目录操作,Path对象简化了路径处理。ZipInputStream和ZipOutputStream则用于读写zip文件。
|
22天前
|
存储 缓存 Java
【Java IO系列】那字节流和字符流有什么区别?
而如果使用缓存流,一次性从文件里读取多个字节到缓存中,可以减少系统调用同时也减少了磁盘读取,提高了读取的效率。所以字符流是一个很方便的流了,没有必要把一个方便的流转换成一个不方便的流。,涉及到用户空间和内核空间之间的上下文切换,这些切换是很昂贵的。从输入流读取下一个数据字节,值字节以0到255范围内的。好的面试官,Java IO有两个参与对象,一个是。,这个基类提供了3个方法可以来读取字节流。,同样是提供了3个方法来支持字符流读取。好的,有这些不同之处,主要是3个方面。是这样的,虽然字节流比字符流的。
18 0
【Java IO系列】那字节流和字符流有什么区别?
|
29天前
|
存储 缓存 安全
Java 中 IO 流、File文件
Java 中 IO 流、File文件