javaio流比较完整的总结

javaio流总结

File类介绍

1.File类的理解:

  1. file类的一个对象,代表了一个文件或者文件夹
  2. file类声明在java.io包下
  3. file类涉及到文件或者目录的创建,删除,重命名,查看等方法,并未涉及到写入或者读取文件内容的操作,如果需要写入或者读取需要通过io流来完成
  4. 后续file类的对象常作为参数传递到流的构造器中,指明读取或写入的终点

2.File类的实例化

  1. 常用的构造器

    File(String filePath)

    File(String parentPath,String childPath)

    File(File parentFile,String childPath)

  2. 路径的分类

    相对路径:相较于某个路径下,知名的路径

    绝对路径:包含盘符在内的文件或者文件夹路径

  3. 路径分隔符

    windows和dos系统默认使用"\"来表示

    unix和url使用"/"来表示

3.File类中的一些常用方法

public String getAbsolutePath()//获取绝对路径

public String getPath()//获取路径

public String getName()//获取名称

public string getParent()//获取上层文件目录路径,若无返回null

public long length()//获取文件长度(即:字节数),不能获取目录的长度

public long lastModified()//获取最后一次修改的时间,毫秒值

public String[] list()//获取指定目录下的所有文件或者文件目录的名称数组

public boolean renameTo(File dest)//把文件重命名为指定的文件路径

public boolean isDirectory()//判断是否是文件夹

public boolean isFile()//判断是否是文件

public boolean exists()//判断是否存在

public boolean canRead()//判断是否可读

public boolean canWrite()//判断是否可写

public boolean isHidden()//判断是否隐藏

public boolean createNewFile()//创建文件

public boolean mkdirs()//创建目录

public boolean delete()//删除文件或者目录,如果是删除目录,那么目录下不能有文件或者文件夹

IO流介绍

io流是什么:i代表input输入,o代表output输出

输入输出流的意思:Java程序进行数据传输的管道,这个流就是管道的意思

  • I/O是Input/Output的缩写,I/O技术是非常实用的技术,用于处理设备之间的数据传输。如读写文件,网络通信等。
  • java程序中,对于数据的输入/输出操作以流stream的方式进行
  • java.io包下提供了各种流类和接口,用以获取不同种类的数据,并通过标准的方法输入或输出数据

输入:读取外部数据(磁盘,光盘等存储设备的数据)到程序(内存)中

输出:将程序(内存)的数据输出到磁盘,光盘等存储设备中

我们应该处在程序中来判断这是输入还是输出,不应该从内存的位置来看

io流的分类:

  • 按操作数据单位不同分为:字节流(8bit)(非文本的数据都主要用字节流来处理)和字符流(16bit)(文本数据主要用字符流来处理)
  • 按数据流的流向不同可以分为:输入流和输出流
  • 按流的角色不同分为:节点流和处理流

下面来看具体的一个图

主要解释一下节点流和处理流

节点流就相当于直接用一根管道把数据和程序连接起来,而处理流就是在这个管道的上面再加上一个管道,可以加速数据的传输,处理流可以多次叠加

流的分流

java的Io流共涉及到40多个类,实际上非常规则都是,都是从下面这四个基类派生的,这些子类名称都是父类名称作为后缀的

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Ma27rhF4-1604632941624)(C:\Users\24239\Desktop\数据库截图\屏幕截图 2020-11-05 092026.png)]

下面来看下io流的一个体系
io流体系

在这上面中处了访问文件的四个流是节点流之外,它以下的所有流都是处理流,其中蓝色表示的流是主要用到的流

当我们看到一个流时,应该马上就能知道它是出于什么流,我们主要通过流的后面部分来判断这是一个什么流。

FileReader流和FileWriter流的操作

我们可以通过FileReader来读取文件,通过FileWriter来写入文件,结合两种可以进行文件的复制,但是不能用来处理图片,下面通过代码来看下

public class FileReaderWriterTest {
   
    private FileReader filereader;
    //单元测试Test,这个也是可以运行的,和Main方法中的相对路径的不同
    //单元测试中的相对路径是基于Module的
    //Main方法中的相对路径是基于Project的
    @Test
    //throws没有try catch finally 好用
    public void fileReaderTest01()  {
   
        //为了保证流资源一定可以执行关闭操作,需要使用try-catch-finally
        try {
   
            //这个相对路径是较于当前Module中的(io流)
            //1、实例化File对象,指明我们要操作的文件
            //读入的文件一定要存在,不然会出现错误
            File file = new File("hello.txt");
            //2、提供具体的流,流的实例化
            filereader = new FileReader(file);
            //3、数据的读入
            //read():返回读入的一个字符,如果达到末尾,返回-1
            //字符char是可以自动转换成为int的
            //方式一
        /*int data = filereader.read();//data返回的是-1表示文件已经读完
        while (data != -1) {
            System.out.print((char) data);
            data = filereader.read();
        }*/
            //方式二,语法上的修改
            int data1;
            while ((data1 = filereader.read()) != -1){
   
                System.out.print((char)data1);
            }
        } catch (IOException e) {
   
            e.printStackTrace();
        } finally {
   
            //4、流的关闭操作
            try {
   
                filereader.close();
            } catch (IOException e) {
   
                e.printStackTrace();
            }
        }
    }

    //对read()操作升级,使用read的重载方法
    @Test
    public void FileReaderTest02(){
   
        FileReader f1 = null;
        try {
   
            //File类的实例化
            File file = new File("hello.txt");
            //FileReader流的实例化
            f1 = new FileReader(file);
            //读取的操作
            //read(char[] cbuf):返回每次读入cbuf数组中的字符个数,达到文件末尾返回-1
            char[] cbuffer = new char[1024];
            int data ;
            while ((data = f1.read(cbuffer)) != -1){
   
                //方式一
//                for (int i = 0; i < cbuffer.length; i++) {
   
//                    System.out.print(cbuffer[i]);
//                }这样写是有问题的,当最后读取的字符不够五个时,依然是输出五个字符,因为它是采用填充式的
//                ,不够的字符依然采用上一次没有被覆盖的字符
                //正确的写法
                for (int i = 0; i < data; i++) {
   
                    System.out.print(cbuffer[i]);
                }
                //方式二
//                String str = new String(cbuffer);
//                System.out.println(str);
//                这种错误和方式一中的错误是一样的,都会多输出
                //正确方式
                //这个构造器就是输出你输入进来的字符个数,
                /*String str = new String(cbuffer,0,data);
                System.out.println(str);*/
            }
        } catch (IOException e) {
   
            e.printStackTrace();
        } finally {
   
            if(f1 != null){
   
                try {
   
                    //资源的关闭
                    f1.close();
                } catch (IOException e) {
   
                    e.printStackTrace();
                }
            }
        }
    }
    //从内存中写出数据到硬盘文件中
    /*
    * 说明
    * 输出操作,对应的File可以不存在,如果不存在,在输出地过程中会自动地创建
    *               如果存在,想要接着写,就要在创建FileWriter流的时候,进行说明
    *               fw = new FileWrite
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值