JAVA基础-----IO流基本概念


前言

其实写io流类的文章有很多,不过近期要考试了,内容是io流,就当整理下来复习一下,也许写的和很多大佬相比相差很多,所以不足之处还请各位师傅不吝赐教。本博文代码主要参考b站鸟哥JAVA零基础之IO流详解视频【IntelliJ IDEA版-输入输出流】以及自己的一些补充。


在这里插入图片描述

一、文件的简单操作

1.文件的创建

书上对于io流的讲解较为生涩,先从文件的处理入手,下面代码演示的是创建一个新的文件,是否成功取决于你电脑此路径下有没有这个文件,如果文件存在那么创建失败,如果不存在则创建成功
同理,我们对于文件夹,以及文件夹下套文件夹,也就是多级文件夹都可以进行相似的操作,具体操作如代码所示。

package homework;//CSDN-敲代码的xiaolang

import java.io.File;
import java.io.IOException;

public class File_Demo01 {
    public static void main(String[] args) {
        try {

            File file1 = new File("E:\\test.txt");
            boolean flag1 = file1.createNewFile();//创建一个新的文件,如果文件存在那么创建失败,如果不存在则创建成功。
            System.out.println(flag1?"文件创建成功":"文件创建失败");

            File file2 = new File("E:\\java_test");
            boolean flag2 = file2.mkdir();//创建一个新的文件夹
            System.out.println(flag2?"文件夹创建成功":"文件夹创建失败");

            File file3 = new File("E:\\java_io\\io\\test");
            boolean flag3 = file3.mkdirs();//创建一个新的多级文件夹
            System.out.println(flag3?"多级文件夹创建成功":"多级文件夹创建失败");

        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

运行结果如图所示,你也可以在你的电脑对应路径下面找到相应的文件。
在这里插入图片描述
在这里插入图片描述

2.文件的删除

对于删除操作,这里先简单使用delete方法,我们直接让文件去调用即可。

package homework;//CSDN-敲代码的xiaolang

import java.io.File;

public class File_Demo02 {
    public static void main(String[] args) {
        File file1 = new File("E:\\test.txt");
        boolean flag = file1.delete();
        System.out.println(flag?"文件删除成功":"文件删除失败");
    }
}

在这里插入图片描述

3.文件是否存在

原理也是比较简单的,我们先判断是否存在,使用exists方法。

package homework;//CSDN-敲代码的xiaolang

import java.io.File;

public class File_Demo03 {
    public static void main(String[] args) {
        File file = new File("E:\\test");
        boolean flag = file.exists();
        if(flag){
            System.out.println("文件已经存在");
        }else{
            file.mkdir();
        }
    }
}

在这里插入图片描述

4.文件内所包含字节数

我们事先在file文件里面写入xiaolang,然后使用length方法去返回所含字节的大小。

String字符串:length(),返回字符串中字符的个数
数组,数组名.length ,属性,获取数组里面元素的个数
集合, 集合对象名.size(),返回集合中元素的个数

package homework;//CSDN-敲代码的xiaolang

import java.io.File;
import java.io.IOException;

public class File_Demo04 {
    public static void main(String[] args) {
        File file = new File("E:\\xiaolang.txt");
        try {
            file.createNewFile();
            Long size = file.length();
            System.out.println("size="+size);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

在这里插入图片描述
在这里插入图片描述

5.文件的名字和路径

package homework;//CSDN-敲代码的xiaolang

import java.io.File;
import java.io.IOException;

public class File_Demo04 {
    public static void main(String[] args) {
        File file = new File("E:\\xiaolang.txt");
        try {
            String fileName = file.getName();
            System.out.println("fileName="+fileName);

            String path = file.getPath();
            System.out.println("path="+path);

        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

在这里插入图片描述

6.使用递归的方法扫描文件夹

思路就是:先判断文件是否是文件夹,是文件夹的话,选择某个文件夹下所有文件,如果不是文件夹,获取此文件夹的路径。

package homework;//CSDN-敲代码的xiaolang

import java.io.File;

public class File_Demo05 {
    public static void showFile(String pathname){
        File file = new File(pathname);
        boolean flag = file.isDirectory();
        if(flag){
            File[] files = file.listFiles();
            for(int i =0;files!=null&&i<files.length;i++){
                boolean flag1 = files[i].isDirectory();
                if(flag1){
                    showFile(files[i].getPath());
                }else{
                    String filePath = file.getPath();
                    System.out.println("普通文件---》"+filePath);
                }
            }
        }else{
            String filePath = file.getPath();
            System.out.println("普通文件---》"+filePath);
        }
    }

    public static void main(String[] args) {
        File_Demo05.showFile("E:\\");//扫描E盘
    }
}

我的E盘基本没有文件,所以比较容易看到所有的结果。
在这里插入图片描述

二、输入输出流

首先用一张图带你了解基本模式:
在这里插入图片描述

1.FileInputStream

代码部分注释掉的部分和下面引用中代码的意思是一样的,只不过更加简洁。

FileInputStream fileInputStream = new FileInputStream(“E:\xiaolang.txt”);

package homework;//CSDN-敲代码的xiaolang

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;

public class File_Demo06 {
    public static void main(String[] args) {
        try {
             /*File file = new File("E:\\xiaolang.txt");
            if(file.exists()&&file.length()>0){
            FileInputStream fileInputStream = new FileInputStream(file);
        }*/
            FileInputStream fileInputStream = new FileInputStream("E:\\xiaolang.txt");

            int ch = 0;
            while((ch=fileInputStream.read())!=-1){
                System.out.println((char)ch);//控制换行
            }
            fileInputStream.close();
        } catch (Exception e) {
            System.out.println("文件找不到");
        }
    }
}

在这里插入图片描述

2.FileOutputStream

下面的栗子是我在E盘创建了一个文件,然后把它拷贝到我们的D盘去,这里注意使用file去调用read方法,而使用file1去调用write方法,然后我们统计一下所需要耗费的时间。

package homework;//CSDN-敲代码的xiaolang

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

public class File_Demo08 {
    public static void main(String[] args) {
        try {
            long startTime = System.currentTimeMillis();
            FileInputStream file = new FileInputStream("E:\\xiaolang.txt");
            FileOutputStream file1 = new FileOutputStream("D:\\xiaolang.txt");
            int ch = 0;
            while ((ch = file.read()) != -1) {
                file1.write(ch);
            }
            file.close();
            file1.close();
            long endTime = System.currentTimeMillis();
            System.out.println("共消耗"+(endTime-startTime)+"ms");
        } catch (Exception e) {
            System.out.println("文件找不到");
        }
    }
}

在这里插入图片描述

3.BufferedInputStream

我们对上面的栗子进行一些改动,我们使用BufferedInputStream去更快的读取文件,BufferedInputStream继承于FilterInputStream,本质上是通过一个内部缓冲区数组实现的,用read读取输入流的数据时,BufferedInputStream会将该输入流的数据分批次的导入缓冲区。当缓冲区中的数据被读完后,输入流会再次填充缓冲区中的数据;如此循环往复下去,直到读完输入流数据结束。

package homework;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;

public class File_Demo09 {
    public static void main(String[] args) {
        InputStream inputStream = null;
        try {
            inputStream = new FileInputStream("E:\\xiaolang.txt");
            BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
}

获取时间差和所含字节数:

package homework;//CSDN-敲代码的xiaolang

import jdk.swing.interop.SwingInterOpUtils;

import java.io.BufferedInputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;

public class File_Demo09 {
    public static void main(String[] args) {
        InputStream inputStream = null;
        try {
            long startTime = System.currentTimeMillis();
            inputStream = new FileInputStream("E:\\xiaolang.txt");
            BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
            byte[] temp = new byte[1024];
            int len = 0;
            while((len = bufferedInputStream.read(temp))!=-1){
                System.out.println(len);
            }
            long endTime = System.currentTimeMillis();
            System.out.println("共消耗"+(endTime-startTime)+"ms");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

在这里插入图片描述

4.FileReader读取文件所含字节数

package homework;//CSDN-敲代码的xiaolang

import java.io.FileNotFoundException;
import java.io.FileReader;

public class File_Demo10 {
    public static void main(String[] args) {
        try {
            FileReader fileReader = new FileReader("E:\\xiaolang.txt");
            char[] temp = new char[1024];
            int len = 0;
            while((len=fileReader.read(temp))!=-1){
                System.out.println(len);
            }
            fileReader.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

在这里插入图片描述

5.FileReader获取文本内容

package homework;//CSDN-敲代码的xiaolang

import java.io.FileNotFoundException;
import java.io.FileReader;

public class File_Demo10 {
    public static void main(String[] args) {
        try {
            FileReader fileReader = new FileReader("E:\\xiaolang.txt");
            char[] temp = new char[1024];
            int len = 0;
            while((len=fileReader.read(temp))!=-1){
                String s = new String(temp,0,len);
                System.out.println(s);
            }
            fileReader.close();
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

在这里插入图片描述

6.FileWriter修改文本内容

这个栗子是直接写入:“玛卡巴卡balabala”

package homework;//CSDN-敲代码的xiaolang

import java.io.FileWriter;
import java.io.IOException;

public class File_Demo11 {
    public static void main(String[] args) {
        try {
            String s = "玛卡巴卡balabala";
            FileWriter fileWriter = new FileWriter("E:\\makabaka.txt");
            fileWriter.write(s);
            fileWriter.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

而这个是使用追加模式,将内容添加到上一次文本编辑的末尾,如果不使用append模式,那么你的文本文件会被新的文件内容给覆盖。

package homework;//CSDN-敲代码的xiaolang

import java.io.FileWriter;
import java.io.IOException;

public class File_Demo11 {
    public static void main(String[] args) {
        try {
            String s = "这是新的内容";
            FileWriter fileWriter = new FileWriter("E:\\makabaka.txt",true);
            fileWriter.write(s);
            fileWriter.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

三、方法总结

1.输入流

InputStream类是字节输入流的抽象类,是所有字节输入流的父类。

read()方法:读取数据的下一个字节,如果到达流末尾而无可用字节,那么返回-1,返回值是0~255的int字节值。

read(byte[ ]b): 读取一定长度的字节,以整数形式返回字节数。

mark(int readlimit): 在当前位置放置一个标志,readlimit参数告知此输入流在标记位置失效前允许读取的字节数。

reset():将输入指针返回当前所作的标记处。

skip(long n):跳过输入流上的n个字节,并且返回实际跳过的字节数。

close(): 关闭此输入流,并且释放相关资源。

此处使用的InputStream来处理我们的字节,但是此方法并不适合用来处理所含字符的文本,对于字符的处理,我们使用的是java里面提供的Reader类去处理,这里的Reader类是字符输入流的抽象类,我们所有的字符输入流的实现都是它的子类。

2.输出流

write(int b):将指定的字节写入此输出流里面。

write(byte[ ] b):将b个字节从指定的byte数组写入此输出流内。

write(byte[ ] b, int off, int len):将指定的byte数组里面,从off的偏移量开始,读取len个字节写入此输出流里面。

flush():彻底完成输出并清空缓存区。

close():关闭输出流。

3.带缓存的输入、输出流

BufferedInputStream(InputStream in) : 此构造方法创建了一个带有32个字节的缓存流。
BufferedInputStream(InputStream in, int size) : 此方法按指定大小创建缓存区。

BufferedOutputStream(OutputStram in) : 创建一个有32个字节的缓存区。
BufferedOutputStream(OutputStream in, int size) : 以指定大小创建缓存区。

BufferedReader类常用方法:
read( ) :读取单个字符。
readLine( ) : 读取一个文本行,并将其返回为字符串,当没有数据的时候,返回null。

BufferedWriter类常用方法:
此方法返回类型均为void 。
write(String s,int off, int len) : 写入字符串的某一个部分。
flush():刷新该流的缓存。
newLine():写入一个行分隔符。

4.数据输入、输出流

DataInputStream(InputStream in):使用指定的InputStream创建一个DataInputStream。
DataOutputStream(OutputStream out) : 创建一个新的数据输出流,将数据写入指定的输出流。

DataOutputStream类的三种写入字符串的方法:
writeBytes(String s) :
将字符串里面的每一个字符的低字节内容写入目标设备。
(在编程语言中,字符一般是占16位,8位为一字节,所以有高位字节和低位字节。高字节就是指16进制数的前8位。低字节就是指16进制数的后8位。)

writeChars(String s) :
将字符串里面每一个字符的两个字节内容都写入目标设备里面。

writeUTF(String s) :
将字符串按照UTF编码后的字节长度写入目标设备里面。


还有很多操作没有在此写道,本博文只是记录了常用的方法,笔者才疏学浅,如有不足,欢迎各位师傅不吝赐教。
在这里插入图片描述

  • 24
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 27
    评论
评论 27
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

敲代码的xiaolang

你的鼓励是我最大的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值