io流的学习

目录

io流

FileOutputStream

字节输出流的细节:

FileOutputStream写数据的方式

FilelnputStream

FilelnputStream书写细节

FilelnputStream读取方式

计算机的存储规则

ASCll规则(英文)

GBK(汉字)

 Unicode字符集的UTF-8编码格式

java中的编码和解码方式

 字符流

 FileReader

read()的使用细节

FileWriter

FileWriter构造方法

 FileWriter成员方法

 FileWriter书写细节

字节缓冲流

字符缓冲流

字符缓冲流特有方法

转换流

序列化流

反序列化流


io流

用于读写文件中的数据(可以读写文件,或网络中的数据..)

io流的分类可以分为输入流和输出流

注意:字节流读取文件的时候,文件中不要有中文

1.什么是IO流?

存储和读取数据的解决方案
l: input   O: output
流:像水流一样传输数据

2.I0流的作用?

用于读写数据(本地文件,网络)

3.10流按照流向可以分类哪两种流?

输出流:程序 -->文件

输入流:文件 -->程序

4.io流按照操作文件的类型可以分类哪两种流?

字节流:可以操作所有类型的文件

字符流:只能操作纯文本文件

5.什么是纯文本文件?

用windows系统自带的记事本打开并且能读懂的文件

txt文件,md文件,xml文件,lrc文件等

FileOutputStream

操作本地文件的字节输出流,可以把程序中的数据写到本地文件中。

书写步骤:
① 创建字节输出流对象
② 写数据
③ 释放资源

FileOutputStream样例:

//1.创建对象
//号出输出流 0utputstream
//本地文件
File
File0utputStream fos = new File0utputstream("myio\\a.txt");
//2.写出数据
fos.write(97);
//3.释放资源
fos.close();

字节输出流的细节:

1.创建字节输出流对象

细节1:参数是字符串表示的路径或者是File对象都是可以的

细节2:如果文件不存在会创建一个新的文件,但是要保证父级路径是存在的。

细节3:如果文件已经存在,则会清空文件

2.写数据

细节:write方法的参数是整数,但是实际上写到本地文件中的是整数在ASCII上对应的字符

3.释放资源

每次使用完流之后都要释放资源

4.续写

如果想要续写,打开续写开关即可,开关位置:创建对象的第二个参数
默认false:表示关闭续写,此时创建对象会清空文件
手动传递true:表示打开续写,此时创建对象不会清空文件

File0utputStream fos = new File0utputstream( name: "myio\\a.txt",true);

FileOutputStream写数据的方式

FilelnputStream

操作本地文件的字节输入流,可以把本地文件中的数据读取到程序中来,

书写步骤:
创建字节输入流对象
读数据
程序
释放资源

 FileInputStream样例:

//1.创建对象
FileInputStream fis = new FileInputstream("myiolla.txt")
//2.读取数据
int bl = fis.read();
System.out.println((char)b1);
int b2 = fis.read();
System.out.println((char)b2);
int b3 = fis.read();
System.out.println((char)b3);
int b4 = fis.read();
System.out.println((char)b4);
int b5 = fis.read();
System.out.println((char)b5);
int b6 = fis.read();
System.out.println(b6);//-1
//3.释放资源
fis.close();

FilelnputStream书写细节

1.创建字节输入流对象

细节1:如果文件不存在,就直接报错。

2.读取数据

细节1: 一次读一个字节,读出来的是数据在ASCII上对应的数字
细节2:读到文件末尾了,read方法返回-1。

3.释放资源

细节1:每次使用完流必须要释放资源。

FilelnputStream读取方式

1.一次读取一个字节

 弊端:读取速度较慢

2.一次读取多个字节

注意:一次读一个字节数组的数据,每次读取会尽可能把数组装满

读入多个字节样例:

/1.创建对象
FileInputStream fis = new FileInputStream( name: "myio\la.txt")
//2.读取数据
byte[] bytes = new byte[2];
//一次读取多个字节数据,具体读多少,跟数组的长度有关
//返回值:本次读取到了多少个字节数据
int len1 =fis.read(bytes);
System.out.println(len1);//2
String str1= new string(bytes,0,len1);
System.out.println(str1);
int len2 = fis.read(bytes);
System.out.println(len2);//2
String str2 = new string(bytes, 0,len2);
System.out.println(str2);
int len3 = fis.read(bytes);
System.out.println(len3);// 1
String str3 = new string(bytes, 0,len3);
System.out.println(str3);// ed
//3.释放资源
fis.close();

计算机的存储规则

ASCll规则(英文)

编码规则:前面补0,补齐8位

解码规则:直接转成十进制

GBK(汉字)

编码规则:l不需要变动

规则1:汉字两个字节存储

规则2:高位字节二进制一定以1开头,转成十进制之后是一个负数

 Unicode字符集的UTF-8编码格式

一个英文占一个字节,二进制第一位是0,转成十进制是正数

一个中文占三个字节,二进制第一位是1,第一个字节转成十进制是负数

java中的编码和解码方式

 字符流

字符流的底层其实就是字节流

 特点

输入流:一次读一个字节,遇到中文时,一次读多个字节

输出流:底层会把数据按照指定的编码方式进行编码,变成字节再写到文件中

使用场景

对于纯文本文件进行读写操作

 FileReader

1.创建字符输入流对象



细节1:如果文件不存在,就直接报错。

2.读取数据

细节1:按字节进行读取,遇到中文,一次读多个字节,读取后解码,返回一个整数

细节2:读到文件末尾了,read方法返回-1。

3.释放资源

FileReader使用样例

一次读取一个

//1.创建对象并关联本地文件
FileReader fr = new FileReader("myio\\a.txt");
int ch;
while((ch =fr.read())!= -1){
    System.out.print((char)ch);
}
//3.释放资源
fr.close();

 一次读取多个

//1.创建对象
FileReader fr= new FileReader("myio\\a.txt");
//2.谈取数据
char[]chars = new char[2];
int len;
//read(chars):读取数据,解码,强转三步合并了,把强转之后的字符放到数组当中
//空参的read + 强转类型转换
while((len =fr.read(chars))!= -1){
//把数组中的数据变成字符串再进行打印
System,out.print(new string(chars,0,len));
//3.释放资源
fr.close();

read()的使用细节

1.read()默认也是一个字节一个字节的读取的,如果遇到中文就会一次读取多个

2.在读取之后,方法的底层还会进行解码并转成十进制,最终把这个十进制作为返回值

FileWriter

FileWriter构造方法

 FileWriter成员方法

 FileWriter书写细节

1.创建字符输出流对象

细节1:参数是字符串表示的路径或者File对象都是可以的
细节2:如果文件不存在会创建一个新的文件,但是要保证父级路径是存在的
细节3:如果文件已经存在,则会清空文件,如果不想清空可以打开续写开关

2.写数据

细节: 如果write方法的参数是整数,但是实际上写到本地文件中的是整数在字符集上对应的字符

释放资源

细节:每次使用完流之后都要释放资源

字节缓冲流

 字节缓冲流拷贝文件样例:

//1.创建缓冲流的对象
BufferedInputstream bis = ew BufferedInputstream(new FileInputstream("myiolla.txt")),
Bufferedoutputstream bos= new Bufferedoutputstream(new File0utputstream("myiol\copy.txt"));
//2.循环读取并写到目的地
int b;
while((b=bis.read())!=-1){
bos.write(b);
//3.释放资源
bos.close();
bis.close();

字符缓冲流

字符缓冲流特有方法

 缓冲流总结

1.缓冲流有几种?

字节缓冲输入流:BufferedInputStream

字节缓冲输出流:BufferedOutputStream

字符缓冲输入流:BufferedReader

字符缓冲输出流:BufferedWriter

2.缓冲流为什么能提高性能

缓冲流自带长度为8192的缓冲区

可以显著提高字节流的读写性能

对于字符流提升不明显,对于字符缓冲流而言关键点是两个特有的方法

3.字符缓冲流两个特有的方法是什么?

字符缓冲输入流BufferedReader:readLine()

字符缓冲输出流BufferedWriter:newLine()

转换流

字符流与字节流之间的桥梁

主要作用:字节流想要使用字符流中的方法

序列化流

序列化流的作用:可以把java中的对象写到本地文件中

学生类代码:

package test11;

import java.io.Serializable;

public class students implements Serializable {
    private int age;
    private String name;
    private static final long serialVersionUID=1L;
    public students() {
    }
    public students(int age, String name) {
        this.age = age;
        this.name = name;
    }
    @Override
    public String toString() {
        return "students{" +
                "age=" + age +
                ", name='" + name + '\'' +
                '}';
    }
}

序列化流代码样例:

public class xuliehua {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        //创建对象
        students s=new students(12,"张三");

        //创建序列化流
        ObjectOutputStream obj=new ObjectOutputStream(new FileOutputStream("src/main/java/test11/r",true));

        //写出数据
        obj.writeObject(s);

        //关闭资源
        obj.close();
}

序列化流的小细节

使用对象输出流将对象保存到文件时会出现NotserializableException异常

解决方案:需要让Javabean类实现Serializable接口

反序列化流

反序列化流的作用:可以把序列化到本地文件中的对象,读取到程序中来

反序列化流代码样例:

package test11;

import java.io.*;

public class xuliehua {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        //创建反序列流的对象
        ObjectInputStream ss=new ObjectInputStream(new FileInputStream("src/main/java/test11/r"));

        //读取数据
        Object o=ss.readObject();

        System.out.println(o);

        ss.close();
    }
}

  • 22
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

3分人生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值