IO基础知识和操作流程

IO

io代表input(输入)和output(输出)

计算机中,从硬盘,光盘等外部储存设备向内存读入数据叫做输入,反之叫做输出
理解:以内存为中心,把内存当作大脑,
把书上面的知识读到大脑中来,叫做读的操作,也就是输入
把大脑里的知识写在纸上,这叫做写的操作,也就是输出
从别人的大脑获取来的知识也叫做输入,也就是从另外一片内存中获取数据也叫做读

io流的分类

按流的方向分为:输入流(input)和输出流(output)

按照读取数据的方法分可以分为字节流和字符流
字节流即一次只读取一个字节,但是无论什么数据格式例如图片、音频、视频都可以读取,因为它一次只能读取一个字节,所以经常需要开一个byte数组充当它的缓冲区

字符流一次读取一个字符,无论是英文字符还是中文字符都可以一次读取,不过它只能读取.text格式的文件

操作流程

1.确定源,先找到需要进行输入输出的目标文件
2.打开流,打开需要的输入输出流
3.操作,对目标文件进行输入输出操作
4.关闭流,关闭输入输出流,有异常需要捕获,先打开的流后关闭,后打开的流先关闭

关于异常的补充:有时在写比较长的代码时,某个地方需要return但是又不希望后面的
代码无法执行,这时可以抛出一个运行时异常取代return。在方法体中throw的运行时异常
在方法头中无需throws

实例

(FileInputStream和FileOutputStream)

package com.mytest.IO;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class PictureCopy {
          
   
    public static void main(String[] args) {
          
   
        FileInputStream fis = null;
        FileOutputStream fos =null;   //提升作用域,让fis和fos在try之外也可以用
        try {
          
   
            try {
          
   
                fis = new FileInputStream("picture.jpg");
            } catch (FileNotFoundException e) {
          
   
                e.printStackTrace();
            }
            try {
          
   
                fos = new FileOutputStream("picture-secret.jpg");
            } catch (FileNotFoundException e) {
          
   
                e.printStackTrace();
            }
            byte[] buffer = new byte[20];    //创造缓冲区,把内存中的内容先读到缓冲区,再把缓冲区的内容写到硬盘中
            int len = 0;
            while (true) {
          
   
                try {
          
   
                    if (!((len = fis.read(buffer)) != -1)) break;   //这里read()方法读到文件尾返回“-1”
                } catch (IOException e) {
          
   
                    e.printStackTrace();
                }
                for (int i = 0; i < len; i++) {
          
   
                    buffer[i] = (byte) (buffer[i] * 5);
                }
                try {
          
   
                    fos.write(buffer, 0, len);
                } catch (IOException e) {
          
   
                    e.printStackTrace();
                }
            }
        } finally {
          
   
            if (fos!=null) {
          
   
                try {
          
   
                    fos.close();       //关闭流,每个打开的流都必须关闭
                }catch (IOException e) {
          
   
                    e.printStackTrace();
                }
            }
        }
    }
}

补充:

ObjectOutStream在打开流的时候会把目标文件清空,以便于往文件里写入其他对象。
所以当ObjectInputStream和ObjectOutStream操作同一文件时,先开ObjectInputStream完成操作,
再开ObjectOutStream,防止空文件异常和空指针异常。
经验分享 程序员 微信小程序 职场和发展