Java重点 | IO流中的文件专属流

简介: 上一文我们已经初步认识了IO流,本文我们继续学习,本文主要介绍了IO流中的文件专属流分别是java.io.FileInputstream、java.io.FileOutputstream、java.io.FileReader、java.io.FileWriter。本文会通过代码实战的方式让你对这些流的理解更加深刻。

文件专属

FileInputstream(读 字节)

**java.io.FileInputStream:
1、文件字节输入流,万能的,任何类型的文件都可以采用这个流来读。
2、字节的方式,完成输入的操作,完成读的操作(硬盘--->内存)**

Read()方法:读取内容,返回值是读到几个数量,就返回几,当读完的时候,返回-1,就代表没有了

public class FileInputStream读 {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = null;
        try {
            //创建文件字节流输入对象
            fis = new FileInputStream("D:\\AJava\\新建文件夹\\aaa");
           /* while (true){
                int rea = fis.read(); //read():读文件
                if (rea == -1 ){
                    break;
                }
                System.out.println(rea);
            }*/
            //改造while
            int aaa = 0;
            while ((aaa= fis.read())!=-1){
                System.out.println(aaa);
            }


        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }finally {
            //关闭流的前提是流不是空,流是空没有必要关
            if (fis != null) {
                fis.close();
            }
        }

    }
}
**分析以上程序的缺点:
一次读取一个字节byte,这样内存和硬盘交互太频繁,基本上时间/资源都耗费在交互上面了。能不能一次读取多个字节呢?可以。**
public class FileInputStream读最终版 {
    public static void main(String[] args) {
        FileInputStream fil = null;
        try {
            //创建文件字节输入流
            fil = new FileInputStream("JAVAse进阶/src/IO流/aa");
            //开始读,采用byte数组,一次读取多个字节。最多读取“数组.length”个字节
            byte[] bytes= new byte[4];//准备一个4个长度的byte数组,一次最多读取4个字节
/*            while (true){
                int rea = fil.read(bytes);
                if (rea==-1){
                    break;
                }
                System.out.print(new String(bytes,0,rea));
            }*/
            int aaa=0; //提前准备一个变量
            while ((aaa=fil.read(bytes))!=-1){
                //使用String构造方法,将byte转换为字符串,从0开始,到aaa结束,转换这么多
                //aaa返回的是读取字节数量。
                System.out.print(new String(bytes,0, aaa));
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fil != null) {
                try {
                    fil.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

FileInputStream类的其他常用方法

**FileInputstream类的其它常用方法:
int available():返回流当中剩余的没有读到的字节数量
Long skip(long n):跳过几个字节不读。**
public class FileInputStream类的其他常用方法 {
    public static void main(String[] args) {
        FileInputStream fil = null;
        try {
            fil = new FileInputStream("JAVAse进阶/src/IO流/aa");
            System.out.println(fil.available());
            //准备一个长度为fil.available长度的数组,一次最多读fil.available()个字节
            byte[] bytes = new byte[fil.available()];// 这种方式不太适合太大文件,因为byte数组不能太大
            //不需要循环了,直接读一次就行了,返回的是一次读到的字节
            int read = fil.read(bytes);
            //读取到的字节转换为字符串输出
            System.out.println(new String(bytes));
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fil != null) {
                try {
                    fil.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

FileOutputStream (写 字节)

文件字节输出流,负责写。从内存到硬盘。
public class FileOutputStream写 {
    public static void main(String[] args) {
        FileOutputStream fos=null;
        try {
            //如果没有这个文件,会自动创建一个
            //这种构造方法会将原文件清空,然后重新写入
             //fos = new FileOutputStream("JAVAse进阶/src/IO流/aa");

            //这个构造方法,以追加的方式在文件末尾写入,不会清空原文件内容。
            fos = new FileOutputStream("JAVAse进阶/src/IO流/aa",true);
             //开始写
            byte[] bytes = {97,98,99,100};
            //将byte全部写出
            fos.write(bytes);
            //将byte数组一部分写出 从下标0开始,取2个
            fos.write(bytes,0,2);
            //字符串
            String s = "我是一个中国人";
            //将字符串转换成byte数组。
            byte[] bytes1 = s.getBytes(StandardCharsets.UTF_8);
            //写
            fos.write(bytes1);
            //写完之后一定要刷新
            fos.flush();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (args != null) {
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}
运行后文件末尾会多出:abcdab我是一个中国人

文件复制

**使用FileInputStream+FileOutputStream完成文件的拷贝。拷贝的过程应该是一边读,一边写。
使用以上的字节流拷贝文件的时候,文件类型随意,万能的。什么样的文件都能拷贝。**
public class 文件复制 {
    public static void main(String[] args) {
        FileInputStream fis = null;
        FileOutputStream fos = null;
        try {
            //创建一个输入流对象
            fis= new FileInputStream("D:\\a剪辑\\完成视频\\123.mp4");
            //创建一个输出流对象
            fos = new FileOutputStream("D:\\123.mp4");

            //最核心 一边写 一边读
            byte[] bytes =new byte[1024*1024]; //1MB(一次最多拷贝1MB)
            int aa = 0;
            while ((aa= fis.read(bytes))!=-1){ //Fis.Read(bytes) :往bytes数组中读
                fos.write(bytes,0,aa);  // 然后从数组拿出来 一次写aa个,aa是写入数组的数量
            }

            //刷新 输出流最后要刷新
            fos.flush();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fos == null) {
             // 分开try,不要一起try
             // 一起try的时候,其中一个异常,可能会影响另外一个流的关闭。
                try {
                    fis.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
                try {
                    fos.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }
}

FileReader(读 字符)

**FileReader :文件字符输入流。只能读取普通文本。
读取文本内容时,比较方便,快捷。**

FileReader 和上面 FileInputStream(读 字节)的使用方法一样,直接照葫芦画瓢

public class FileReader读 {
    public static void main(String[] args) {
        FileReader fileReader =  null;
        try {
            //创建文件字符输入流
            fileReader = new FileReader("JAVAse进阶/src/IO流/aa");
            //开始读
            char [] chars = new char[4]; //一次读四个字符
            int red = 0;
            while ((red = fileReader.read(chars))!=-1){
                //使用String构造方法,将char转换为字符串,从0开始,到red结束,转换这么多
                //red返回的是读取字符数量。
                System.out.print(new String(chars,0,red));
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if (fileReader != null) {
                try {
                    fileReader.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

FileWriter (写 字符)

FileWriter: 文件字符输出流,只能输出普通文本。
public class FileWriter写 {
    public static void main(String[] args) {
        FileWriter fileWriter = null;
        try {
            //创建文件字符流对象 清空原文内容在写入
            //fileWriter = new FileWriter("JAVAse进阶/src/IO流/aa");
            //加个ture 表示不清空原文内容,从后面追加
            fileWriter = new FileWriter("JAVAse进阶/src/IO流/aa",true);
            //创建一个char数组
            char[] chars = {'我','是','中','国','人'};
            //全部写出
            fileWriter.write(chars);
            //部分写出,下标从2开始,取三个
            fileWriter.write(chars,2,3);
            //直接传入一个String也是可以的
            fileWriter.write("我是中国人");

            //换行符
            fileWriter.write("\n");
            fileWriter.write("励志当一个程序员");


            //刷新  写出都要刷新
            fileWriter.flush();

        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (fileWriter != null) {
                try {
                    fileWriter.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }
}

复制普通文本文件

使用FileReader, FileWriter进行拷贝的话,只能拷贝“普通文本”文件。
public class 复制普通文本文件 {
    public static void main(String[] args) {
        FileReader du = null;
        FileWriter xie = null;
        try {
            //读
            du = new FileReader("JAVAse进阶/src/IO流/aa");
            //写
            xie = new FileWriter("aa");
            //一边读一边写
            char [] chars = new char[1024*512];
            int aa = 0;
            //du.read(chars) 往chars数组中读
            while ((aa =du.read(chars) )!=-1){
                //读多少写多少
                xie.write(chars,0,aa);
            }
            //刷新
            xie.flush();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            if (xie != null) {
                try {
                    xie.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if (du != null) {
                try {
                    du.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }

    }
}
相关文章
|
15天前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
45 2
|
2月前
|
Java
Java“解析时到达文件末尾”解决
在Java编程中,“解析时到达文件末尾”通常指在读取或处理文件时提前遇到了文件结尾,导致程序无法继续读取所需数据。解决方法包括:确保文件路径正确,检查文件是否完整,使用正确的文件读取模式(如文本或二进制),以及确保读取位置正确。合理设置缓冲区大小和循环条件也能避免此类问题。
|
15天前
|
Java 测试技术 Maven
Maven clean 提示文件 java.io.IOException
在使用Maven进行项目打包时,遇到了`Failed to delete`错误,尝试手动删除目标文件也失败,提示`java.io.IOException`。经过分析,发现问题是由于`sys-info.log`文件被其他进程占用。解决方法是关闭IDEA和相关Java进程,清理隐藏的Java进程后重新尝试Maven clean操作。最终问题得以解决。总结:遇到此类问题时,可以通过任务管理器清理相关进程或重启电脑来解决。
|
19天前
|
存储 缓存 安全
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见
在 Java 编程中,创建临时文件用于存储临时数据或进行临时操作非常常见。本文介绍了使用 `File.createTempFile` 方法和自定义创建临时文件的两种方式,详细探讨了它们的使用场景和注意事项,包括数据缓存、文件上传下载和日志记录等。强调了清理临时文件、确保文件名唯一性和合理设置文件权限的重要性。
42 2
|
28天前
|
存储 安全 Java
如何保证 Java 类文件的安全性?
Java类文件的安全性可以通过多种方式保障,如使用数字签名验证类文件的完整性和来源,利用安全管理器和安全策略限制类文件的权限,以及通过加密技术保护类文件在传输过程中的安全。
|
2月前
|
存储 缓存 Java
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
这篇文章详细介绍了Java中的IO流,包括字符与字节的概念、编码格式、File类的使用、IO流的分类和原理,以及通过代码示例展示了各种流的应用,如节点流、处理流、缓存流、转换流、对象流和随机访问文件流。同时,还探讨了IDEA中设置项目编码格式的方法,以及如何处理序列化和反序列化问题。
83 1
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
|
29天前
|
存储 Java API
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
Java实现导出多个excel表打包到zip文件中,供客户端另存为窗口下载
37 4
|
1月前
|
Java 数据格式 索引
使用 Java 字节码工具检查类文件完整性的原理是什么
Java字节码工具通过解析和分析类文件的字节码,检查其结构和内容是否符合Java虚拟机规范,确保类文件的完整性和合法性,防止恶意代码或损坏的类文件影响程序运行。
|
1月前
|
Java API Maven
如何使用 Java 字节码工具检查类文件的完整性
本文介绍如何利用Java字节码工具来检测类文件的完整性和有效性,确保类文件未被篡改或损坏,适用于开发和维护阶段的代码质量控制。
|
2月前
|
Java
Java开发如何实现文件的移动,但是在移动结束后才进行读取?
【10月更文挑战第13天】Java开发如何实现文件的移动,但是在移动结束后才进行读取?
66 2