JAVA IO流 字节流 字符流 缓冲流的注意点和效率
总结:
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]。
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
如何选择开源的机器学习框架?
开源是创新和科技快速发展的核心。在此,我们将讨论如何针对不同的用例选取开源的机器学习工具。尽管机器学习还处于早期发展阶段,但从医疗、安全到个性化营销,这种潜在的价值使得公司将机器学习作为一种机会。 为什么要选择机器学习框架呢? 使用开源工具的好处不仅仅在于其可用性。通常来说,如此级别的项目均有大量的数据工程师和数据科学家愿意去分享数据集和前期训练模型。比如,你可以使用分类模型训练来自于ImageNet的数据,而非利用scratch建立图形感知。开源的机器学习工具还能够让你进行迁移学习,这意味着可以通过运用其他方面的知识解决机器学习的问题。所以,你可以把一些能力形成一种模型,这些模型可以学会识别汽车或者能够帮助我们完成其他的任务。 根据你所需要处理的问题,预先训练的模型和开放的数据集可能并不会像定制的那样准确,但开源框架不需要你收集数据集
- 下一篇
Thread源码剖析
前言 昨天已经写了: 多线程三分钟就可以入个门了! 如果没看的同学建议先去阅读一遍哦~ 在写文章之前通读了一遍《Java 核心技术 卷一》的并发章节和《Java并发编程实战》前面的部分,回顾了一下以前写过的笔记。从今天开始进入多线程的知识点咯~ 我其实也是相当于从零开始学多线程的,如果文章有错的地方还请大家多多包含,不吝在评论区下指正呢~~ 一、Thread线程类API 声明本文使用的是JDK1.8 实现多线程从本质上都是由Thread类来进行操作的~我们来看看Thread类一些重要的知识点。Thread这个类很大,不可能整个把它看下来,只能看一些常见的、重要的方法。 顶部注释的我们已经解析过了,如果不知道的同学可前往:多线程三分钟就可以入个门了! 1.1设置线程名 我们在使用多线程的时候,想要查看线程名是很简单的,调用Thread.currentThread().getName()即可。 如果没有做什么的设置,我们会发现线程的名字是这样子的:主线程叫做main,其他线程是Thread-x 下面我就带着大家来看看它是怎么命名的: nextThreadNum()的方法实现是这样的: 基于...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS关闭SELinux安全模块
- 设置Eclipse缩进为4个空格,增强代码规范
- Docker快速安装Oracle11G,搭建oracle11g学习环境
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS7,8上快速安装Gitea,搭建Git服务器
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题