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();
                }
            }
        }

    }
}
相关文章
|
19小时前
|
安全 Java 开发者
Java一分钟之-文件与目录操作:Path与Files类
【5月更文挑战第13天】Java 7 引入`java.nio.file`包,`Path`和`Files`类提供文件和目录操作。`Path`表示路径,不可变。`Files`包含静态方法,支持创建、删除、读写文件和目录。常见问题包括:忽略异常处理、路径解析错误和权限问题。在使用时,注意异常处理、正确格式化路径和考虑权限,以保证代码稳定和安全。结合具体需求,这些方法将使文件操作更高效。
8 2
|
23小时前
|
Java ice
【Java开发指南 | 第二十一篇】Java流之文件
【Java开发指南 | 第二十一篇】Java流之文件
5 0
|
3天前
|
Java 开发者
Java一分钟之-Java IO流:文件读写基础
【5月更文挑战第10天】本文介绍了Java IO流在文件读写中的应用,包括`FileInputStream`和`FileOutputStream`用于字节流操作,`BufferedReader`和`PrintWriter`用于字符流。通过代码示例展示了如何读取和写入文件,强调了常见问题如未关闭流、文件路径、编码、权限和异常处理,并提供了追加写入与读取的示例。理解这些基础知识和注意事项能帮助开发者编写更可靠的程序。
14 0
|
4天前
|
Java
JDK环境下利用记事本对java文件进行运行编译
JDK环境下利用记事本对java文件进行运行编译
14 0
|
6天前
|
Arthas 安全 Java
java服务报错 FileNotFoundException:打开的文件过多
java服务报错 FileNotFoundException:打开的文件过多
15 0
|
8天前
|
存储 缓存 Java
Java IO 流详解
Java IO 流详解
16 1
|
10天前
|
Oracle Java 关系型数据库
windows 下 win11 JDK17安装与环境变量的配置(配置简单详细,包含IJ中java文件如何使用命令运行)
本文介绍了Windows 11中安装JDK 17的步骤,包括从官方网站下载JDK、配置环境变量以及验证安装是否成功。首先,下载JDK 17的安装文件,如果没有Oracle账户,可以直接解压缩文件到指定目录。接着,配置系统环境变量,新建`JAVA_HOME`变量指向JDK安装路径,并在`Path`变量中添加。然后,通过命令行(cmd)验证安装,分别输入`java -version`和`javac -version`检查版本信息。最后,作者分享了如何在任意位置运行Java代码,包括在IntelliJ IDEA(IJ)中创建的Java文件,只需去掉包声明,就可以通过命令行直接运行。
|
12天前
|
存储 监控 Java
如何在Java中实现等待文件修改后再读取数据的功能?
如何在Java中实现等待文件修改后再读取数据的功能?
18 0
|
12天前
|
存储 Java
Java的`java.io`包包含多种输入输出类
【5月更文挑战第2天】Java的`java.io`包包含多种输入输出类。此示例展示如何使用`FileInputStream`从`input.txt`读取数据。首先创建`FileInputStream`对象,接着分配一个`byte`数组存储流中的数据。通过`read()`方法读取数据,然后将字节数组转换为字符串打印。最后关闭输入流释放资源。`InputStream`是抽象类,此处使用其子类`FileInputStream`。其他子类如`ByteArrayInputStream`、`ObjectInputStream`和`BufferedInputStream`各有特定用途。
28 1
|
12天前
|
存储 Java 数据格式
Java实战:轻松掌握文件重命名与路径提取技巧
Java实战:轻松掌握文件重命名与路径提取技巧
19 0