Java17:IO流

news2024/9/20 8:11:31

一:File类:

1.File类的理解:

1.File类的一个对象,代表一个文件或一个文件目录(俗称:文件夹)

2.File类声明在java.io包下

3.File类中涉及到关于文件或文件目录的创建,删除,重命名,修改时间,大小等方法

并涉及到写入或读取文件 内容的操作。如果需要读取或写入文件内容,必须使用IO流来完成

4.后续File类的对象常会作为参数传递到流的构造器中,指明读取或写入的“终点”。

2.File类的实例化

2.1 常用构造器

File(String filePath)

File(String parentPath,String childPath)

File(File parentFile, String chilPath)

2.2 路径的分类

相对路径:相较于某个路径下的,指明的路径

绝对路径: 包含盘符在内的文件或文件目录的路径

说明:如果大家开发中使用JUnit中的单元测试方法测试,相对路径即为当前Module下。

如果大家使用main()测试,相对路径为当前project 下

2.3 路径分隔符

windows:\\

unix:/

public void test1(){
    //构造器1:相对路径
    File file = new File("hello.txt");
    System.out.println(file);
    //构造器1:绝对路径
    File file1 =new File("D:\\java\\TestDemo1\\h1.txt");
    System.out.println(file1);
    //构造器2
    File file2 =new File("D:\\java\\TestDemo1","filetest");
    System.out.println(file2);
    //构造器3
    File file3 =new File(file2,"h3.txt");
    System.out.println(file3);

}

3.File类的常用方法

file类的获取功能

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

public  String  getPath():获取路径

public String getName():获取名称

public String getParent():获取上层文件目录的路径。若无返回null

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

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

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

public  File() listFiles():获取指定目录下的所有文件或文件目录的File数组

file类的重命名功能

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

file类的判断功能

public  boolean isDirectory(): 判断是否是文件目录

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

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

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

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

public  boolean isHidden(): 判断是否可读

file类的创建功能

public  boolean createNewFile(): 创建文件。若文件存在,则不创建,返回flase

public  boolean mkdir():创建文件目录。如果此文件目录存在,就不创建了。如果

此文件目录的上次目录不存在,也不创建

public  boolean mkdirs():创建文件目录。如果此文件目录的上次目录不存在,一并创建

注意事项: 如果你创建文件或文件目录没有写盘符路径,那么默认在项目路径下

file类的删除功能

public  boolean delete():删除文件或者文件夹:

注意事项:

java 中删除不走回收站。 要删除一个文件目录,请注意该文件目录内不能包含文件或文件目录

代码示例:

@Test
public void test5(){
    File file2 =new File("D:\\java\\TestDemo1\\IOtest","filetest");

    if(!file2.exists()){
        file2.mkdirs();
        System.out.println("创建成功!");
    }else{

        file2.delete();
        System.out.println("删除成功!");
    }
}
@Test
public void test6() {
    //判断指定目录是否由以.jpg 结尾的文件,如果有输出文件名称
    File file = new File("D:\\java");
    String[] list= file.list();

     for(String str: list){

         if(str.endsWith(".jpg")){

             System.out.println("以jpg结尾的文件是:"+str);
         }
     }

}

二:IO流概述:

1.流的概述

》操作数据单位:字节流,字符流

》数据的流向:输入流,输出流

》流的角色;j节点流,处理流

2.流的体系结构

3. 重点说明的几个流结构

抽象基类         节点流(或文件流)                                            缓冲流(处理流的一种)

InputStream   FileInputStream (read(byte[] buffer))   BufferedInputStream (read(byte[]buffer)) 

OutputStream   FileOutputStream(write(byte[] buffer,0,len)) BufferedOutputStream(write(byte[]                                                                                                                                           buffer,0,len))

Reader              FileReader(read(char[]  cbuf))             BufferedReader(read(char[]  cbuf)                                                                                                                                  /readline()                                                                                                                                                      

Writer                FileWriter(write(char[]  cbuf,0,len))          BufferedWriter(write(char[]  cbuf,0,len))

4.输入,输出的标准过程

4.1输入过程

①创建FIle的对象,指明读取的数据来源。(要求文件一定存在)

②创建相应的输入流,将File类的对象作为参数,传入流的构造器中

③具体的读入过程

创建相应的byte[]或char[]

④关闭流资源

说明:程序中出现的异常需要使用try-catch-finally处理

4.2输出过程

①创建FIle的对象,指明写出的数据来源。(不要求文件一定存在)

②创建相应的输出流,将File类的对象作为参数,传入流的构造器中

③具体的写出过程

write(char[]/byte[],0,len)   

④关闭流资源

说明:程序中出现的异常需要使用try-catch-finally处理

三:节点流:

1.FileReader/FileWriter的使用

1.1 FileReader的使用

说明点:

1.read()的理解:返回读入的一个字符。如果达到文件末尾,返回-1;

2.异常的处理:为了保证流资源一定可以执行关闭操作,需要使用try-catch-finally处理

3.读入的文件一定要存在,否则就会报FileNotFoundException

@Test
public void test1() {

    //创建文件
    File file = null;
    FileReader fr = null;
    try {
        file = new File("hello.txt");

        /* 创建字符输入流 */
        
        fr = new FileReader(file);

        int data;
        //每次读取一个字符并返回,当读到末尾,返回-1
        while ((data = fr.read()) != -1) {
            System.out.print((char) data);
        }
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    }
    //关闭字符流
    catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {

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


}

@Test
public void test2() throws IOException {
    //创建文件
    File file = new File("hello.txt");
    //创建输入流
    FileReader fr = new FileReader(file);


    char[] cbuff = new char[5];
    int len;
    //读入文件,返回读取个数,读取完成返回-1
    while ((len = fr.read(cbuff)) != -1) {

        String str = new String(cbuff, 0, len);
        System.out.print(str);
    }
    fr.close();

}

1.2 FileWriter的使用

说明点:

1.输出操作,对应的File可以不存在的。并不会报异常

2.   

 File对应的硬盘中的文件如果不存在,在输出的过程中,会自动创建此文件

 File对应的硬盘中的文件如果存在,

  如果流使用的构造器是:FileWriter(file,false):对原文件的覆盖

  如果流使用的构造器是:FileWriter(file,true): 不会对原文件覆盖,而是在 原文件基础上,追加内容

@Test
public void test3() {
    FileWriter fw = null;

    try {
        //创建文件
        File file = new File("hello1.txt");

        //创建输出流
        fw = new FileWriter(file);

        //写出内容
        fw.write("hello");
        fw.write("world");
        fw.write("123");
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        //关闭流
        try {
            fw.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

1.3 文本文件的复制:

@Test
public void test4() {

    //创建文件
    FileReader fr = null;
    FileWriter fw = null;
    try {
        File file = new File("hello.txt");
        File file2 = new File("hello2.txt");
        //创建输入,输出流
        fr = new FileReader(file);
        fw = new FileWriter(file2);
        //拷贝文件
        char[] cbuff = new char[5];
        int len;
        while ((len = fr.read(cbuff)) != -1) {

            fw.write(new String(cbuff, 0, len));
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
    }
    //关闭流
    try {
        if( fw!=null)
        { fw.close();}

    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        try {
            if( fr!=null)
            {  fr.close();}
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}InputStream

2.FileInputStream/FileOutputStream的使用

1.对文本文件(.txt,.java ,  .c, .cpp)使用字符流处理

2.对于非文本文件(.jpg, .mp3,.mp4,.avi, .doc,.ppt....)使用字节流处理

@Test
public void test5() {
    /*
    字节流实现图片复制
     */
    FileInputStream fis = null;
    FileOutputStream fos = null;
    try {
        //创建文件
        File file = new File("cat.jpg");
        File file2 = new File("cat2.jpg");
        //创建字节流
        fis = new FileInputStream(file);
        fos = new FileOutputStream(file2);
        //读写文件
        int len;
        byte[] bytes = new byte[10];
        while ((len = fis.read(bytes)) != -1) {
            fos.write(bytes, 0, len);

        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
    }
    //关闭流
    if (fis != null) {
        try {
            fis.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    if (fos != null)
        try {
            fos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }


}
//封装复制方法
public void InputOutputCopyFile(String srcpath, String destpath) throws IOException {
    //创建文件
    File file = new File(srcpath);
    File file2 = new File(destpath);
    //创建字节流
    FileInputStream fis = new FileInputStream(file);
    FileOutputStream fos = new FileOutputStream(file2);
    //读写文件
    int len;
    byte[] bytes = new byte[1024];
    while ((len = fis.read(bytes)) != -1) {
        fos.write(bytes, 0, len);

    }

}

相对路径在idea和eclipse的区别:

idea:

如果使用单元测试方法,相对路径基于当前的Module

如果使用main()测试,相对路径基于当前project

eclispe:

单元测试方法还是main()测试,相对路径基于当前project

四:处理流:

4.1 缓冲流

4.1.1 缓冲流涉及到的类:

BufferedInputStream

BufferedOutputStream

BufferedReader

BufferedWriter

4.1.2作用:

4.1.3典型代码:

》使用BufferedInputStream 和BufferedOutputStream

@Test
public void test7() {
    /*
    缓冲流实现图片复制
     */
    BufferedInputStream bis = null;
    BufferedOutputStream bos = null;
    try {
        //创建文件
        File file = new File("cat.jpg");
        File file2 = new File("cat2.jpg");
        //创建字节流
        FileInputStream fis = new FileInputStream(file);
        FileOutputStream fos = new FileOutputStream(file2);
        //创建处理流
        bis = new BufferedInputStream(fis);
        bos = new BufferedOutputStream(fos);
        //读写文件
        int len;
        byte[] bytes = new byte[10];
        while ((len = bis.read(bytes)) != -1) {
            bos.write(bytes, 0, len);
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
    }

    //关闭流
    if (bis != null) {
        try {
            bis.close();
        } catch (IOException e) {
            e.printStackTrace();
        }

    }
    if (bos != null)
        try {
            bos.close();
        } catch (IOException e) {
            e.printStackTrace();
        }


}

》使用BufferedReader 和BufferedWriter

  @Test
    public void test8() throws IOException {
          /*
        缓冲字符流实现文本复制
         */
        //创建文件对象
        File  file = new File("hello.txt");
        File  file2 = new File("hellocp.txt");

        //创建字符流对象
        FileReader  fr = new FileReader(file);
        FileWriter  fw  = new FileWriter(file2);

        //创建处理流

        BufferedReader  bur  = new BufferedReader(fr);
        BufferedWriter  buw   =new BufferedWriter(fw);

        //读写文件 方式一:
//
//        char[] buff =new char[1024];
//         int len;
//         while((len=bur.read(buff))!=-1 ){
//             buw.write(buff,0,len);
//
//
//        }
        //读写文件 方式二:
        char[] buff =new char[1024];
         String str;
        while((str=bur.readLine())!=null){

           //buw.write(str+"\n");

            buw.write(str);
            buw.newLine();
        }

        //关闭流

        bur.close();
         buw.close();

    }

4.2转换流

4.2.1 转换流涉及到的类

InputSteamReader:将一个字节的输入流转换为字符的输入流

解码:字节,字节数组----》字符数组,字符串

OutputStreamWriter:将一个字符的输出流转换为字节的输出流

编码:字符数组,字符串----》字节,字节数组

4.2.2 作用

提供字节流与字符流之间的转换

4.2.3 图示

4.2.4 典型实现

@Test
public void test(){
    //创建文件
    InputStreamReader isr = null;
    OutputStreamWriter osw = null;
    try {
        File file = new File("hello.txt");
        File file2 = new File("hellogbk.txt");
        //创建字节流
        FileInputStream fis = new FileInputStream(file);
        FileOutputStream fos = new FileOutputStream(file2);

        //创建转换流
        isr = new InputStreamReader(fis,"utf-8");
        osw = new OutputStreamWriter(fos,"gbk");
        char[] ch= new char[10];
        int len;
        while((len=isr.read(ch))!=-1){
            osw.write(ch,0,len);

        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
    //关闭流
        try {
            if(isr!=null)
            isr.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
        try {
            if(osw!=null)
            osw.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }


}

五:其他流:

1.标准的输入输出流

System.in:标准的输入流,默认从键盘输入

System.out:标准的输出流,默认从控制台输出

修改默认的输入和输出行为:

System类的SetIn(InputStrem is)/setOut(PrintStream ps)方式重新指定输入和输出流

2.打印流

PrintStream 和PrintWriter

说明:

》提供了一系列重载的print()和println()方法,用于多种数据类型的输出

》System.out返回的是PrintStream的实例

3.代码

1.实现键盘标准输入字符串,并转换成大写输出!
方法一:Scanner
public class ScannerTest {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        while(true){
            System.out.println("请输入内容,输入e或者exit 结束输入!");
            String next = scan.next();
            if("e".equalsIgnoreCase(next)||"exit".equalsIgnoreCase(next)){
                System.out.println("系统输入结束!");
                break;
            }
            System.out.println(next.toUpperCase());
        }
    }
}
方法二:缓冲流BufferedReader
public class StandardTest {
    public static void main(String[] args) {
        BufferedReader  bur = null;
        try {
            InputStreamReader fir =new  InputStreamReader(System.in);
            bur = new BufferedReader(fir);
            while(true){
                System.out.println("请输入内容,输入e或者exi退出:");
                String str = bur.readLine();
                if("e".equalsIgnoreCase(str)||"exit".equalsIgnoreCase(str)){
                    System.out.println("退出程序!");
                    break;
                }
                String toUpperCase = str.toUpperCase();
                System.out.println(toUpperCase);


            }
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            if(bur!=null){
                try {
                    bur.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }

        }


    }

}

2.读取文档,并统计字符出现的次数 

public class WordCount {
    @Test
    public void test() throws IOException {

      
        //创建流和map集合
        FileReader  fr = new FileReader(new File("hello.txt"));
        BufferedWriter buw = new BufferedWriter(new FileWriter(new File("wordcount.txt")));
        Map<Character,Integer> map =new HashMap<Character,Integer>();
        //按字符读取文件,每一个字符出现的次数放到map中
        int c;
        while(( c=fr.read())!=-1){
            char ch = (char)c;
            if(map.get(ch)==null)
            { map.put(ch,1);}
            else{
                map.put(ch,map.get(ch)+1);
            }
        }
     //把集合数据写到文件中

        Set<Map.Entry<Character, Integer>> entries = map.entrySet();
        for(Map.Entry<Character, Integer> entry: entries){
            switch(entry.getKey()){
                case ' ':
                    buw.write("空格="+entry.getValue());
                    break;

                case '\t':
                    buw.write("制表符="+entry.getValue());
                    break;


                case '\r':
                    buw.write("回车="+entry.getValue());
                    break;
                case '\n':
                    buw.write("换行="+entry.getValue());
                    break;

                default:
                    buw.write(entry.getKey()+"="+entry.getValue());
                    break;


            }
            buw.newLine();


        }
            //关闭流:
            fr.close();
            buw.close();



    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/733885.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

仙境传说RO:添加自定义道具

仙境传说RO&#xff1a;添加自定义道具 大家好&#xff0c;我是艾西今天和大家聊一下仙境传说RO怎么添加自定义道具。在我们开服时加入一些道具模组等往往会让我们的服务器更有特色以及消费点&#xff0c;那么让我们直接进入正题开始操作&#xff1a;&#xff08;此处我们讲的…

k8s集群安装Istio过程记录及问题总结

目录 一、介绍二、部署Helm三、部署Istio部署官方示例 Bookinfo 四、部署KaliBug 记录部署Bookinfo demo失败 一、介绍 这篇文章记录一下k8s集群安装Helm、Istio 和 Kiali&#xff0c;方便学习相关概念。 前提需要k8s集群&#xff1a; 可参考&#xff1a;Arm64架构(MacBookPr…

cmake流程控制--循环

目录 for循环 普通方式 demo cmake3.17中添加了一种特殊的形式,可以在一次循环多个列表,其形式如下: demo 类似python语言的for循环 demo while循环 demo cmake跳出循环(break)和继续下次循环(continue) demo block()和endblock()命令定义的块内也是允许break()和c…

Windows下 Hexdump查看hex文件

链接 &#xff1a; https://www.di-mgt.com.au/hexdump-for-windows.html C:\hexdump-2.0.2 下载解压&#xff0c;以管理员权限拷贝至C:\Windows 便可使用查看命令

蓝牙定位系统|蓝牙网关定位和蓝牙Beacon定位的区别有哪些?

作为室外定位向室内环境的延伸&#xff0c;为了解决室外定位导航“最后一公里”的问题&#xff0c;室内定位领域的科技公司和研究机构也做出了很多的努力。目前市场主流的是基于蓝牙网关、蓝牙Beacon的室内定位方案&#xff0c;经常会有客户问到&#xff0c;这两种方案有什么区…

STL好难(7):优先级队列(priority_queue)与仿函数

目录 1.优先级队列的介绍&#xff1a; 2.priority_queue的函数接口 3.仿函数&#xff08;函数对象&#xff09;的简单理解 4.priority_queue的模拟实现&#xff1a; 1.优先级队列的介绍&#xff1a; 点击查看priority_queue的文档介绍 1. 优先队列是一种容器适配器&#x…

默认成员函数

前文提要 本文全文以日期类为例 先简单写一个日期类 class Data{ public:private:int _year;int _month;int _day; };且补充一个小知识 数据类型的划分 内置类型&#xff1a;是编程语言提供的基本数据类型&#xff0c;例如整数、浮点数、字符、布尔值 自定义类型&#xff1…

FreeRTOS实时操作系统(十二)事件标志组

系列文章目录 文章目录 系列文章目录事件标志组事件标志组API函数实验测试 事件标志组 事件标志位&#xff1a;用一个位来表示事件是否可以发生。 事件标志组是一组事件标志位的集合 特点&#xff1a; 1.每一个位表示一个事件&#xff08;高8位不是&#xff09; 2.每一位事件…

Java的异常Exception

异常 1、异常概述与异常体系结构 1.1、异常概述 异常&#xff1a;在Java语言中&#xff0c;将程序执行中发生的不正常情况称为“异常”&#xff08;开发过程中的语法错误和逻辑错误不是异常&#xff09; Java程序在执行过程中所发生的异常事件可分为两类&#xff1a; Erro…

装饰器模式:通过剖析Java IO类库源码学习装饰器模式

我们通过剖析Java IO类的设计思想&#xff0c;再学习一种新的结构型模式&#xff0c;装饰器模式。它的代码结构跟桥接模式非常相似&#xff0c;不过&#xff0c;要解决的问题却大不相同。 Java IO类库非常庞大和复杂&#xff0c;有几十个类&#xff0c;负责IO数据的读取…

Appium: Windows系统桌面应用自动化测试(三) 【脚本操作】

Appium: Windows系统桌面应用自动化测试 【脚本操作】 一、常用操作1、添加被测程序1.1示例一&#xff1a;通过程序路径指定应用程序&#xff0c;例如指定写字板程序路径。1.2示例二&#xff1a;通过程序ID指定应用程序&#xff0c;例如指定计算器ID。1.3 应用程序ID&#xff0…

芯片工程师求职题目之验证篇(2)

1. 事件驱动的仿真器和和基于周期的仿真器有什么区别&#xff1f; 事件驱动的仿真器顾名思义就是根据事件(event)触发仿真进行的&#xff0c;在进入一个周期中&#xff0c;它会获取每个事件并通过设计传播求值&#xff0c;直到达到稳定状态的条件&#xff0c;接着进入下一个周…

Android:安卓开发采用Volley网络框架+MySQL数据库,实现从服务器获取数据并展示完成记单词APP

一、功能与要求 实现功能&#xff1a;设计一个记单词APP。服务器采用Tomcat&#xff0c;数据库采用Mysql。实现用户的注册登录功能以及单词的增删改查。 指标要求&#xff1a;实现UI布局&#xff1b;将系统数据保存到Mysql数据库中&#xff0c;并采用Volley网络框架实现从服务…

【机器学习核心总结】什么是随机森林

什么是随机森林 森林里有很多树&#xff0c;随机森林里有很多决策树。 随机森林是决策树的升级版&#xff0c;随机指的是树的生长过程。世上没有两片相同的树叶&#xff0c;随机森林中的树也各不相同。在构建决策树时&#xff0c;我们会从训练数据中有放回的随机选取一部分样本…

Kubernetes service服务的发布 - kube-proxy(负载均衡器)-IPVS

目录 Service Service将内部的pod暴露到外面&#xff0c;让用户可以访问 负载均衡策略&#xff1a; Service 的类型&#xff1a; 案例&#xff1a;Service服务发布案例 扩展&#xff1a;我们在案例再加入一个探针的使用 更改后的my_nginx.yaml文件&#xff1a; 创建Pod&…

ChatGLM2-6B发布,C-Eval超GPT4,支持32k上下文!

自清华大学数据挖掘实验室&#xff08;THUDM&#xff09;3月开源ChatGLM-6B已经过去了3个多月&#xff0c;最近他们又带来了性能全面提升的“船新”版本-ChatGLM2-6B。别看名字变化小&#xff0c;其实更新的模型性能是又有量又实用。不了解ChatGLM的小伙伴可以看我这篇文章&…

Java基础之五 反射

通过Java反射机制&#xff0c;可以在程序中访问已经装载到JVM中的Java对象的描述&#xff0c;实现访问、检测和修改描述Java对象本身信息的功能。 通过反射可以访问的主要描述信息 访问成员变量 常用方法&#xff1a;getFields()、getField(String name)、getDeclaredFields()…

第 353 场LeetCode周赛

A 找出最大的可达成数字 签到题 class Solution { public:int theMaximumAchievableX(int num, int t) {return numt*2;} };B 达到末尾下标所需的最大跳跃次数 动态规划: 定义 p i p_i pi​为跳至 i i i处所需的最大跳跃次数, 有状态转移方程 p i m a x { p j 1 ∣ 0 ≤ j &…

文档管理:PaperPort Professional 14.7 Crack

文档管理变得简单 PaperPort Professional 快速、轻松地访问重要文档对于保持组织平稳运行至关重要。与其浪费时间在文件夹中搜索所需的文件&#xff0c;不如在PC上扫描&#xff0c;转换&#xff0c;组织&#xff0c;组装和共享文档和图像&#xff0c;或者更好的是&#xff0c;…