IO流之字节流
IO流分类
按数据流向分:
1.输入流 Reader
![在这里插入图片描述](https://img-blog.csdnimg.cn/20181219183139602.png)
2.输出流 Writer
![在这里插入图片描述](https://img-blog.csdnimg.cn/20181219183219933.png)
按数据操作单位分:
1.字节流 InputStream
2.字符流 OutputStream
主要学习read(读)和write(写)的方法
常见用途
(1)记事本的保存功能
(2)开发中的日志功能
。。。。。。
字节流——InputStream&OutputStream
(1)文件输入流(FileInputStream)
构造方法:
FileInputStream(File file) // 表示从file指向的文件中读取
FileInputStream(String name) // name表示文件的路径名(路径+文件名)
读取方法:
int read()
调用一次读到一个数据字节,返回的int值就是读到的数据
如果已到达文件末尾,则返回 -1
int read(byte[] b)
调用一次本方法表示可以读取多个数据
读到的内容保存传入的byte数组b中
返回的是本次调用方法读到的数据字节个数
思考? b数组是有长度,干嘛还要单独返回读到的个数呢?
int read(byte[] b, int off, int len)
和上面的第二个类似,可以指定从b数组什么位置开始装
Code:
读取单个字节
FileInputStream fis = new FileInputStream("C:/test.txt");
int read = fis.read();
System.out.println((char)read);
使用循环读取整个文件内容
int n;
while ((n = fis.read()) != -1) {
System.out.println((char)n);
}
使用一次读取一个数组的方式
int i ; //-1表示已经结束
byte[] byt = new byte[1024*2];
while ((i = fis.read(byt)) != -1) {
展示读到的数据很麻烦,便利byte数组一个一个的强转
其实,可以直接以byte数组为参数来new一个字符串String (String中有对应的构造方法)
System.out.println(new String(byt,0,i));
}
(2)文件输出流(FileOutputStream)
构造方法:
FileOutputStream(File file)
FileOutputStream(String name)
下面的两个构造方法,可以设置是否向文件中追加数据
FileOutputStream(File file, boolean append)
FileOutputStream(String name, boolean append)
写入方法:
void write(int b) //调用一次写入一个数据字节
void write(byte[] b) //调用一次,可以把一个byte数组中的数据写入
void write(byte[] b, int off, int len) //调用一次,把b数组中的一部分数据写入
注意:
1.文件不存在会自己创建文件并写入
2.如果路径不存在会报错
3.只有文件可以读写,数据也只有写入文件(文件夹不行)
4.当写入与文件一致的字符编码时,得到相应的字符
5.磁盘已经存在抽象路径时,并且是文件夹,就不能创建,并且拒绝方法
Code:
写入单个字节
OutputStream fos = new FileOutputStream("C:/test.txt");
fos.write(97); 写入一个字节
写入一个字符串
fos.write("1wdsads".getBytes());
读写乱码问题
1.乱码原因
(1)解码与编码规则不一致
(2)字符编码不支持中文
一个中文是不是一个数据字节,有可能是两个,也可能是三个,具体是几个看字符编码, read() 一次读到的是一个数据字节,所以解码时会乱码
编码 : String —> byte[]
String中有对应的方法:
byte[] getBytes() 使用平台的默认字符集将此 String 编码为 byte 序列
byte[] getBytes(Charset charset) 使用指定的字符编码来编码字符串
byte[] getBytes(String charsetName) 使用指定的字符编码来编码字符串
解码 : byte[] —> String
String中有对应的构造方法:
String(byte[] bytes) 通过使用平台的默认字符集解码指定的 byte 数组
String(byte[] bytes, Charset charset) 使用指定的字符集来解码指定的byte数组
String(byte[] bytes, String charsetName) 使用指定的字符集来解码指定的byte数组