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

目录
相关文章
|
4天前
|
Java Unix Windows
|
4天前
|
监控 Java
Java一分钟之-NIO:非阻塞IO操作
【5月更文挑战第14天】Java的NIO(New IO)解决了传统BIO在高并发下的低效问题,通过非阻塞方式提高性能。NIO涉及复杂的选择器和缓冲区管理,易出现线程、内存和中断处理的误区。要避免这些问题,可以使用如Netty的NIO库,谨慎设计并发策略,并建立标准异常处理。示例展示了简单NIO服务器,接收连接并发送欢迎消息。理解NIO工作原理和最佳实践,有助于构建高效网络应用。
8 2
|
4天前
|
存储 安全 Java
Java一分钟:缓冲流提升读写效率
【5月更文挑战第11天】Java I/O的缓冲流通过内存缓冲区提升读写性能,实现批量处理和预读写。注意避免缓冲区溢出、忘记刷新和关闭以及数据同步问题。示例展示了字节和字符缓冲流在文件复制中的应用,降低磁盘I/O次数,提高效率。熟练掌握缓冲流使用有助于优化Java程序的I/O性能。
46 2
|
4天前
|
Java
java一分钟之-字符流与字节流的区别
【5月更文挑战第11天】Java的输入输出通过流操作,分为字符流和字节流。字节流处理二进制数据,如图片、音频,基类是`InputStream`和`OutputStream`;字符流处理文本,基类是`Reader`和`Writer`。字符流涉及编码转换,字节流不涉及。易错点包括乱码(需指定编码)、混用流类型和忘记关闭流。示例展示了字节流和字符流读文件。理解区别并注意编码和资源管理可提高代码质量。
36 3
|
4天前
|
Java 开发者
Java一分钟之-Java IO流:文件读写基础
【5月更文挑战第10天】本文介绍了Java IO流在文件读写中的应用,包括`FileInputStream`和`FileOutputStream`用于字节流操作,`BufferedReader`和`PrintWriter`用于字符流。通过代码示例展示了如何读取和写入文件,强调了常见问题如未关闭流、文件路径、编码、权限和异常处理,并提供了追加写入与读取的示例。理解这些基础知识和注意事项能帮助开发者编写更可靠的程序。
17 0
|
4天前
|
存储 缓存 Java
Java IO 流详解
Java IO 流详解
18 1
|
4天前
|
存储 Java
Java的`java.io`包包含多种输入输出类
【5月更文挑战第2天】Java的`java.io`包包含多种输入输出类。此示例展示如何使用`FileInputStream`从`input.txt`读取数据。首先创建`FileInputStream`对象,接着分配一个`byte`数组存储流中的数据。通过`read()`方法读取数据,然后将字节数组转换为字符串打印。最后关闭输入流释放资源。`InputStream`是抽象类,此处使用其子类`FileInputStream`。其他子类如`ByteArrayInputStream`、`ObjectInputStream`和`BufferedInputStream`各有特定用途。
41 1
|
4天前
|
存储 Java
java IO接口(Input)用法
【5月更文挑战第1天】Java的`java.io`包包含多种输入输出类。此示例展示了如何使用`FileInputStream`从`input.txt`读取数据。首先创建`FileInputStream`对象,接着创建一个字节数组存储读取的数据,调用`read()`方法将文件内容填充至数组。然后将字节数组转换为字符串并打印,最后关闭输入流。注意,`InputStream`是抽象类,此处使用其子类`FileInputStream`。其他子类如`ByteArrayInputStream`、`ObjectInputStream`和`BufferedInputStream`各有特定用途。
22 2
|
4天前
|
存储 Java Linux
【Java EE】 文件IO的使用以及流操作
【Java EE】 文件IO的使用以及流操作
|
4天前
|
存储 Java 数据库
[Java 基础面试题] IO相关
[Java 基础面试题] IO相关