IO流2
一、IO流简介及分类
1、IO流简介
IO流: 简单理解数据从一个地方流向另外一个地方
2、IO流分类
按照数据流动的方向 分为 输入流和输出流
按照数据流动的单位分为 字节流和字符流
二、四大抽象流(都是抽象类)

1、FileInputStream(是InputStream接口的子类)
①构造方法
FileInputStream(String name); 根据指定的路径名创建字节输入流对象
FileInputStream(File file);
②注意:以上路径不存在,它会直接抛出异常
③read方法
int read(); 读取一个字节,返回的是ASCII值
int read(byte[] bytes); 读取多个字节,它把读取的字节放到bytes数组中,返回值返回的是读取的个数
④注意:以上方法,如果读取完毕之后都会返回-1
⑤完整代码:
FileInputStream fileInputStream = new FileInputStream(name);
byte[] bytes = new byte[10];
StringBuilder sb = new StringBuilder();
while(fileInputStream.read(bytes)!=-1){
sb.append(new String(bytes));
}
从上面这段代码我们可以看出,出现很多重复的字符
解决方式: 读多少,就取多少
new String(bytes,0,len);
改变以上代码
FileInputStream fileInputStream = new FileInputStream(name);
byte[] bytes = new byte[10];
StringBuilder sb = new StringBuilder();
int len;
while((len = fileInputStream.read(bytes))!=-1){
sb.append(new String(bytes,0,len));
}
fileInputStream.close();
以上代码解决了格式不正确问题!!
2、FileOutputStream
构造方法:
FileOutPutStream(String name); 以指定的路径创建字节输出流对象
FileOutPutStream(String name,boolean append); append:表示是否在之前的基础上追加数据
FileOutPutStream(File file);
FileOutPutStream(File file,boolean append);
如果路径不存在,直接报错,如果路径存在,文件自动创建
重要方法:
void write(int num);// 以ASCII进行输出
void write(byte[] bytes); 一次性输出多个字节
void write(byte[] bytes,int offset,int len);
3、FileReader
构造方法:
FileReader(String name); 根据指定的路径名创建字节输入流对象
FileReader(File file);
重要方法:
int read();每次只读取一个字符
int read(char[] chars); 一次读取多个字符
写个完整代码
FileReader f = new FileReader(name);
char[] chars = new char[10];
int len;
StringBuilder sb = new StringBuilder();
while((len = f.read(chars))!=-1){
sb.append(new String(chars,0,len));//只能解决格式问题
}
f.close();
4、FileWriter
FileWriter(String name); 以指定的路径创建字符输出流对象
FileWriter(String name,boolean append); append:表示是否在之前的基础上追加数据
FileWriter(File file);
FileWriter(File file,boolean append);
重要方法:
void write(int num);
void write(char[] chars);
void write(String str);
当它输出数据的时候,它并不是直接输出到磁盘上,它是输出到内存中(缓存中),必 须要通过flush或者close方法,它会把内存里面的数据清空,同步到磁盘里面
flush与close的区别:
flush,清空内存里面的数据同步到磁盘里面,可以继续使用io流
close,在关闭流资源之前,它会先去调用flush的方法,io流一旦关闭之后,就不能继续使用
5、转换流
InputStreamReader(InputStream in);//把字节流转为字符流
OutputStreamWriter(OutputStream o)//把字符流转为字节流
三、乱码问题
为什么以上代码依然会出现中文乱码问题:原因它是把一个字掰成2半了
解决方式: 使用字符流来读取纯文本内容
出现中文乱码的三种情况:
1.编码和解码不一致
2.把一个中文字符掰成2半
3.字符编码集不支持中文 ---》ISO-8859-1 它眼里,所有的字符都是1个字节
编码: 把字符串转为字节数组
解码:把字节数组转为字符串
怎么去正确使用编码和解码呢?
统一都使用UTF-8的编码集, 你编码是以什么字符集编的,就以什么字符集进行解码
GBK--中文---2字节
UTF-8--中文--3个字节
IO流2的更多相关文章
- Java基础之IO流
很长时间都没有更新了,最近在补充JavaSE的一些细节部分 关于IO流的一些总结 首先要介绍的是File类,File类用于对文件和目录的一些操作 1.创建文件CreateNewFile() 2.对文件 ...
- Java中IO流,输入输出流概述与总结
总结的很粗糙,以后时间富裕了好好修改一下. 1:Java语言定义了许多类专门负责各种方式的输入或者输出,这些类都被放在java.io包中.其中, 所有输入流类都是抽象类InputStream(字节输入 ...
- Java:IO流与文件基础
Java:IO流与文件基础 说明: 本章内容将会持续更新,大家可以关注一下并给我提供建议,谢谢啦. 走进流 什么是流 流:从源到目的地的字节的有序序列. 在Java中,可以从其中读取一个字节序列的对象 ...
- java IO流详解
流的概念和作用 学习Java IO,不得不提到的就是JavaIO流. 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...
- IO流总结
IO流的作用:用于设备和设备之间的数据传输. IO流的概念:流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象. IO流的分类: 按照操作数据的类型分为两种: 字节流和字符流. 按 ...
- IO流
流的概念和作用 学习JavaIO,不得不提到的就是JavaIO流. 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特 ...
- Java IO流学习总结
Java流操作有关的类或接口: Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...
- 揭开Java IO流中的flush()的神秘面纱
大家在使用Java IO流中OutputStream.PrintWriter --时,会经常用到它的flush()方法. 与在网络硬件中缓存一样,流还可以在软件中得到缓存,即直接在Java代码中缓存. ...
- java IO流 之 其他流
一.内存操作流(ByteArrayInputStream.ByteArrayOutputStream) (一). public class ByteArrayInputStream extends ...
- java IO流 之 字符流
字符是我们能读懂的一些文字和符号,但在计算机中存储的却是我们看不懂的byte 字节,那这就存在关于字符编码解码的问题.所以在学习Io流的字符流前我们先了解些关于编码问题. 一.字符集与字符编码 1.什 ...
随机推荐
- 从Docker 到Jenkins 到Ansible的部署经验
从Docker 到Jenkins 到Ansible的部署经验 工作中,除了开发功能,还负责系统的部署工作.我从频繁的部署工作中,逐渐找到了一些偷懒的方法.从传统的Java -jar命令启动服务,到通过 ...
- Hbase-site.xml
生产环境基于 HA HDFS 的Hbase 基本优化后配置(无安全版本) hbase.rest.port 60050 hbase.cluster.distributed true hbase.root ...
- ACM-ICPC 2018 沈阳赛区网络预赛 F Fantastic Graph(贪心或有源汇上下界网络流)
https://nanti.jisuanke.com/t/31447 题意 一个二分图,左边N个点,右边M个点,中间K条边,问你是否可以删掉边使得所有点的度数在[L,R]之间 分析 最大流不太会.. ...
- cmake 递归依赖
现在有3个模块:main.service.base,main依赖service的service.h.service依赖base的base.h,怎么写CMakeList.txt避免main直接耦合bas ...
- 《Java》第六周学习总结
本周我学习了第七章和第十章的内容 包括:内部类,匿名类,异常类,断言的使用 File类,文件字节输入输出流,缓冲流,数据流,对象流,scanner的使用扩展还有文件锁等内容令我印象深刻 问题: 在编译 ...
- Python——一个简单的进度条的实现
import math def process_bar(total_work,work_index,length): times = total_work / length # 长度倍数,用来缩放或扩 ...
- python中opencv的安装
1.得到opencv的安装包: 2.把安装包中的cv.py, cv2.pd放到一个文件夹中,并把这个文件夹放到D:\Anaconda2\Lib\site-packages中: 3.添加新的变量,变量名 ...
- Access-Control-Allow-Origin设置跨域
我来自己写一下答案,以给后来的朋友一点思路和建议:1,首先把Access-Control-Allow-Origin设置成*是不妥的,自己的接口服务器不能允许所有人都可以访问.2,具体哪里可以设置Acc ...
- mina statemachine解读(二)
这里主要讲下对外接口暴露的处理. // 创建对外接口对象 TaskWork taskWork = new StateMachineProxyBuilder().setStateContextLooku ...
- gojs常用API-画布定义
持续更新中 基础画布定义API画布初始位置 initialContentAlignment: go.Spot.Center,画布位置,定义后就不能拖动画布了,画布位置交由gojs管理 contentA ...