美文网首页
IO流 java.io.FileInputStream

IO流 java.io.FileInputStream

作者: Finlay_Li | 来源:发表于2019-04-07 16:44 被阅读0次

    简介

    1. 什么是流
      流是一种抽象概念,它代表了数据的无结构化传递。按照“流”的方式进行输入输出,数据被当成无结构的字节序或字符序列。
      流的用途最重要的是可以把东西从一个地方“运”到另一个地方,比如水、电,而对电脑来说,这个“东西”本质就是字节(byte),把一系列字节从一个地方“运”到另一个地方(从网络下载文件、从文件读取内容发送到网络、从一块内存到另一块内存等)。

    2. 什么是IO流
      IO流就是以流的方式进行输入输出
      在Java 语言中,IO流的抽象定义是 Input与Output。IO涉及的范围比较大,这里主要对文件内容的读写

    3. 计算机的存储单位:

      0 1 = 一位
      8位 = 一字节

    规定:
    1个字母 = 8位 = 一字节
    1个汉字 = 16位 = 二字节

    1. IO流的分类
      根据文件中 “数据的类型” 进行划分为两大类:
      字节流 Byte
      字符流 Char

    字节流有两个抽象类:InputStream OutputStream
    其对应子类有FileInputStream和FileOutputStream实现文件读写
    BufferedInputStream和BufferedOutputStream提供缓冲区功能
    同样,字符流有两个抽象类:Writer Reader
    其对应子类FileWriter和FileReader可实现文件的读写操作
    BufferedWriter和BufferedReader能够提供缓冲区功能,用以提高效率

    四大抽象类:
    (类型) | (字节流) | (字符流)
    ---------------------------------------------
    输入流 | InputStream | Reader
    ---------------------------------------------
    输出流 | OutputStream | Writer

    1. 什么时候该使用字符流,什么时候又该使用字节流呢?
      其实仔细想想就应该知道,所谓字符流,肯定是用于操作类似文本文件或者带有字符文件的场合比较多
      而字节流则是操作那些无法直接获取文本信息的二进制文件,比如图片,mp3,视频文件等
      其实所有数据在电脑上(硬盘)都是以字节存储的,只不过字符流在操作文本上面更方便一点而已
      此外,为什么要利用缓冲区呢?
      我们知道,像迅雷等下载软件都有个缓存的功能,硬盘本身也有缓冲区
      试想一下,如果一有数据,不论大小就开始读写,势必会给硬盘造成很大负担,并且能提高下载体验

    文件操作常用方法

    read(b) 调用重载read(byte[] b) 读取字节存储于数组中,并返回 b 的有效长度
    os.write() 写出去,写到调用的输出流中。
    new String(b, 0, len) 重载构造器,把 b 转换成String,从 0 开始,len结束
    readLine() 一行一行读
    newLine(); 创建新行
    flush()-强制清空缓冲区:强制把缓冲区转到目的地,避免因程序中断出现未读取的情况

    示例:把a文件的内容写到b文件上

    电脑上的a文件 ——> Java程序——> 电脑上的b文件

    package com.example.demo.examination2;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.util.Objects;
    public class Test {
        public static void main(String[] args) {
            FileInputStream fis = null;
            FileOutputStream fos = null;
            try {
                fis = new FileInputStream("C:/a.txt");
                fos = new FileOutputStream("D:/b.txt");
                byte[] b = new byte[1024];
                int end = 0;
                while ((end = fis.read(b)) != -1) {
                    System.out.println(new String(b, 0, end));
                    fos.write(b, 0, end);
                }
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    if (!Objects.isNull(fis)) {
                        fis.close();
                    }
                    if (!Objects.isNull(fos)) {
                        fos.close();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
    

    示例:缓冲流

    选择字节流完成图片文件的复制

      public void test() {
    
            // 3 包装——将创建的节点流转递给缓冲流构造器中
            BufferedInputStream bis = null;
            BufferedOutputStream bos=null;
    
            try {
    
                // 1. 创建 FileInputStream 的实例,同时打开指定文件
                FileInputStream fis = null;
    
                // 2. 创建 FileOutputStream 的实例,同时打开指定文件
                FileOutputStream fos = null;
                fis = new FileInputStream("C:\\Users\\99462\\Desktop\\1.jpg");
                fos = new FileOutputStream("C:\\Users\\99462\\Desktop\\2.jpg");
                bis = new BufferedInputStream(fis);
                bos = new BufferedOutputStream(fos);
    
                // 4. 读取指定文件的内容
                byte[] b = new byte[1024];
                int len = 0;
                while ((len = bis.read(b)) != -1) {
    
                    // 5. 将文件的内容写到目标地点
                    bos.write(b, 0, len);
                }
                //bos.flush(); //强制清空缓冲区,降低效率
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }
    
            // 6. 关闭
            try {
                if (bos != null) {
                    bos.close();
                }
                if (bis != null) {
                    bis.close();
                }
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
    

    选择字符流进行文本文件的复制

        public void test3(){
            copyTextFile("1.txt", "5.txt");
        }
        
        public void copyTextFile(String src, String dest){
            BufferedReader br = null;
            BufferedWriter bw = null;
            try {
                FileReader fr = new FileReader(src);
                br = new BufferedReader(fr);
                
                FileWriter fw = new FileWriter(dest);
                bw = new BufferedWriter(fw);
                
                String str = null;
                while((str = br.readLine()) != null){
                    bw.write(str);
                    
                    bw.newLine();//    bw.write(str + "\n");
                }
            } catch (IOException e) {
                e.printStackTrace();
            } finally {
                if(bw != null){
                    try {
                        bw.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
                
                if(br != null){
                    try {
                        br.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }
            
        }
    

    相关文章

      网友评论

          本文标题:IO流 java.io.FileInputStream

          本文链接:https://www.haomeiwen.com/subject/nppsiqtx.html