• Java入门(10)Java IO


    概述

    总体而言,java的读写操作又分为两种:字符流字节流

    实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作文件。

    什么是流?

    流是一个抽象的概念。当Java程序需要从数据源读取数据时,会开启一个到数据源的流。数据源可以是文件,内存或者网络等。同样,当程序需要输出数据到目的地时也一样会开启一个流,数据目的地也可以是文件、内存或者网络等。流的创建是为了更方便地处理数据的输入输出。

    那么字节流和字符流又有什么区别呢?

    1.字节流也称为原始数据,需要用户读入后进行相应的编码转换。而字符流的实现是基于自动转换的,读取数据时会把数据按照JVM的默认编码自动转换成字符。

    2.字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,而字节流处理单元为1个字节,操作字节和字节数组。

    所以字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的。

    3.字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串,字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,而字符流就可以;

    基于以上的区别,那么什么情况下用字符流,什么情况下用字节流呢?

     stream结尾都是字节流reader和writer结尾都是字符流

     两者的区别就是读写的时候一个是按字节读写,一个是按字符。实际使用通常差不多。

     在读写文件需要对内容按行处理,比如比较特定字符,处理某一行数据的时候一般会选择字符流

     只是读写文件,和文件内容无关的,一般选择字节流。

     如果是音频文件、图片、歌曲,就用字节流好点;如果是中文(文本)的,用字符流更好;

    说了这么多,字节流和字符流处理文件到底怎么用呢?

    稍安勿躁,让我们先来看看在java中,输入输出操作的步骤是什么?

    1 使用File类打开一个文件

    2 通过字节流或字符流的子类,指定输出的位置

    3 进行读/写操作

    4 关闭输入/输出

    IO操作属于资源操作,一定要记得关闭

    File

    实战代码

    读写文本文件

    package cnki.common.test;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.OutputStream;
    import java.util.ArrayList;
    import java.util.Iterator;
    import java.util.List;
    
    import org.apache.commons.io.FileUtils;
    import org.apache.commons.io.IOUtils;
    import org.junit.Test;
    
    public class test {
    
        @Test
        public void function2() throws IOException {
            File file = new File("C:\Users\wangzl\Desktop\file\file.txt");
            List<String> list = new ArrayList<String>();
            list.add("aaa1");
            list.add("bbb1");
            list.add("ccc1");
            // 写入by FileUtils(覆盖原有的文本)
            FileUtils.writeLines(file, "UTF-8", list);
            // 写入by IOUtils(覆盖原有的文本)
            IOUtils.writeLines(list, null, new FileOutputStream(file));
            // 追加
            OutputStream os = new FileOutputStream(file, true);// 第二个参数true表示追加
            IOUtils.writeLines(list, null, os, "UTF-8");
            // 读取by FileUtils
            List<String> lines_FileUtils = FileUtils.readLines(file, "UTF-8");
            // 读取by IOUtils
            List<String> lines_IOUtils = IOUtils.readLines(new FileInputStream(file), "UTF-8");
            // 遍历
            Iterator<String> it = lines_FileUtils.iterator();
            while (it.hasNext()) {
                System.out.println(it.next());
            }
        }
    
        @Test
        public void function1() {
            try {
                File file = new File("C:\Users\wangzl\Desktop\file\file.txt");
                List<String> list = FileUtils.readLines(file, "UTF-8");
                // 方法一:超级for循环遍历
                for (String item : list) {
                    System.out.println(item);
                }
                // 方法二:对于ArrayList来说速度比较快, 用for循环, 以size为条件遍历:
                for (int i = 0; i < list.size(); i++) {
                    System.out.println(list.get(i));
                }
                // 方法三:集合类的通用遍历方式, 从很早的版本就有, 用迭代器迭代
                Iterator<String> it = list.iterator();
                while (it.hasNext()) {
                    System.out.println(it.next());
                }
    
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    
    }
    View Code

     递归获取指定目录下的文件

        //递归获取指定目录下的文件
        public void GetAllFilesByRecursive(String path) {
            File file = new File(path);
            if (file.exists()) {
                File[] files = file.listFiles();
                if (files.length == 0) {
                    System.out.println("文件夹是空的!");
                    return;
                } else {
                    for (File file2 : files) {
                        if (file2.isDirectory()) {
                            System.out.println("文件夹:" + file2.getAbsolutePath());
                            GetAllFilesByRecursive(file2.getAbsolutePath());
                        } else {
                            System.out.println("文件:" + file2.getAbsolutePath());
                        }
                    }
                }
            } else {
                System.out.println("文件不存在!");
            }
        }
    递归获取指定目录下的文件

     资料

    https://www.cnblogs.com/dolphin0520/p/3791335.html

    https://www.cnblogs.com/zyp777/p/8906143.html

    http://www.cnblogs.com/Java3y/p/9036728.html

    https://www.cnblogs.com/qing-gee/p/10418303.html

  • 相关阅读:
    [BZOJ4876][ZJOI2017]线段树
    [FJOI2016]建筑师(斯特林数)
    WC2018伪题解
    [BZOJ3514]CodeChef MARCH14 GERALD07加强版(LCT+主席树)
    [BZOJ2594][WC2006]水管局长加强版(LCT+Kruskal)
    [洛谷3796]【模板】AC自动机(加强版)
    [洛谷3808]【模板】AC自动机(简单版)
    [BZOJ3261]最大异或和
    [BZOJ3439]Kpm的MC密码
    [POI2006]Periods of Words
  • 原文地址:https://www.cnblogs.com/cnki/p/8711656.html
Copyright © 2020-2023  润新知