前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java中的I/O流及利用I/O流实现文件复制功能

Java中的I/O流及利用I/O流实现文件复制功能

作者头像
用户7886150
修改2021-04-23 10:47:21
6510
修改2021-04-23 10:47:21
举报
文章被收录于专栏:bit哲学院

参考链接: Java I / O流

Java中的I/O流及利用I/O流实现文件复制功能

 一、I/O流的概念

        1、 什么是I/O?

  硬件层面:I/O(input/output),即输入/输出。每个设备都会有一个专用的I/O地址,用来处理自己设备的输入输出信息。比如电脑设备输入端口为键盘和鼠标,输出端口为显示屏。

  软件层面:I/O即不同存储机制上的数据的读入写出。比如内存读写硬盘中的数据或者U盘中的数据。

  2、什么是I/O流?

  流是指一定的介质按照一定的方向流动的行为,在软件开发中指的是存储的数据的流动过程,这个数据源可以是硬盘中的文件、内存或者是网络中的某个URL

  I/O流专门用于软件开发层面的理解,把数据从一个存储介质写出(output)或者读取(input)到另外一个存储介质的过程表示为I/O流的模型

 二、流的分类

         1、根据传输数据的类型分类

  字节流:读取和写入数据的时候,以字节为最小单元进行读取和写入操作

  字符流:读取和写入数据的时候,以字符为最小单元进行读取和写入操作,因为每个字符根据编码不同,所占用的字节个数不同,每次读取和写入字符时候,是不定长的字节个数写入读取。  拓展:字符编码即计算机通过二进制表示不同国家字符的方式 常用编码类型:UTF-8、GBK、ISO8859-1等 处理中文的编码类型utf-8占3个字节、GBK占2个字节

                    关于Java中的编码可以参看我的这篇博客(Java中的编码问题)

          2、根据传输数据的方向分类 输入流:把数据从其他存储机制读入到当前内存机制当中 输出流:把内存当中的数据写出到其他存储机制当中

 三、Java中的I/O流

 1、梳理Java中I/O

         首先Java中分为两大类流:一类是字节流,另一类是字符流;

         每种大类的流都会对应输入流和输出流;即分别对应字节输入输出流和字符输入输出流;

 2、字节输入/输出流

 3、字符输入/输出流

 4、字节流和字符流相应的方法

 字节输入流和字符输入流都有相应的read()方法,可以一个字节/一个字符的读取,也可以利用字节数组/字符数组进行批量读取

          相应的

 字节输出流和字符输出流也有对应的write()方法,可以一个字节/一个字符的写出,也可以将整个字节数组/字符数组进行批量写出

  注意对应好,如果是以一个字节或者一个字符的读取,那么就要一个字节或者一个字符的写出

 四、I/O流的应用:文件复制功能

 1、使用字节流进行文件复制

 源代码:

 package com.huaixn.copy;

import java.io.FileInputStream;

import java.io.FileNotFoundException;

import java.io.FileOutputStream;

public class ByteCopy {

    public static void main(String[] args) {

        ByteCopy bc= new ByteCopy();

        try {

            bc.copy1();

            bc.copy2();

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

    //单字节的拷贝

    public void copy1() throws Exception{

        //首先构建输入流的对象,指定需要读取的文件路径

        FileInputStream fis = 

                new FileInputStream("C:/Users/Administrator/Desktop/my.doc");

        //构建文件输出流的对象,即将文件复制在哪里去,后面的true代表每次写入时不清空当前文件内容

        FileOutputStream fos =

                new FileOutputStream("C:/Users/Administrator/Desktop/mycopy1.doc",true);

        //一个字节一个字节的读取文件的内容

        int value = fis.read();

        //把读取的一个字节写出

        while(value!=-1){

            fos.write(value);

            fos.flush();

            value = fis.read();

        }

        //读取完毕后关闭流

        fis.close();

        fos.close();

    }

    //利用字节数组拷贝

    public void copy2() throws Exception{

        //首先构建输入流的对象,指定需要读取的文件路径

        FileInputStream fis = 

                new FileInputStream("C:/Users/Administrator/Desktop/my.doc");

        //构建文件输出流的对象,即将文件复制在哪里去,后面的true代表每次写入时不清空当前文件内容

        FileOutputStream fos =

                new FileOutputStream("C:/Users/Administrator/Desktop/mycopy2.doc",true);

        //构建字节数组

        byte [] bytes = new byte[1024];

        //把读取的字节存入到字节数组中

        int len=fis.read(bytes);

        //把读取的字节数组写出,注意一一对应

        while(len!=-1){

            /*

             * 利用第一种写出,查看文件属性可知,复制后的文件大小和原来文件大小不一致

             * 原因是当最后一次读取没有1024字节时,也会写出1024个字节

             * 所以我们采用第二种写出方式

             */

//            fos.write(bytes);

            fos.write(bytes, 0, len);

            fos.flush();

            len=fis.read(bytes);

        }

        //读取完毕后关闭流

        fis.close();

        fos.close();

    }

}

 2、利用字符流进行文件拷贝

 源代码:

 package com.huaixn.copy;

import java.io.FileNotFoundException;

import java.io.FileReader;

import java.io.FileWriter;

public class CharCopy {

    public static void main(String[] args) {

        CharCopy cc = new CharCopy();

        try {

            cc.copy1();

            cc.copy2();

        } catch (Exception e) {

            e.printStackTrace();

        }

    }

    public void copy1() throws Exception{

        //构建字符输入流对象

        FileReader fr = 

                new FileReader("C:\\Users\\Administrator\\Desktop\\my.txt");

        //构建字符输出流对象

        FileWriter fw =

                new FileWriter("C:\\Users\\Administrator\\Desktop\\mycopy1.txt");

        //读取单个字符

        int value=fr.read();

        //输出单个字符

        while(value!=-1){

            fw.write(value);

            fw.flush();

            value=fr.read();

        }

        fr.close();

        fw.close();

    }

    public void copy2() throws Exception{

            //构建字符输入流对象

                FileReader fr = 

                        new FileReader("C:\\Users\\Administrator\\Desktop\\my.txt");

                //构建字符输出流对象

                FileWriter fw =

                        new FileWriter("C:\\Users\\Administrator\\Desktop\\mycopy2.txt");

                //构建字符数组

                char [] chars = new char[1024];

                //把读取的字符存入字符数组中

                int len =fr.read(chars);

                //把字符数组中的数据写出

                while(len!=-1){

                    fw.write(chars, 0, len);

                    fw.flush();

                    len =fr.read(chars);

                }

                //关闭流操作

                fr.close();

                fw.close();

    }

}

 关于Java中的流,以前也写过一篇,有兴趣的可以点下面的链接查看:

                  博客:Java中的文件拷贝

 在上面的文件复制功能代码中,使用字节流可以对.txt、.doc、.docx等文件类型进行拷贝

 但使用字符流拷贝时,.doc以及.docx文件类型拷贝后出现了乱码,至于其中的原因,可能是因为中文编码的问题导致,小伙伴们可以在自己的PC机上尝试读取不同类型的文件;

 总结:

 1、我初次接触Java中的流时,感觉很复杂,有事输出流,字节流等;其实主要还是对流的分类不够了解;现在就感觉好很多了;

 2、说点个人的体验吧,流的分类一定要搞清楚,然后要知道哪些是字节输入输出流,哪些是字符输入输出流;

 3、勤加练习也是帮助记忆各种流的名字以及类别的方法,可能刚开始会搞不清楚,在理解好流的分类的基础上多敲几遍代码就能慢慢理解了;

 4、共勉!

本文系转载,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文系转载前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档