目录
IO流概述:
IO:输入/输出(Input/Output)
流:是一种抽象概念,是对数据传输的总称。也就是说数据在设备间的传输称为流,流的本质是数据传输IO流就是用来处理设备间数据传输问题的
常见的应用:文件复制;文件上传:文件下载
IO流分类:
按照数据的流向
输入流:读数据输出流:写数据
按照数据类型来分
字节流
字节输入流;字节输出流字符流
字符输入流;字符输出流一般来说,我们说IO流的分类是按照数据类型来分的
那么这两种流都在什么情况下使用呢?
如果数据通过Window自带的记事本软件打开,我们还可以读懂里面的内容,就使用字符流,
否则使用字节流。如果你不知道该使用哪种类型的流,就使用字节流
字节流抽象基类
InputStream:这个抽象类是表示字节输入流的所有类的超类OutputStream:这个抽象类是表示字节输出流的所有类的超类
子类名特点:子类名称都是以其父类名作为子类名的后缀
FileOutputStream:文件输出流用于将数据写入File
FileOutputStream(Stringname):创建文件输出流以指定的名称写入文件使用字节输出流写数据的步骤:
1.创建字节输出流对象调用系统功能创建了文件
创建字节输出流对象
让字节输出流对象指向文件
2.调用字节输出流对象的写数据方法
3.释放资源(关闭此文件输出流并释放与此流相关联的仟何系统资源
- package zyy04;
-
- import java.io.FileNotFoundException;
- import java.io.FileOutputStream;
- import java.io.IOException;
-
- public class Demo {
- public static void main(String[] args) throws IOException {
- //创建字节输出流对象
- FileOutputStream fos=new FileOutputStream("E:\\IdeaProject\\JavaSE_Code\\practise\\fos.txt");
- /*
- 做了三件事情:
- 调用系统功能创建了文件;
- 创建了字节输出流对象;
- 让字节输出流对象指向创建好的文件
- */
- //write(int b):将指定的字节写入此文件输出流
- fos.write(97);
- fos.write(57);
- fos.write(55);
- //最后都要释放资源
- //close():关闭此文件输出流并释放与此流相关联的任何系统资源
- fos.close();
- }
- }

- package zyy04;
-
- import java.io.FileOutputStream;
- import java.io.IOException;
-
- public class Demo {
- public static void main(String[] args) throws IOException {
- //FileOutputStream():创建文件输出流以指定的名称写入文件
- FileOutputStream fos= new FileOutputStream("E:\\IdeaProject\\JavaSE_Code\\practise\\fos.txt");
- //write(int b):将指定的字节写入此文件输出流
- fos.write(97);
- fos.write(98);
- fos.write(99);
- fos.write(100);
- //write(byte[] b):将b.length字节从指定的字节数组写入此文件输出流
- byte[] bys={97,98,99,100,101};
- fos.write(bys);
- //write(byte[]b,int off,int len):将len字节从off开始写入此文件输出流
- fos.write(bys,1,3);
- }
- }
1:字节流实现换行
Windows:\r\n
Linux:\n
mac:\r
2:字节流写数据如何实现追加写入
FileOutputStream(String name,boolean append)
创建文件输出流已制定的名称写入文件。如果第二个参数为true,则字节将写入文件的末尾而不是开头
- public class Demo {
- public static void main(String[] args) throws IOException {
- //FileOutputStream():创建文件输出流以指定的名称写入文件
- FileOutputStream fos= new FileOutputStream("E:\\IdeaProject\\JavaSE_Code\\practise\\fos.txt",true);
- //写数据
- for(int i=0;i<10;i++){
- fos.write("hello".getBytes());
- fos.write("\r\n".getBytes());
- }
- //释放资源
- fos.close();
- }
- }
finally:在异常处理时提供finally块来执行所有清除操作。比如说IO流中的释放资源
特点:被finally控制的语句一定会执行,除非JVM退出
- package zyy04;
-
- import java.io.FileOutputStream;
- import java.io.IOException;
-
- public class Demo {
- public static void main(String[] args) {
- //FileOutputStream():创建文件输出流以指定的名称写入文件
- FileOutputStream fos=null;
- try {
- fos= new FileOutputStream("E:\\IdeaProject\\JavaSE_Code\\practise\\fos.txt",true);
- fos.write("hello".getBytes());
- } catch (IOException e) {
- e.printStackTrace();
- }finally {//加入finally来实现释放资源
- if(fos!=null) {//判断保持更健壮
- try {
- fos.close();
- } catch (IOException e) {
- e.printStackTrace();
- }
- }
- }
-
- }
- }
需求:把文件fos.txt中的内容读取出来在控制台输出
FilelnputStream:从文件系统中的文件获取输入字节
FilelnputStream(Stringname):通过打开与实际文件的连接来创建一个FilelnputStream该文件由文件系统中的路径名name命名
使用字节输入流读数据的步骤:
创建字节输入流对象
调用字节输入流对象的读数据方法释放资源
- package zyy04;
-
-
- import java.io.FileInputStream;
- import java.io.IOException;
-
- public class Demo {
- public static void main(String[] args) throws IOException {
- //创建字节输入流对象
- //FileInputStream()
- FileInputStream fis=new FileInputStream("E:\\IdeaProject\\JavaSE_Code\\practise\\fos.txt");
- //调用字节输入流对象的读数据方法
- //read()
- int by=fis.read();
- System.out.println(by);
- System.out.println((char)by);
- //如果达到文件的末尾,-1
- //循环读取
- int by1=fis.read();
- while(by1!=-1){
- System.out.println(by);
- System.out.println((char)by);
- by1=fis.read();
- }
- //优化循环
- int by2;
- while((by2=fis.read())!=-1){
- System.out.println(by);
- System.out.println((char)by);
- }
- //释放资源
- fis.close();
- }
- }
需求:把“E:\\山海经.txt”复制到模块目录下的“山海经.txt”
分析:
①复制文本文件,其实就把文本文件的内容从一个文件中读取出来(数据源),然后写入到另一个文件中(目的地)
②数据源:
E:\\山海经.txt---读数据---InputStream---FilelnputStream③目的地:
practise\\山海经.txt---写数据---OutputStream---FileOutputStream
思路:
根据数据源创建字节输入流对象根据目的地创建字节输出流对象
读写数据,复制文本文件(一次读取一个字节,一次写入一个字节)
释放资源
- package zyy04;
-
-
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- import java.io.IOException;
-
- public class Demo {
- public static void main(String[] args) throws IOException {
- //根据数据源创建字节输入流对象
- FileInputStream fis=new FileInputStream("E:\\山海经.txt");
- //根据目的地创建字节输出流对象
- FileOutputStream fos=new FileOutputStream("E:\\IdeaProject\\JavaSE_Code\\practise\\山海经.txt");
- //读写数据,复制文本文件
- int by;
- while((by=fis.read())!=-1){
- fos.write(by);
- }
- //释放资源
- fis.close();
- }
- }
案例:复制图片
需求:把“E:\\dd.jpg”复制到模块目录下的“dd.jpg"
思路:
根据数据源创建字节输入流对象
根据目的地创建字节输出流对象
读写数据,复制图片(一次读取一个字节数组,一次写入一个字节数组)释放资源
- package zyy04;
-
-
- import java.io.FileInputStream;
- import java.io.FileOutputStream;
- import java.io.IOException;
-
- public class Demo {
- public static void main(String[] args) throws IOException {
- //根据数据源创建字节输入流对象
- FileInputStream fis=new FileInputStream("E:\\dd.jpg");
- //根据目的地创建字节输出流对象
- FileOutputStream fos=new FileOutputStream("E:\\IdeaProject\\JavaSE_Code\\practise\\dd.jpg");
- //读写数据,复制图片
- byte[] bys=new byte[1024];
- int len;
- while((len=fis.read())!=-1){
- fos.write(bys,0,len);
- }
- //释放资源
- fis.close();
- fos.close();
- }
- }
字节缓冲流:
BufferOutputStream:该类实现缓冲输出流。通过设置这样的输出流,应用程序可以向底层输出流写入字节,而不必为写入的每个字节导致底层系统的调用
BufferedInputStream:创建BufferedInputStream将创建一个内部缓冲区数组。当从流中读取或跳过字节时,内部缓冲区将根据需要从所包含的输入流中重新填充,一次很多字节构造方法:
字节缓冲输出流:BufferedOutputStream(OutputStreamout)字节缓冲输入流:BufferedInputStream(InputStreamin)
为什么构造方法需要的是字节流,而不是具体的文件或者路径呢?
字节缓冲流仅仅提供缓冲区,而真正的读写数据还得依靠基本的字节流对象进行操作
- package zyy04;
-
- import java.io.*;
-
- public class Demo {
- public static void main(String[] args) throws IOException {
- //字节缓冲输出流
- BufferedOutputStream bos=new BufferedOutputStream(new FileOutputStream("E:\\IdeaProject\\JavaSE_Code\\practise\\bos.txt"));
- //写数据
- bos.write("hello\r\n".getBytes());
- bos.write("world\r\n".getBytes());
- //字节缓冲输入流
- BufferedInputStream bis=new BufferedInputStream(new FileInputStream("E:\\IdeaProject\\JavaSE_Code\\practise\\bos.txt"));
- //一次读一个字节数组数据
- byte[] bys=new byte[1024];
- int len;
- while((len=bis.read())!=-1){
- System.out.println(new String(bys,0,len));
- }
- //释放资源
- bis.close();
- bos.close();
- }
- }