广告
返回顶部
首页 > 资讯 > 后端开发 > Python >一篇文章带你深入了解javaIO基础
  • 274
分享到

一篇文章带你深入了解javaIO基础

2024-04-02 19:04:59 274人浏览 安东尼

Python 官方文档:入门教程 => 点击学习

摘要

目录一.认识io1.IO的分类2.IO的方式3.IO读写的方式4.IO的特性二.文件操作1.文件的构成2.文件的创建3.文件操作的api使用三.IO流1.流的分类2.流的创建3.流的

一.认识IO

1.IO的分类

(1)BIO:同步阻塞IO

(2)NIO:同步非阻塞IO

(3)aiO:异步阻塞IO

注意: 这里主要介绍BIO

2.IO的方式

IO本质就是对数据的操作

(1)网络IO

(2)本地IO

3.IO读写的方式

在这里插入图片描述

4.IO的特性

(1)本质上属于数据传输

(2)涉及两个设备间的传输方向(一般,自己写java程序的时候,只关注自己程序的一方)

(3)数据流

在这里插入图片描述

(4)java进程的IO操作,对进程的影响:

  • 1.阻塞IO 会导致进程在运行态和阻塞态之间转变,由操作系统完成后序的IO操作
  • 2.java进程,在内核态和用户态之间切换:性能会收到影响(下降)

(5)IO缓冲流

在这里插入图片描述

不使用缓冲流:java程序每次都从主机内存读写数据,每次都直接读取数据/发送数据。write()/read()

使用/不使用缓冲区的区别:

例如:循环10000次,每次write1个字节数据到本地文件

不使用缓冲区:每次循环都是IO操作,都涉及进程状态由运行态变为阻塞态,由用户态变为内核态(10000次影响)

使用缓冲区:每次write复制数据到缓冲区,flush才算IO操作(一定要记得)(一次影响)性能更好

二.文件操作

1.文件的构成

(1)文件的头信息(Metadata)

(2)文件的内容

注意: java.io.File 不是对文件的内容操作,知识对文件本身或者头信息操作

2.文件的创建

在这里插入图片描述

new操作时的注意事项:

  • 1.既可以指定文件,也可以指定文件夹
  • 2.通过路径创建File:可以使用绝对路径/相对路径
  • 3.不管路径上是否存在这个文件/文件夹,java都可以创建得到一个File对象(但是对这个File操作时,可能会抛出异常)

3.文件操作的API使用

在这里插入图片描述

文件操作示例:遍历某个目录下,所有的子文件/子文件夹


  public static void main(String[] args) {
        File file=new File("C:\\Users\\26905\\Desktop\\javaCode");
        List<File> list=listDir(file);
//        for (int i = 0; i <list.size() ; i++) {
//            System.out.println(list.get(i));
//        }
        //jdk1.8集合框架使用Stream操作,可以使用lambda表达式打印
        list.stream().forEach(System.out::println);
    }

方法一: 效率不高


public static List<File> listDir(File dir){
        List<File> list=new ArrayList<>();
        if(dir.isFile()){
            list.add(dir);//效率不太好的地方,如果是文件,返回的list只存放一个元素
        }else {
            File[] children=dir.listFiles();
            for(File file:children){
                List<File> files=listDir(file);
                list.addAll(files);
            }
        }
        return list;
    }

方法二: 效率较高


 public static List<File>  listDir2(File dir){
        List<File> list=new ArrayList<>();
        if(dir.isDirectory()){
            //获取目录下一级的子文件和子文件夹
            File[] children=dir.listFiles();
            if(children!=null){
                for(File file:children){
                    if(file.isDirectory()){
                        //如果子文件还是文件夹,递归调用
                        list.addAll(listDir2(file));
                    }else{
                        list.add(file);
                    }
                }
            }
        }
        return list;
    }

三.IO流

1.流的分类

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

2.流的创建

在这里插入图片描述

3.流的使用

在这里插入图片描述

<1>输入流


import java.io.*;
public class  FileInput {
    
    public static void main(String[] args) throws IOException {
        //图片文件,以二进制的方式操作
        File file1=new File("C:\\Users\\26905\\Desktop\\画图笔记\\javaweb\\JSONajax简单介绍");
        File file =new File("C:\\Users\\26905\\Desktop\\论文,ppt,作业,笔记,图片等\\比特草稿本.txt");

        //1.文件输入字节流
        FileInputStream fis=new FileInputStream(file);
        //不知道文件有多 大,先定义一个一定大小的字节数组,然后不停读入,每次刷新以下就好
        byte[] bytes=new byte[1024*8];
        //输入流读取的固定写法:读取到一个字节/字符数组,定义read的返回值变量,while
        int len=0;
        //len表示读入字节的长度
        //如果不等于-1,说明读取未结束
        while ((len=fis.read(bytes)) !=-1){
            //读取到的长度,数组可能读满,也可能没有读满
            //当次读取,一般使用数组[0,len]表示读取内容
            //字节数组转字符串
            String str=new String(bytes,0,len);
           // System.out.println(str);
        }
        //一般来说,输入输出流使用完,一定要关闭,关闭的关系是反向关系
        //例如:创建的时候是从里往外创建,则关闭的时候就是从外往内关闭
        fis.close();

        //2.文件的字符输入流
        FileReader fr=new FileReader(file);
        char []chars=new char[1024];
        int lenFr=0;
        while ((lenFr=fr.read(chars))!=-1){
             String strFr=new String(chars,0,lenFr);
            //System.out.println(strFr);
        }
        fr.close();

        //3.缓冲流:缓冲字节输入,缓冲字符输入
        FileInputStream FIS=new FileInputStream(file);//文件字节输入流
        //字节流转字符流一定要经过字节字符转换流来转换,并且还可以指定编码
        InputStreamReader isr=new InputStreamReader(FIS);
        //缓冲流
        BufferedReader br=new BufferedReader(isr);
        String str;
        //读取,当字符串为空时,结束
        while ((str=br.readLine()) !=null){
            System.out.println(str);
        }
        br.close();
        isr.close();
        FIS.close();
    }
}

<2>输出流


import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintWriter;
public class FileOutput {
    public static void main(String[] args) throws IOException {
        
        //路径上没有该文件,new File不会报错,但是在操作输出流会抛出FileNotFoundException
        File file2=new File("D:\\java代码\\1.txt");
        //把a-z换行输出到某个文件,需要考虑文件是否存在的问题
        if(!file2.exists()){
            file2.createNewFile();
        }
        //new FileWriter()  文件的不带缓冲的字符输出
        //new FileWriter()  文件的不带缓冲的字节输出
        //new BufferedWriter() 带缓冲的字符输出
        //new PrintWriter()    打印输出流

        //缓冲的字符输出
//        BufferedWriter bw=new BufferedWriter(new FileWriter(file2));
//        bw.write("\n");

        //打印输出流
        //PrintWriter pw=new PrintWriter(new FileWriter(file));
        PrintWriter pw =new PrintWriter(new FileOutputStream(file2));
        //快速打印a-z
        for (int i = 'a'; i <='z' ; i++) {
            pw.println((char)i);
        }
        pw.flush();
    }
}

<3>实例:文件的复制


import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class FileCopy {
    public static void main(String[] args) throws IOException {
        //文件复制
        File input=new File("D:\\java代码\\1.txt");
        File output=new File("D:\\java代码\\2.txt");
        if(!output.exists()){
            output.createNewFile();
        }
        //定义输入输出流
        //输入流
        FileInputStream fis=new FileInputStream(input);
        // 输出流
        FileOutputStream fos=new FileOutputStream(output);
        byte[]bytes=new byte[1024*8];
        int len;
        while ((len=fis.read(bytes))!=-1){//每次从输入流读取到byte[]的内容,直接输出到某个文件,就是复制
            //bytes可能没存满,需要指定长度
            fos.write(bytes,0,len);
        }
        fis.close();
        fos.close();
    }
}

总结

本篇文章就到这里了,希望能给你带来帮助,也希望您能够多多关注编程网的更多内容!

--结束END--

本文标题: 一篇文章带你深入了解javaIO基础

本文链接: https://www.lsjlt.com/news/131614.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 一篇文章带你深入了解javaIO基础
    目录一.认识IO1.IO的分类2.IO的方式3.IO读写的方式4.IO的特性二.文件操作1.文件的构成2.文件的创建3.文件操作的API使用三.IO流1.流的分类2.流的创建3.流的...
    99+
    2022-11-12
  • 一篇文章带你深入了解Java基础
    目录1、String类1.1两种对象实例化方式1.2字符串比较1.3字符串常量是String的匿名对象1.4String两种实例化方式区别1、分析直接赋值方式2、构造方法赋值1.5字...
    99+
    2022-11-12
  • 一篇文章带你深入了解Java基础(2)
    目录1、Java主要特点2、计算机的高级汇编语言类型:3、JVM(Java Visual Machine)4、编写第一个Java程序并运行5、CLASSPATH指的是类加载路径6、程...
    99+
    2022-11-12
  • 一篇文章带你深入了解Java基础(3)
    目录1、方法的基本定义2、方法重载3、方法的递归调用4、面向对象的前身是面向过程5、类与对象总结1、方法的基本定义 限制条件:本次所讲解的方法指的是在主类中定义,并且由主方法由主方法...
    99+
    2022-11-12
  • 一篇文章带你深入了解Java基础(4)
    目录1、private实现封装处理2、构造方法与匿名对象3、简单java类4、数组总结1、private实现封装处理 如果像想要知道封装,首先必须清楚如果没有封装会怎么样? 没有封装...
    99+
    2022-11-12
  • 一篇文章带你深入了解Java基础(5)
    目录1、数组Java对数组的支持1、数组的排序:java.util.Arrays.sort(数组名称)2、数组的拷贝:指的是将一个数组的部分内容替换掉另一个数组的部分内容总结1、数组...
    99+
    2022-11-12
  • 一篇文章带你了解C语言:入门基础
    目录C语言本身特点数据类型常量变量变量分类使用小建议生命周期作用域常量分类及其特点字符串+转义字符+注释字符串转义字符两种注释选择循环语句函数数组总结闲话少说,先上思维导图。 如图...
    99+
    2022-11-12
  • 一篇文章带你了解C++(STL基础、Vector)
    目录STL基本概念STL六大组件STL中容器、算法、迭代器容器算法迭代器初识Vector容器Vector三大遍历算法Vector存放其他数据类型 Vector容器嵌套总结S...
    99+
    2022-11-12
  • 一篇文章带你了解python元组基础
    目录1. 元组基本知识1.元组的基本格式和用法2. 元组操作实例1.建立元组2.查找元素:通过元组下标实现。3.删除元组:对元组的删除时不允许的,可以通过del函数,实现对整个元组对...
    99+
    2022-11-12
  • 一篇文章带你了解python字典基础
    目录1. 字典基础知识字典的基本格式表示字典的键、值设置要求1)键的设置要求2)值的设置要求2. 字典元素增加1.利用赋值给字典增加元素2.利用setdefault()方法给字典增加...
    99+
    2022-11-12
  • 一篇文章带你了解python集合基础
    目录1. 集合类型定义(1)集合是多个元素的无序组合2. 集合操作符 3. 集合处理方法4. 集合类型应用场景(1)包含关系比较(2)数据去重:集合数据所有元素无重复总结1...
    99+
    2022-11-12
  • 一篇文章带你了解python异常基础
    目录1. 程序中的问题1.1 低级语法错误1.2 中介错误:代码存在隐性错误1.3 高级错误:软件面对不确定性的异常错误2. 捕捉异常2.1 基本异常捕捉语句2.2 带finally...
    99+
    2022-11-12
  • 一篇文章带你了解Java基础-抽象
    目录Java基础知识(抽象)抽象抽象定义abstract的使用定义抽象类抽象类的一些注意点总结Java基础知识(抽象) 抽象 抽象是从众多的事物中抽取出共同的、本质性的特征,而舍弃...
    99+
    2022-11-12
  • 一篇文章带你了解Java基础-接口
    目录Java基础知识(接口)接口接口的定义接口和抽象的区别接口的格式接口中的主要成分接口的案例接口与接口的关系JDK 8之后的接口新增方法总结Java基础知识(接口) 接口 Jav...
    99+
    2022-11-12
  • 一篇文章带你了解Java基础-多态
    目录Java基础知识(多态)多态多态的定义和存在的必要条件多态的案例多态的弊端引用类型转换总结Java基础知识(多态) 多态 多态就是指程序中定义的引用变量所指向的具体类型和通过该...
    99+
    2022-11-12
  • 一篇文章带你了解C语言:入门基础(2)
    目录操作符算术操作符移位操作符位操作符单目操作符逻辑反操作!操作符++,--逻辑操作符条件操作符逗号表达式常见关键字typedefexternstatic修饰局部变量修饰全局变量和函...
    99+
    2022-11-12
  • 一篇文章带你深入了解Java异常
    目录一.初识异常1.常见的异常类型<1>除以0<2>数组下标越界<3>访问null对象2.防御式编程<1>LBYL<2>E...
    99+
    2022-11-12
  • 一篇文章带你深入了解Java封装
    目录如何实现封装代码展示构造方法注意点:代码展示总结如何实现封装 可以分为两步: 第一步:将类的变量声明为private。 第二步:提供公共set和get方法来修改和获取变量的值。 ...
    99+
    2022-11-12
  • 一篇文章带你了解Java Spring基础与IOC
    目录About SpringAbout IOCHello SpringHello.javaBeans.xmlTest.javaIOC创建对象的几种方式Spring import se...
    99+
    2022-11-12
  • 一篇文章带你了解MySQL数据库基础
    目录1. 数据库概念1.1 数据库是干嘛的?1.2 数据库和数据结构是啥关系?1. 数据库是一个软件/程序1.3 两种类型的数据库2. MySQL数据库2.1 MySQL数据...
    99+
    2022-11-12
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作