学习笔记 java IO流

2 篇文章 0 订阅
1 篇文章 0 订阅

IO流

1.IO之间的关系:

IO图解 输入流:允许java程序获取外部设备的数据(磁盘,光盘,网络等)。
输出流:保留java程序中的数据,输出到外部设备上(磁盘,光盘等)

编码:字符—–编码字符集——–》二进制

解码:二进制—解码字符集———》字符

File类:IO只能够操作数据,但是不能够对文件的信息做操作,操作文件必须使用File类。

File类的作用:

  1. 可以将文件或者文件夹在程序当中分装成对象。
  2. 方便对于文件或者文件夹当中的属性信息进行操作。
  3. File类通常通过构造函数作为参数传递到流的对象当中。

2.流的分类:

通过不同的方法,可以对于进行分类。

1.按照功能来划分:

输入流:只能从中读取数据,而不能向其写入数据。
输出流:只能向其写入数据,而不能从中读取数据。

2.按照处理单元来划分

字节流和字符流操作的方式基本上完全相同。操作的数据单元不同
字节流:操作的是8位的字节 InputStream/OutputStream 作为字节流的基类
字符流:操作的是16位的字符 Reader/Writer 作为字符流的基类

3.按照角色进行划分

节点流:可以直接从/向外部设备读取/写入数据的流,称之为节点流,节点流也被称之为低级流。
处理流:对于已经存在的流进行了连接和封装,扩展了原来的读/写的功能。处理流也被称之为高级流。

java的io包当中包括40多个流,他们都有紧密的联系,和使用的规律,这些流都源于4个抽象基类。

InputStream / Reader :所有的输入流的基类,前者是字节输入流,后者是字符输入流。
OutputStream/Writer :所有输出流的基本,前者是字节输出流,后者是字符输出流。
img

3.流的操作步骤

1.读入文件
  1. 创建流对象
  2. 创建一个缓存字节的容器数组
  3. 定义一个变量,保存实际读取的字节数
  4. 循环读取数据
  5. 关闭流
         //1. 创建流对象
		 FileInputStream fis=null;
         File file=new File("txtTest.text");
        try{
            fis=new FileInputStream(file);
            //2.创建一个缓存字节的容器数组
            byte[] buf=new byte[1024];
            //3.定义一个变量,保存实际读取的字节数
            int len;
            //4.循环读取数据
            while((len=fis.read(buf))!=-1){
                 String str=new String(buf,0,len);
                System.out.println(str);
            }
        }
        catch(Exception e){
              e.printStackTrace();
        }
        finally {
  			// 5.关闭流
            if (fis!=null) {
                try {
                    fis.close();
                } 
                catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
2.读出文件
  1. 创建流对象
  2. 准备数据源,把数据源转换成字节数组类型
  3. 通过流向文件当中写入数据
  4. 刷新流
  5. 关闭流
 		//1.创建流对象        
		FileOutputStream fos=null;
        try{
            fos=new FileOutputStream(new File("txtTest.text"));
           //2.准备数据源,把数据源转换成字节数组类型
            String msg = "春夜喜雨\n好雨知时节,当春乃发生。\n随风潜入夜,润物细无声。";
            byte[]buffer=msg.getBytes();
             //3.通过流向文件当中写入数据
            fos.write(buffer,0,buffer.length);
            //4.刷新流
            fos.flush();
        }catch (Exception e){
        }
         finally {
            if(fos!=null) {
                try {
                //5.关闭流
                    fos.close();
                }catch (Exception e){
                    e.printStackTrace();
                }
            }
3.处理流

处理流的好处:处理流必须在节点流的基础之上,增加了效率,提高了性能,扩大的功能。

1.缓冲流

缓冲字节流
BufferedInputStream
BufferedOutputStream
缓冲字符流
BufferedReader
BufferedWriter
处理流内部包含了节点流,节点流决定了与其沟通的外部设备,而处理流则增加了其功能。
缓冲流的好处:

没有缓存区,那么每read一次,就会发送一次IO操作;有缓存区,第一次read时,会一下读取x个字节放入缓存区,然后后续的read都会从缓存中读取,当read到缓存区末尾时,会再次读取x个字节放入缓存区。

缓冲流内部包含一个缓冲区域,默认8kb,每一次程序调用read方法其实都是从缓冲区域当中读取内容,如果读取失败就说明缓冲区域当中没有内容,那么就从数据源当中读取内容,然后会尽可能读取更多的字节放入到缓冲区域当中,最后缓冲区域当中的内容,会全部返回给程序。
从缓冲区读取数据会比直接从数据源读取数据的速度快,效率也更高,性能更好。

2.转换流:

转换流作用:把字节流转换成字符流,可以解决出现的因为编码集和解码集造成的乱码问题。

InputStreamReader:

OutputStreamWriter:

在处理文件时,如果文件的字符格式和编译器处理格式不一样时,会出现乱码问题。比如文件字符格式GBK,
InputStreamReader :转换输入流–》将字节输入流转换成字符输入流
作用:为了防止文件使用字符输入流处理时出现乱码问题。

3.字节数组流(内存流也称为管道流)

ByteArrayInputStream
ByteArrayOutputStream
作用:可以在循环当中把所有的数据存放到统一的容器当中,然后在循环结束之后可以把容器当中所有的内容一起取出来。
注意事项:
内存流属于内存当中的资源,所以数据量不要过大,如果太大,会造成内存溢出的错误。

笔记内容根据b站 狂神说java教学视频学习后整理所得

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值