前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java基础差缺补漏系列之I/O流系列1

Java基础差缺补漏系列之I/O流系列1

作者头像
冷环渊
发布2021-10-19 15:33:55
2890
发布2021-10-19 15:33:55
举报
文章被收录于专栏:冷环渊的全栈工程师历程

io流

每日格言:

千里之行,始于足下——老子

file类

文件,目录

文件:内存中存放的数据计算机关机后会消失,要长久的保存数据,就要使用硬盘,光盘等,为了便于数据的管理和检索,引入了文件的概念,可以有一篇文章,一段视频,一个可执行程序。

目录(文件夹):

成千上万的文件,如果不分类的话,会很难管理,于是我们用文件夹去分类,管理。

操作系统:

如果需要查看文件/目录星系,右键属性就好了,

现在我想用java来操纵文件/目录,我该如何?

java程序最典型的特点,面向对象,java程序最擅长的就是操纵对象,盘符上的 文件目录,将它们的各种信息封装,封装成一个对象,

java最擅长就是操作对象,这个对象属于—》file类

盘符上的文件—》封装为对象—?对象属于file类的对象–》有了这个对象,我们的程序就可以直接操作这个对象,通过获取文件的各种信息,还可以对文件进行操作,创建或者删除等等等.

对文件的操作:

代码语言:javascript
复制
   public static void main(String[] args) throws IOException {
        File f = new File("D:\\java工程师\\javaSE代码\\javaSE源码\\javaSE\\src\\test.txt");
        File f1 = new File("D:\\java工程师\\javaSE代码\\javaSE源码\\javaSE\\src\\test.txt");//跨平台建议使用这种
//   常用方法
        System.out.println("文件是否可读 : "+f.canRead());
        System.out.println("文件是否可写 : "+f.canWrite());
        System.out.println("文件的名字 : "+f.getName());
        System.out.println("文件的上级目录 :"+f.getParent());
        System.out.println("是否是一个目录 :"+f.isDirectory());
        System.out.println("是否是一个文件 :"+f.isFile());
        System.out.println("是否隐藏 :"+f.isHidden());
        System.out.println("文件大小 : "+f.length());
//        if (f.exists()){ 如果有那就删除,没有就创建
//                f.delete();
//        }else {
//            f.createNewFile();
//        }
        System.out.println(f==f1);
        System.out.println(f.equals(f1));
        //和路径相关的
        System.out.println("绝对路径 :"+f.getAbsolutePath());
        System.out.println("相对路径 :"+f.getPath());
        System.out.println("toString :"+f.toString());
        File file = new File("demo.txt");
        if (!file.exists()){
            file.createNewFile();//创建到了项目根目录里
        }
//        绝对路径指一个精确,完成的路径
        System.out.println("绝对路径 :"+file.getAbsolutePath());
//        相对路径有一个参会造物,相对这个·参照物的路径
//        相对这个位置,main方法的相对位置为项目根路径
        System.out.println("相对路径 :"+file.getPath());
//        toString的效果永远是相对路径
        System.out.println("toString :"+file.toString());


    }

对目录的操作

代码语言:javascript
复制
    public static void main(String[] args) {
        File f = new File("D:\\java工程师\\javaSE代码\\javaSE源码\\javaSE\\src");
        File f1 = new File("D:\\java工程师\\javaSE代码\\javaSE源码\\javaSE\\src");//跨平台建议使用这种
//   常用方法
        System.out.println("文件是否可读 : "+f.canRead());
        System.out.println("文件是否可写 : "+f.canWrite());
        System.out.println("文件的名字 : "+f.getName());
        System.out.println("文件的上级目录 :"+f.getParent());
        System.out.println("是否是一个目录 :"+f.isDirectory());
        System.out.println("是否是一个文件 :"+f.isFile());
        System.out.println("是否隐藏 :"+f.isHidden());
        System.out.println("文件大小 : "+f.length());

        File f2 = new File("D:\\java工程师\\javaSE代码\\javaSE源码\\javaSE\\src\\a\\b\\c");
//        f2.mkdir();创建单层目录
//        f2.mkdirs();创建多层目录
//        f2.delete();删除,只删除一层,如果是删除目录的话只删除没有内容的,如果有内容就不会删除
        String[] list = f.list();//遍历目录下的对应的名字
        for (String s : list) {
            System.out.println(s);
        }
        System.out.println("============");
        File[] files = f.listFiles();
        for (File file : files) {//作用相对上面发那个发,多了file对象,作用更加广泛
            System.out.println(file.getName());
        }
        }

file:封装文件/目录各种信息,对文件和目录进行操作,但是我们不可以获取到文件和目录的内容,

于是乎!io!!!流!!!

字符流

IO流体系结构:

I/O:input/output的缩写,用于处理设备之间的数据的传输

形象理解:

案例:通过java程序完成文件的复制

功能分解:使用到第一个流 file reader

功能分解1:初体验io流的文件内容读取

代码语言:javascript
复制
public static void main(String[] args) throws IOException {
//        文件--》程序
//        1.有一个文件---》创建file类对象
        File file = new File("D:\\java工程师\\javaSE代码\\javaSE源码\\javaSE\\demo.txt");
//        2.利用filereader这个流将流连接到源文件--》file流对象
        FileReader fr = new FileReader(file);
//        3.进行操作 --》读取操作
//        下面的代码我们验证了,如果到了文件的结尾,那么读取的内容为-1
/*
        int i = fr.read();
        int i2 = fr.read();
        int i3 = fr.read();
        int i4 = fr.read();
        int i5 = fr.read();
        System.out.println(i);
        System.out.println(i2);
        System.out.println(i3);
        System.out.println(i4);
        System.out.println(i5);
        */
//方法一
//        int i = fr.read();
//        while (i!=-1){
//            System.out.println(i);
//            i = fr.read();
//        }
//        方法二
        int i =0;
        while ((i = fr.read())!=-1){
            System.out.print((char) i);
        }
//        4.关闭流--》关闭
//        流,数据库,网络资源,考jvm无法帮助我们关闭,必须程序元手动关闭
        fr.close();
    }

新需求,我每次读取5个,不够我在继续读,读到没有为止。

代码语言:javascript
复制
 public static void main(String[] args) throws IOException {
        //        1.有一个文件---》创建file类对象
        File file = new File("D:\\java工程师\\javaSE代码\\javaSE源码\\javaSE\\demo.txt");
//        2.利用filereader这个流将流连接到源文件--》file流对象
        FileReader fr = new FileReader(file);
//        3.进行操作 --》读取操作
        char [] ch = new char[5];
        int len = fr.read(ch);//一次读取五个,返回值是数组中的有效长度
        while (len!=-1){
/*            方法1
        for (int i = 0; i < len; i++) {
                System.out.println(ch[i]);
            }
            System.out.println("!");
            len = fr.read(ch);*/

            String str  = new String(ch,0,len);
            System.out.println(str);
            len = fr.read(ch);
        }
//        4.关闭操作
        fr.close();
    }

利用缓冲数组,做一个操作

功能分解2:程序输出文件,filewriter

一个一个向外输出

代码语言:javascript
复制
 public static void main(String[] args) throws IOException {
//目标文件
       File file = new File("D:\\java工程师\\javaSE代码\\javaSE源码\\javaSE\\demo01.txt");
//      fw连接到文件
        FileWriter fw = new FileWriter(file);
//开始操作
        String str = "你好,小朋友";
        for (int i = 0; i < str.length(); i++) {
            fw.write(str.charAt(i));
        }
//        关闭流
        fw.close();
    }

发现:如果目标文件不存在,会自动创建文件写入,如果存在,

new FileWriter(file);,相当于对源文件覆盖,而并不是追加

new FileWriter(file,true);为true的时候才会有追加操作

new FileWriter(file,false);为false的时候会是覆盖操作,默认也是覆盖

批量,使用缓冲数组向外输出,

代码语言:javascript
复制
package TestIO.com.hyc.IO01;

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

public class Test03 {
    public static void main(String[] args) throws IOException {
//目标文件
       File file = new File("D:\\java工程师\\javaSE代码\\javaSE源码\\javaSE\\demo01.txt");
//      fw连接到文件
        FileWriter fw = new FileWriter(file,true);//追加

//开始操作
        String str = "老子开心";
        char[] ch =str.toCharArray();
        fw.write(ch);

//        关闭流
        fw.close();
    }
}

接下来是合并操作!

使用reader和writer完成文件复制
代码语言:javascript
复制
package TestIO.com.hyc.IO01;


import java.io.*;

public class Test04 {
    public static void main(String[] args) throws IOException {
//        创建file类
//        一个复制本体,一个是接受复制
        File file = new File("D:\\java工程师\\javaSE代码\\javaSE源码\\javaSE\\demo01.txt");
        File file2 = new File("D:\\java工程师\\javaSE代码\\javaSE源码\\javaSE\\demo02.txt");
//        创建输出流
        FileReader reader = new FileReader(file);
//        FileReader reader1 = new FileReader(file2);
        FileWriter writer = new FileWriter(file2,true);//用追加的形式不用覆盖的形式

        //region 1.一个一个字符的形式
        int n = reader.read();
        while (n!=-1){
                writer.write(n);
                n = reader.read();
        }
        //endregion
        //region 2.缓冲数组的形式
        char[] ch = new char[5];
        int len = reader.read(ch);
        while (len!=-1){
            writer.write(ch,0,len);//输出缓冲数组有效的长度
            len = reader.read(ch);
        }

        //region 3.缓冲数组转成字符串的形式
        char[] ch1 = new char[5];
        int len1 = reader.read(ch1);
        while (len1!=-1){
            String s =new String(ch1,0,len1);
            writer.write(s);//输出缓冲数组有效的长度
            len1 = reader.read(ch1);
            System.out.println(len1);
        }
        //endregion
//关闭流,后用先关
        writer.close();
        reader.close();

    }
}

注意:不要用字符流去操作文本格式以外的文件!!!!!!!!!!!

好好学习,每天都在进步!!!!!!

我的博客即将同步至腾讯云+社区,邀请大家一同入驻:https://cloud.tencent.com/developer/support-plan?invite_code=3btqwmdvn4cgo

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2021/08/22 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

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

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

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • io流
    • 每日格言:
      • file类
        • 字符流
          • 功能分解:使用到第一个流 file reader
          • 功能分解2:程序输出文件,filewriter
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档