首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >第5次文章:关于IO流的基本操作

第5次文章:关于IO流的基本操作

作者头像
鹏-程-万-里
发布2019-09-27 14:23:09
3250
发布2019-09-27 14:23:09
举报

春节假期就要结束啦,很多小伙伴儿明天就开始上班了,祝各位小伙伴儿新的一年工作顺心,万事顺利哟!

本周学习了关于Java中的IO流,IO流中有许多基本的操作方法,此处不便于列举,我们使用三个具体的程序,顺带的整理一下本周的学习情况!

实例一:输出所选文件夹中的所有文件名,包含子孙级文件名

public class Demo05 {
    public static void main(String[] args) {
        String path = "C:\\documents\\java\\公众号运营";
        File src = new File(path);//创建File对象
        printName(src);
    }
    //使用迭代进行输出
    public static void printName(File src) {
        if (null==src||!src.exists()) {//如果为空或者不存在,则直接退出
            return;
        }
        System.out.println(src.getAbsolutePath());//输出绝对路径
        if(src.isDirectory()) {//判断是否为目录
            File[] files = src.listFiles();//以file对象的方式,列举目录下的所有文件及文件夹
            for(File temp:files) {
                printName(temp);//迭代每一个file对象
            }
        }
    }
}

下面对这段代码中的一些细节进行分析:

1、分隔符

在Java中,路径分隔符(;)使用常量:File.pathSeparator,名称分隔符(“/”或“\”)使用常量:File.separator。尤其需要注意名称分隔符,在Windows中,名称分隔符使用斜杠“\”,在Linux以及其他系统中,名称分隔符使用反斜杠“/”。由于在程序编写和使用时,经常会出现在不同的系统中,所以使用分隔符的时候,建议使用常量:File.separator,Java会根据具体环境,进行匹配。

在上面的代码中,第一行路径中出现了“\\”,这是因为Java中的“\”属于转义字符,比如“\t”就代表制表符“tab”键,所以在使用单斜杠的时候,需要在其前面多加一个单斜杠。

2、File对象的创建

File对象的创建可以利用绝对路径和相对路径进行创建。上面的代码中使用的是绝对路径,当我们使用相对路径的时候,Java会默认当前工作空间user.dir为根路径。在创建File对象的时候,仅仅是将路径和File类型的新变量进行了一定的联系,并不会关注其到底有没有真实的存在路径中的文件。

3、关于File的一些基本方法

exist:检查此File对象是否真实的存在。

getAbsolutePath:获取File对象的绝对路径。

getParent:返回File对象的上一级目录。

getName:返回File对象的名称。

isFile:判断其File对象是否是文件。

isDirectory:判断File对象是否是目录。

list:将File对象的目录,以字符串数组的形式返回

listFiles:将File对象的目录,以File数组的形式进行返回

实例二:文件的读取

文件的读取有四个基本步骤:

1、建立联系 File对象

2、选择流:输入流InputStream + FileInputStream

3、读取数据,操作流对象:byte[] car = new byte[10]+read方法

4、释放资源:关闭

public class Demo01 {
    public static void main(String[] args) {
        //1、建立联系File对象
        File src = new File("C:\\documents\\test\\abc.txt\\ABC.txt");
        //2、选择流
        InputStream is = null;//提升作用域
        try {
            is = new FileInputStream(src);
            //3、操作 不断读取 缓冲数组
            byte[] car = new byte[10];
            int len=0;//接收 实际读取的大小
            //循环读取
            while(-1!=(len=is.read(car))) {//将实际读取到的数量返回给len,当读取结束时,返回len=-1
                //输出 字节数组转换为字符串
                String info = new String(car,0,len);
                System.out.println(info);
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            System.out.println("文件不存在");
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("文件读取失败");
        }finally {
            //4、释放资源
            if(null!=is) {
                try {
                    is.close();
                } catch (IOException e) {
                    e.printStackTrace();
                    System.out.println("关闭文件输入流失败");
                }
            }
        }
    }
}

上面的这段代码中,有几个小技巧比较有用,所以来提一下:

1、在第2步选择流的时候,我们读取外部文件,选择输入流InputStream。输入流的使用需要和计算机的操作文件进行交互,所以需要捕获异常,而捕获异常的时候,会将输入流的申明放入代码段try{}中,成为了此代码段的一个局部变量,这样将不利于我们后续在代码段finally{}中释放资源。所以我们将输入流InputStream的申明放在try{}的外部,提升作用域,然后在代码段try{}中进行读取操作。

2、在使用输入流的时候,读取是使用字节数组“byte[]”进行读取,所以当我们需要进行临时的查看时,不能直接对读出来的字节进行查看,而是使用了“String info = new String(car,0,len);”将读取出来的字节数组转化成了字符串,然后再进行查看读取的内容。

3、在捕获异常的时候,为了后续的检查方便,一定要在每个catch中,添加报错的原因,否则,代码运行一旦报错,很难快速定位到报错的原因上,浪费大量时间。

实例三:文件的写出

主要步骤与文件的读入相差不多,也分为4步:

1、建立联系 File对象

2、选择流:输出流 OutputStream + FileOutputStream

3、读取数据,操作流对象:write()+flush

4、释放资源:关闭

public class Demo02 {
    public static void main(String[] args) {
        //1、建立联系 File对象
        String path = "C:\\documents\\test\\abc.txt\\ABC.txt";
        File dest = new File(path); 
        //2、选择流:
        OutputStream os = null;//提升作用域
        try {
            //以追加的形式写入文件,选择true,否则是以覆盖的形式写入文件,默认为false
            //FileOutputStream(File file, boolean append)
            os = new FileOutputStream(dest,true);
            //3、写出数据
            String str = "peng is very good \r\n";
            //写出时注意将字符串转换为字节流
            byte[] car = str.getBytes();
            //将字节流写出到目标文件
            os.write(car, 0, car.length);
            os.flush();//强制刷新出去
        } catch (FileNotFoundException e) {
            e.printStackTrace();
            System.out.println("文件不存在");
        } catch (IOException e) {
            e.printStackTrace();
            System.out.println("写出时失败");
        }finally {
            if(null!=os) {
                try {
                    os.close();
                } catch (IOException e) {
                    e.printStackTrace();
                    System.out.println("关闭输出流文件失败");
                }
            }
        }
    }
}

对文件的写出,与文件读入操作基本一致,这里提一个代码中的写出函数:FileOutputStream(File file, boolean append),当我们在使用输出流函数FileOutputStream时,如果没有将append参数设置为true,则文件写出的时候,将会以覆盖的方式输出到文件。比如,在这段代码中,我们向文件“ABC.txt”中写入字符串数据“peng is very good”,我们将append设置的是true(追加的形式写出),字符串数据不会覆盖“ABC.txt”文件中的原始数据,而是直接在目标文件的后面直接加入字符串“peng is very good”。如果我们将append参数设置为false,或者使用默认值,那么写出的方式将会是“覆盖”,直接将原文件中的所有数据清空,只写入这一个字符串数据“peng is very good”。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-02-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Java小白成长之路 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档