资讯专栏INFORMATION COLUMN

java 中 IO 操作总结

jsummer / 2464人阅读

摘要:代码操作分析经常会遇到各种流操作,流操作一般分为两类字符流和字节流。我是拉丁小毛,欢迎大家关注我哦,一起交流,共同进步。有问题可以邮我哦

代码
java IO 操作分析
package jdk.util.sourceCode;


import java.io.*;

/**
 * 经常会遇到各种 IO 流操作,IO 流操作一般分为两类:字符流和字节流。
 * 以 "Reader" 结尾都是字符流,操作的都是字符型的数据
 * 以 "Stream" 结尾的都是字节流,操作的都是 byte 类型的数据
 * 二者的区别:
 *  字节流没有缓冲区,是直接输出的;而字符流是先输出到缓冲区,然后在调用 close() 方法后再输出信息
 *  处理对象不同,字节流能处理所有类型的数据,但是字符流只能处理字符类型的数据(只要是处理纯文本数据,就优先考虑使用字符流,除此之外都使用字节流)
 * java byte -> short -> int -> long    1byte -> 2byte -> 4byte -> 8byte
 *
 *
 *
 * InputStream 和 OutputStream 是各种输入输出字节流的基类,所有字节流都继承于这两个基类
 *
 *
 * FileInputStream 和 FileOutputStream 这两个从字面意思很容易理解,是对文件的字节流操作,也是最常见的 IO 操作流
 *
 *
 * 非流式文件类 -- File 类
 *  从定义来看,File 类是 Object 的直接子类,同时它继承了 Comparable 接口可以进行数组的排序
 *  File 类的操作包括文件的创建,删除,重命名,得到文件/文件夹的路径,创建时间等
 *  File 类是对文件系统中文件以及文件夹进行封装的一个对象,可以通过对象的思想来操作文件和文件夹
 *
 /



/**
 * @author: util.you.com@gmail.com
 * @date: 2019/5/25 15:40
 * @description:
 * @version: 1.0
 * @className: TestIO
 */
public class TestIO {


    public static void  main(String[] args){
        // 1.调用 新建文件
//        createFile("F:githubutil.you.com@gmail.comjdksrcmainjavajdkutilsourceCode", "测试io.txt");

        // 2.调用删除文件
//        deleteFile("F:githubutil.you.com@gmail.comjdksrcmainjavajdkutilsourceCode","测试io.txt");


        // 3.调用创建文件夹
//        createFolder("F:githubutil.you.com@gmail.comjdksrcmainjavajdkutilsourceCode", "测试io文件夹");


        // 4.列出指定目录下面的所有文件,包括隐藏文件
//        listFiles("F:githubutil.you.com@gmail.comjdksrcmainjavajdkutilsourceCode");


        // 5.判断指定的 文件夹是否是一个 目录(即是否是一个 文件夹)
//        isFolder("F:githubutil.you.com@gmail.comjdksrcmainjavajdkutilsourceCode", "测试io文件夹");


        // 6. 向指定的文件中(需要在文件名中给出路径和文件名,我这里是为了简便这样写了)通过 字节流 写入数据 (这里前提:认为该文件已经存在,不需要再创建)
//        writeFileByByte("F:githubutil.you.com@gmail.comjdksrcmainjavajdkutilsourceCode测试io.txt");


        // 7.从指定的文件中读取内容
//        readFileByByte("F:githubutil.you.com@gmail.comjdksrcmainjavajdkutilsourceCode测试io.txt");


        // 8. 从 指定文件读取内容并写入到 目标文件
        readWriteFile("F:gamexx.mp4",
                "E:github-projectjdksrcmainjavajdkutilsourceCode测试io.txt");


    }


    /**
     * 因为 io 流基本是与 File(文件/文件夹) 操作密不可分的,因此 io 的操作,只要涉及到文件,文件夹的都必须使用 File 类
     * 在指定的路径下,新建一个 指定文件名的 文件
     * @param path 文件路径
     * @param fileName 文件名
     */
    public static void createFile(String path, String fileName){
        // 因为是在 操作 文件,所以用到 File 对象【记住:所有与文件/文件夹操作相关的内容,都必须第一时间想到要用 File 对象】
        File file = new File(path+fileName); // 实例化一个 file 操作对象
        try {
            file.createNewFile(); // 调用 file 文件/文件夹 实例对象的 方法,来新建文件
            System.out.println("目标文件已存在: " + path + fileName);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


    /**
     * 删除一个指定路径下的 文件
     * @param path 该文件的路径
     * @param fileName 该文件的文件名
     */
    public static void deleteFile(String path, String fileName){
        File file = new File(path+fileName);
        if(file.exists()){
            file.delete();
            System.out.println("目标文件已删除");
        }else{
            System.out.println("要删除的目标文件不存在");
        }
    }


    /**
     * 新建一个 文件夹
     * @param path 路径
     * @param folderName 文件夹名
     */
    public static void createFolder(String path, String folderName){
        File file = new File(path+folderName);
        file.mkdir();
        System.out.println("该文件夹已经存在于: " + path + folderName);
    }


    /**
     * 列出指定目录下面的所有文件
     * @param path 目录的路径名
     */
    public static void listFiles(String path){
        File file = new File(path);
        if (file.isDirectory()){
            File[] fileArray = file.listFiles();
            for (int i = 0; i < fileArray.length; i++){
                System.out.println( "该目录下的文件: " + fileArray[i]);
                System.out.println( "该目录下的文件或文件夹的名字: " + fileArray[i].getName());
            }
        }else{
            System.out.println(path + " 目录不存在");
        }
    }


    /**
     * 判断给定的 文件夹 是否是一个目录
     * @param path
     */
    public static void isFolder(String path, String folderName){
        File file = new File(path + folderName);
        if (file.isDirectory()){
            System.out.println(path + folderName + " 是一个目录");
        }else{
            System.out.println(path + folderName + " 不是一个目录");
        }
    }


    /**
     * 通过 字节流 向 指定文件 写入内容
     * @param fileName 文件名,这里为了简化,文件名中带上 路径
     */
    public static void writeFileByByte(String fileName){
        File file = new File(fileName);
        OutputStream outputStream = null; // 从内存中 写入内容 到 文件中,这是输出流,因此要用 输出流
        // FileOutputStream 的构造器大体上有两类:一类是 传入一个带有文件名和文件路径的字符串;另一类是 传入一个 File 文件/文件夹对象
        try {
            outputStream = new FileOutputStream(file, true); // 给 file 文件对象 构造一个字节输出流
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
        // 这里穿插一个小知识点,即我们 给一个 int 参数,但是我们要让 outputStream 以 byte[] 的形式写入,接下来就看 int 转 byte[] 吧
        int a = 12345678; // 为什么这样呢?因为 一个 int 是 4个byte,所以一个 int 转成 byte[] 后,一定是里面包含4个byte元素的 byte[] 数组
        byte[] b = new byte[]{
                (byte) ((a >> 24) & 0xFF),
                (byte) ((a >> 16) & 0xFF),
                (byte) ((a >> 8) & 0xFF),
                (byte) ((a ) & 0xFF)
        };
        try {
            outputStream.write(b); // 这里还有一个问题没解决:写入的时候,选择编码格式(稍后解决)
            outputStream.close();
        }catch (IOException e) {
                e.printStackTrace();
            }
    }


    /**
     * 通过 字节流 从 指定文件 读取输出内容
     * @param fileName 文件名,这里为了简化,文件名中带上 路径
     */
    public static void readFileByByte(String fileName){
        File file = new File(fileName);
        InputStream inputStream = null; // 从 硬盘中 读取内容 到 内存中,这是 输入流,因此声明 输入流 对象
        try {
            inputStream = new FileInputStream(file);
            // inputStream 读取内容有5个方法 read():默认读取一个byte,readBytes(byte b[], int off, int len)
            // 这里我们采用 read(byte b[], int off, int len) 方法
            byte[] byter = new byte[1024]; // 所以先实例化一个 byte[]
            int len = inputStream.read(byter);
            inputStream.close();
            // 最后我们输出一下读取到的内容
            System.out.println(new String(byter, 0, len));
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    /**
     * @author: util.you.com@gmail.com
     * @param: [sourceFile, desFile]
     * @return: void
     * @date: 2019/5/25 18:04
     * @version: 1.0
     * @description: 最后来一个 从 指定文件中 读取内容 到 指定目标文件中
     */
    public static void readWriteFile(String sourceFile, String desFile){
        File inputFile = new File(sourceFile);
        File outputFile = new File(desFile);
        InputStream inputStream = null;
        OutputStream outputStream = null;
        try {
            inputStream = new FileInputStream(inputFile);
            byte[] byter = new byte[1024];
            inputStream.read(byter);
            outputStream = new FileOutputStream(outputFile, true);
            outputStream.write(byter);
            outputStream.close();
            inputStream.close();
            System.out.println("操作完成");
        }catch (Exception e){
            System.out.println(e.getMessage());
        }
    }

}
声明
原创手敲不易,转载请注明出处,谢谢。我是拉丁小毛,欢迎大家关注我哦,一起交流,共同进步。有问题可以邮我哦(util.you.com@gmail.com)

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/74652.html

相关文章

  • Java知识点总结(JDBC-大文本对象的使用)

    摘要:知识点总结大文本对象的使用知识点总结用于存储大量的文本数据大字段有些特殊,不同数据库处理的方式不一样,大字段的操作常常是以流的方式来处理。最大长度为字符的列。 Java知识点总结(JDBC-大文本对象的使用) @(Java知识点总结)[Java, JDBC] CLOB(Chaaracter Large Object) 用于存储大量的文本数据 大字段有些特殊,不同数据库处理的方式不一样...

    aboutU 评论0 收藏0
  • Java IO学习笔记总结

    摘要:学习笔记总结前言前面的八篇文章详细的讲述了的操作方法,文章列表如下基本的文件操作字符流和字节流的操作和操作内存操作流管道流打印流对的支持和后续字节流字节流的操作都是基于和这两个抽象类是字节输入流,主要的功能是从文件中读取数据它的子类有内存操 Java IO学习笔记总结 前言 前面的八篇文章详细的讲述了Java IO的操作方法,文章列表如下 基本的文件操作 字符流和字节流的操作 In...

    zhangke3016 评论0 收藏0
  • Java知识点总结JavaIO-字符流)

    摘要:使用字节流写入文件,如果没有关闭字节流操作,文件依然存在内容,说明字节流是操作文件本身的。字节流比字符流更好,使用更广泛。 Java知识点总结(JavaIO-字符流) @(Java知识点总结)[Java, JavaIO] [toc] 在程序中一个字符等于两个字节,那么 Java 提供了 Reader 和 Writer 两个专门操作字符流的类。 字符输出流:Writer 类定义如下: p...

    thekingisalwaysluc 评论0 收藏0
  • 少啰嗦!一分钟带你读懂Java的NIO和经典IO的区别

    摘要:的选择器允许单个线程监视多个输入通道。一旦执行的线程已经超过读取代码中的某个数据片段,该线程就不会在数据中向后移动通常不会。 1、引言 很多初涉网络编程的程序员,在研究Java NIO(即异步IO)和经典IO(也就是常说的阻塞式IO)的API时,很快就会发现一个问题:我什么时候应该使用经典IO,什么时候应该使用NIO? 在本文中,将尝试用简明扼要的文字,阐明Java NIO和经典IO之...

    Meils 评论0 收藏0
  • 我的阿里之路+Java面经考点

    摘要:我的是忙碌的一年,从年初备战实习春招,年三十都在死磕源码,三月份经历了阿里五次面试,四月顺利收到实习。因为我心理很清楚,我的目标是阿里。所以在收到阿里之后的那晚,我重新规划了接下来的学习计划,将我的短期目标更新成拿下阿里转正。 我的2017是忙碌的一年,从年初备战实习春招,年三十都在死磕JDK源码,三月份经历了阿里五次面试,四月顺利收到实习offer。然后五月怀着忐忑的心情开始了蚂蚁金...

    姘搁『 评论0 收藏0

发表评论

0条评论

jsummer

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<