学习Java第十九天

一、IO

1.1简介

1、I:Input 输入 O:Output 输出 用于不同设备来进行数据的交换

2、使用场景:

A、文件copy复制

B、文件上传与下载

C、即时通讯(微信聊天)

3、分类:

按照流向进行划分:输入流与输出流

按照类型进行划分:字节流与字符流

4、输入流与输出流解释

硬盘到内存:输入流

内存到硬盘:输出流

5、字节流与字符流解释

6、字节流

A、万物皆字节 电脑任何资源都可以使用字节来表示

B、字节流用来操作图片 音频 视频

C、分类:字节输入流与字节输出流

7、字符流

A、字符流=字节流+编码表 字符流的底层也是使用字符流来进行操作 只是通过编码表进行转换(将字节转换字符)

B、字符流用于操作纯文本内容

C、分类:字符输入流与字符输出流

8、IO注意事项

A、所有的流资源都在使用java.io包下

B、使用流资源的时候 可能会产生异常 处理异常:抛出 与捕获

C、使用完流资源 需要关闭资源 因为流资源比较消耗内存

二、字节输出流

2.1简介

1、此抽象类是表示输出字节流的所有类的超类

A、OutputStream是一个抽象类

B、OutputStream是字节流的所有类的超类

2.2常用的方法

方法的名称

方法的描述

public void close()

关闭流资源

public void flush()

刷新(将缓冲区(在内存中)的数据刷新到硬盘中)

public abstract void write(int b)

一个一个字节写入

public void write(byte[] b)

一次写入多个字节

public void write(byte[] b, int off, int len)

一次写入指定长度的字节

2.3子类

三、FileOutputStream

3.1简介

A、文件输出流是用于将数据写入 File

B、FileOutputStream 用于写入诸如图像数据之类的原始字节的流。要写入字符流,请考虑使用FileWriter

3.2构造方法

构造方法名称

构造方法的描述

public FileOutputStream(Filefile)

创建一个向指定File对象表示的文件中写入数据的文件输出流

public FileOutputStream(Filefile, boolean append)

创建一个向指定 File 对象表示的文件中写入数据的文件输出流(如果为 true,则将字节写入文件末尾处,而不是写入文件开始处)

publicFileOutputStream(Stringname)

创建一个向具有指定名称的文件中写入数据的输出文件流

publicFileOutputStream(Stringname, boolean append)

创建一个向具有指定 name 的文件中写入数据的输出文件流(如果为 true,则将字节写入文件末尾处,而不是写入文件开始处)

3.3构造方法的三件事

A、实例化FileOutputStream对象

B、船舰一个空的文件

C、将FileOutputStream指向创建的空文件

3.4使用步骤

A、实例化FileOutputStream对象

B、调用写的方法

C、关闭流资源

3.5一个一个字节写入

package com.gkd.test01; import java.io.FileOutputStream; import java.io.IOException; public class Test01 { public static void main(String[] args) throws IOException { //实例化FileOutputStream对象 FileOutputStream fos=new FileOutputStream("D:\\QF\\admin\\cc.txt"); //调用写的对象一个一个存入 fos.write(97); fos.write(98); fos.write(99); //关闭资源 fos.close(); } }

3.6一次写入多个字节

package com.gkd.test01; import java.io.FileOutputStream; import java.io.IOException; public class Test02 { public static void main(String[] args) throws IOException { //实例化FileOutputStream对象 FileOutputStream fos=new FileOutputStream("D:\\QF\\admin\\dd.txt"); //定义字节数组 byte [] b={97,98,99}; //调用方法 fos.write(b); //关闭资源、 fos.close(); } }

3.7使用字节流写入字符串

package com.gkd.test01; import java.io.FileOutputStream; import java.io.IOException; public class Test03 { public static void main(String[] args) throws IOException { //实例化FileOutputStream对象 FileOutputStream fos=new FileOutputStream("D:\\QF\\admin\\ee.txt",false); String str="拉稀哥瞒着阿蒙看美女"; //转换成字节数组 byte[] b = str.getBytes(); fos.write(b); fos.close(); } }

3.8字节流写入的原理

3.9写入的内容说明

1、使用OutputStream 写入的内容是: 97 98 99 记事本打开的内容:a b c

2、原因:

使用记事本打开文件的时候 如果字节范围是0-127 使用ASCII码表来进行转换

使用记事本打开文件的时候 如果超过了这个范围 使用记事本默认的码表 默认的码表是GBK

四、Input Stream

4.1简介

1、此抽象类是表示字节输入流的所有类的超类

A、InputStream 是一个抽象类

B、InputStream是字节输入流的所有类的超类

4.2常用方法

方法名称

方法的描述

public void close()

关闭资源

public abstract int read()

一个一个字节读取

public int read(byte[] b)

一次读取多个字节放入到缓冲区数组

public int read(byte[] b, int off, int len)

一次读取指定字节数放入缓冲区数组中

4.3子类

五、FileInputStream

5.1简介

A、FileInputStream从文件系统中的某个文件中获得输入字节 读取文件中字节(内容)

B、FileInputStream用于读取诸图象数据之类的原始字节流,要读取字符流,请考虑使用FileReader

5.2构造方法

构造方法名称

构造方法描述

public FileInputStream(File file)

通过打开一个到实际文件的连接来创建一个FileInputStream

public FileInputStream(Stringname)

过打开一个到实际文件的连接来创建一个FileInputStream

5.3构造方法两件事

A、实例化FileInputStream对象

B、FileInputStream将指向要操作的文件

5.4使用步骤

A、实例化FileInputStream对象

B、调用该方法

C、关闭资源

5.5一个一个字节读取

package com.gkd.test01; import java.io.FileInputStream; import java.io.IOException; public class Test04 { public static void main(String[] args) throws IOException { //实例化 FileInputStream fis=new FileInputStream("D:\\QF\\admin\\cc.txt"); //调用读取方法 int r1 = fis.read(); System.out.println((char) r1); int r2 = fis.read(); System.out.println((char) r2); int r3 = fis.read(); System.out.println((char) r3); int r4 = fis.read(); System.out.println(r4); //关闭资源 fis.close(); } }

5.6读取原理

改造后代码:

package com.gkd.test01; import java.io.FileInputStream; import java.io.IOException; public class Test05 { public static void main(String[] args) throws IOException { //实例化对象 FileInputStream fis=new FileInputStream("D:\\QF\\admin\\cc.txt"); //使用循环,因为不清楚有多少个字节,所有使用while,条件是不等于-1 //这样在判断的时候读一次,在条件内又读一次,所有需要定义一个变量来记录 // while(fis.read()!=-1){ // System.out.println((char) fis.read()); // } int lng=-1; while ((lng=fis.read())!=-1){ System.out.println((char) lng); } fis.close(); } }

5.7一次读取多个字节

代码:

package com.gkd.test01; import java.io.FileInputStream; import java.io.IOException; import java.util.Arrays; public class Test06 { public static void main(String[] args) throws IOException { //实例化对象 FileInputStream fis=new FileInputStream("D:\\QF\\admin\\cc.txt"); //定义数组 byte [] b= new byte[2]; //调用方法读取 //第一次读取 int r1 = fis.read(b); System.out.println(Arrays.toString(b)); System.out.println(r1); //第二次读取 int r2 = fis.read(b); System.out.println(Arrays.toString(b)); System.out.println(r2); //第三次读取 int r3 = fis.read(b); System.out.println(Arrays.toString(b)); System.out.println(r3); //第四次读取 int r4 = fis.read(b); System.out.println(Arrays.toString(b)); System.out.println(r4); fis.close(); } }

5.8一次读取多个字节的原理

改造后的代码:

package com.gkd.test01; import java.io.FileInputStream; import java.io.IOException; import java.util.Arrays; public class Test07 { public static void main(String[] args) throws IOException { //实例化对象 FileInputStream fis=new FileInputStream("D:\\QF\\admin\\cc.txt"); //定义数组 //定义缓冲区数组的大小是1024的倍数 byte [] b =new byte[1024]; int leg=-1; //使用循环来读取 while((leg=fis.read(b))!=-1){ // System.out.println(Arrays.toString(b)); //为了最后不要读取重复的值,参数第一个数数组,第二个是字节的索引,第三个是长度; System.out.println(new String(b,0,leg)); } fis.close(); } }

5.9 read()与read(b)比较

A、read()一个一个字节读取 效率低 read(b)一次读取多个字节 效率高

B、read()返回的是读取的数据 read(b)返回的是读取的有效的字节个数

5.9.1案例

step01需求将C盘中的图片copy到其他盘中

step02分析

A、使用字节输入流读取图片 FileInputStream读

B、使用字节输出流写入图片 FileOutputStream写

代码:

package com.gkd.test01; import java.io.*; public class Test08 { public static void main(String[] args) throws IOException { //实例化输入流 InputStream is=new FileInputStream("C:\\Users\\廖国庆\\22.jpeg"); //实例化输出流 OutputStream os=new FileOutputStream("d:\\QF\\admin\\22.jpeg"); //定义一个缓冲区数组 byte [] b= new byte[1024]; //定义变量记录 int leng=-1; //使用循环 while ((leng=is.read(b))!=-1){ os.write(b,0,leng); } //关闭资源 os.close(); is.close(); } }

六、高效流

6.1简介

1、

A、高效读

B、在创建时,会创建一个内部缓冲区数组 默认缓冲区大小 8192

2、

A、高效写

B、在创建时,会创建一个内部缓冲区数组 默认缓冲区大小 8192

3、没有读写文件的功能 只是对InputStream与OutputStream的封装

4、高效的原因

高效读:每次读取8192个字节的数据放入到缓冲区数组 再从缓冲区数组(内存)中获取数据 避免与磁盘进行多次交互

6.2构造方法

方法的名称

方法的描述

创建一个新的缓冲区输出流,以将数据写入指定的底层输出流

构建一个并保存其参数,

6.3高效读

package com.gkd.test01; import java.io.BufferedInputStream; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; public class Test09 { public static void main(String[] args) throws IOException { //实例化InputStream InputStream is=new FileInputStream("D:\\QF\\admin\\cc.txt"); //实例化BufferedInputStream BufferedInputStream bis= new BufferedInputStream(is); int leng=-1; //使用循环读取 while ((leng=bis.read())!=-1){ System.out.println((char) leng); } //关闭资源 bis.close(); is.close(); } }

6.4高效写

package com.gkd.test01; import java.io.BufferedOutputStream; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; public class Test10 { public static void main(String[] args) throws IOException { //实例化OutputStream OutputStream os=new FileOutputStream("D:\\QF\\admin\\ff.txt"); //实例化BufferedOutputStream BufferedOutputStream bos=new BufferedOutputStream(os); bos.write(97); bos.write(98); bos.write(99); bos.write(100); bos.write(101); bos.write(102); bos.write(103); //关闭资源 bos.close(); os.close(); } }

6.5案例

step01需求:使用高效流 将c盘中视频copy d盘

step02分析

A. BufferedOutputStream 高效写

B. BufferedInputStream 高效读

package com.gkd.test01; import java.io.*; public class Test11 { public static void main(String[] args) throws IOException { //实例化 InputStream is=new FileInputStream("D:\\QF\\admin\\4.jpeg"); //实例化 BufferedInputStream bis=new BufferedInputStream(is); //实例化 OutputStream os=new FileOutputStream("C:\\Users\\廖国庆\\Desktop\\5.jpeg"); //实例化 BufferedOutputStream bos=new BufferedOutputStream(os); int leng=-1; while ((leng=bis.read())!=-1){ bos.write(leng); } bos.close(); bis.close(); os.close(); is.close(); } }

七、关闭流资源

A、关闭流资源 必须从下往上进行关闭

B、关闭流资源需要再finally中进行关闭

C、关闭流资源之前 必须先非空判断

package com.gkd.test01; import java.io.*; public class Test12 { public static void main(String[] args) { InputStream is=null; BufferedInputStream bis=null; OutputStream os=null; BufferedOutputStream bos=null; try { //实例化InputStream is=new FileInputStream("D:\\QF\\admin\\4.jpeg"); //实例化BufferedInputStream bis=new BufferedInputStream(is); //实例化OutputStream os=new FileOutputStream("C:\\Users\\廖国庆\\Desktop\\6.jpeg"); //实例化BufferedOutputStream bos=new BufferedOutputStream(os); int leng=-1; while ((leng=bis.read())!=-1){ bos.write(leng); } } catch (IOException e) { e.printStackTrace(); } finally { try { if (bos!=null){ bos.close(); } if (bis!=null){ bis.close(); } if (os!=null){ os.close(); } if (is!=null){ is.close(); } } catch (IOException e) { e.printStackTrace(); } } } }

八、总结

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值