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

目录
  • 一.认识IO
    • 1.IO的分类
    • 2.IO的方式
    • 3.IO读写的方式
    • 4.IO的特性
  • 二.文件操作
    • 1.文件的构成
    • 2.文件的创建
    • 3.文件操作的API使用
  • 三.IO流
    • 1.流的分类
    • 2.流的创建
    • 3.流的使用
      • <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 {
    /**
     * 字节文件:C:\Users\26905\Desktop\画图笔记\JavaWeb\JSON和ajax简单介绍.png
     * 字符文件:C:\Users\26905\Desktop\论文,ppt,作业,笔记,图片等\java笔记.txt
     * @param args
     */
    public static void main(String[] args) throws IOException {
        //图片文件,以二进制的方式操作
        File file1=new File("C:\\Users\\26905\\Desktop\\画图笔记\\JavaWeb\\JSON和ajax简单介绍");
        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 {
        /**
         * D:\java代码\1.txt
         */
        //路径上没有该文件,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();
    }
}

总结

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

(0)

相关推荐

  • 新手了解java IO基础知识(一)

    目录 一.File类 1.简介 2.创建方式 3.常用方法 总结 一.File类 1.简介 java.io.File类:文件和文件目录路径的抽象表示形式,与平台无关 File 能新建.删除.重命名文件和目录,但 File 不能访问文件内容本 身.如果需要访问文件内容本身,则需要使用输入/输出流. 想要在Java程序中表示一个真实存在的文件或目录,那么必须有一个 File对象. 2.创建方式 public File(String pathname);//以pathname为路径创建File对象,可

  • Java基础详解之集合框架工具Collections

    一.Collections 说明:Collcetions是集合框架中的工具,特点是方法都是静态的. 二.Collections中的常见方法 1,对list进行二分查找:前提该集合一定要有序. int binarySearch(list,key);//要求list集合中的元素都是Comparable的子类. int binarySearch(list,key,Comparator); 2,对list集合进行排序. sort(list); sort(list,comaprator); 3,对集合取最

  • Java基础之Spring5的核心之一IOC容器

    一.什么是IOC 1)控制反转,把创建对象和对象的调用过程交给Spring 管理. 2)使用IOC的目的,为了降低耦合度. 二.IOC的底层原理 XML解析.工厂模式.反射 三.IOC思想 基于IOC容器完成,IOC容器底层就是对象工厂. 四.Spring 提供IOC容器实现两种方式:(两个接口) (1)BeanFactory:IOC容器基本实现,是Spring内部的使用接口,不提供开发人员使用 特点:加载配置文件的时候不会创建对象,在获取(使用)对象才去创建. (2)ApplicationCo

  • java基础之NIO介绍及使用

    一.NIO java.nio全称java non-blocking IO,是指jdk1.4 及以上版本里提供的新api(New IO) ,为所有的原始类型(boolean类型除外)提供缓存支持的数据容器,使用它可以提供非阻塞式的高伸缩性网络. 二.三大组件 NIO三大组件:Channel.Buffer.Selector 1.Channel 和Buffer Channel是一个对象,可以通过它读取和写入数据.拿 NIO 与原来的 I/O 做个比较,通道就像是流,而且他们面向缓冲区(Buffer)的

  • java基础入门之IO流

    目录 io学习框架: 文件: Io流的原理: 节点流和处理流: BufferWriter: 处理字节的处理流: 标准输入和输出: 转换流: 打印流: Properties类: 总结 io学习框架: 文件: 保存数据的地方. 1)常见文件对象的相关构造器和方法: 当进行File file = new File(filePath);只是在内存上有一个文件对象: 只有file.createNewFile();才会在磁盘创建文件 获取文件的相关信息: utf8中,一个汉字是三个字节,所以当用字节流的re

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

    目录 一.认识IO 1.IO的分类 2.IO的方式 3.IO读写的方式 4.IO的特性 二.文件操作 1.文件的构成 2.文件的创建 3.文件操作的API使用 三.IO流 1.流的分类 2.流的创建 3.流的使用 <1>输入流 <2>输出流 <3>实例:文件的复制 总结 一.认识IO 1.IO的分类 (1)BIO:同步阻塞IO (2)NIO:同步非阻塞IO (3)AIO:异步阻塞IO 注意: 这里主要介绍BIO 2.IO的方式 IO本质就是对数据的操作 (1)网络IO

  • 一篇文章带你了解Java Spring基础与IOC

    目录 About Spring About IOC Hello Spring Hello.java Beans.xml Test.java IOC创建对象的几种方式 Spring import settings Dependency Injection 1.构造器注入 2.set注入 3.拓展注入 P-namespcae&C-namespace Bean scopes singleton prototype Bean的自动装配 byName autowire byType autowire 小结

  • 一篇文章带你了解python字典基础

    目录 1. 字典基础知识 字典的基本格式表示 字典的键.值设置要求 1)键的设置要求 2)值的设置要求 2. 字典元素增加 1.利用赋值给字典增加元素 2.利用setdefault()方法给字典增加元素 3. 字典值查找 1.字典名+[key]查找 2.利用get()方法查找 4. 字典值修改 1.利用赋值修改键对应的值 2.利用update()方法修改键对应的值 5. 字典元素删除 1.利用del函数删除 2.利用pop()方法删除 3.利用popitem()方法删除 6. 字典遍历操作 1.

  • 一篇文章带你深入了解Java基础(3)

    目录 1.方法的基本定义 2.方法重载 3.方法的递归调用 4.面向对象的前身是面向过程 5.类与对象 总结 1.方法的基本定义 限制条件:本次所讲解的方法指的是在主类中定义,并且由主方法由主方法直接调用. 方法是指就是一段可以被重复调用的代码块. 在java里面如果想要进行方法的定义,则可以使用如下的方法进行完成. public static 方法返回值 方法名称([参数类型 变量,....]){ 方法体代码 ; return [返回值]; } 在定义方法的时候对于方法的返回值由以下两类:vo

  • 一篇文章带你了解python异常基础

    目录 1. 程序中的问题 1.1 低级语法错误 1.2 中介错误:代码存在隐性错误 1.3 高级错误:软件面对不确定性的异常错误 2. 捕捉异常 2.1 基本异常捕捉语句 2.2 带finally子句的异常处理 2.3 try-except-else 结构 2.4 try-except-else-finally 结构 2.5 捕捉特定异常信息 3. 抛出异常 总结 1. 程序中的问题 1.1 低级语法错误 低级错误纯属语法错误,代码主要在编写.调试阶段就报错. >>> if True S

  • 一篇文章带你深入了解Java基础(2)

    目录 1.Java主要特点 2.计算机的高级汇编语言类型: 3.JVM(Java Visual Machine) 4.编写第一个Java程序并运行 5.CLASSPATH指的是类加载路径 6.程序注释,对以后的所有代码都要进行注释,主页可以方便进行开发需求 7.标识符和关键字 8.Java数据类型的划分以及数据类型的操作 9.运算符 自增.自减操作 总结 1.Java主要特点 简单性.跨平台性.分布性.安全性.健壮性.平台独立与可移植性.多线程.动态性.面向对象的编程语言.支持垃圾自动收集处理等

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

    目录 1.String类 1.1两种对象实例化方式 1.2字符串比较 1.3字符串常量是String的匿名对象 1.4String两种实例化方式区别 1.分析直接赋值方式 2.构造方法赋值 1.5字符串常量不可改变 1.6开发中String必用 1.7字符串和字符数组 1.9字符串比较 1.11字符串的替换 1.12字符串的拆分 1.12字符串的截取 1.13其他操作方法 2.1. 给定一个email地址,要求验证其是否正确,提示:可以简单的验证一下,重点验证"@"和".&q

  • 一篇文章带你深入了解Java基础(4)

    目录 1.private实现封装处理 2.构造方法与匿名对象 3.简单java类 4.数组 总结 1.private实现封装处理 如果像想要知道封装,首先必须清楚如果没有封装会怎么样? 没有封装方法中的属性,在所有方法被调用后都可以进行无权限的访问.而当进行了封装操作之后,在实例化对象访问该方法的时候会出现无法访问的问题. TestDemo1.java:11: 错误: name 在 Person 中是 private 访问控制 per.name = "张三"; ^ TestDemo1.

  • 一篇文章带你深入了解Java基础(5)

    目录 1.数组 Java对数组的支持 1.数组的排序:java.util.Arrays.sort(数组名称) 2.数组的拷贝:指的是将一个数组的部分内容替换掉另一个数组的部分内容 总结 1.数组 数组的引用传递 public class TestDemo1{ public static void main(String args[]){ int data[] = null; data = new int [3]; data[0] = 10; //第一个元素 data[1] = 20; //第二个

  • 一篇文章带你了解MySQL数据库基础

    目录 1. 数据库概念 1.1 数据库是干嘛的? 1.2 数据库和数据结构是啥关系? 1. 数据库是一个软件/程序 2. 数据结构是一个学科~ 1.3 两种类型的数据库 2. MySQL数据库 2.1 MySQL数据库概念 2.2 MySQL基本操作 2.2.1 建立数据库 2.2.2 查看数据库 2.2.3 选中数据库 2.2.4 删除数据库 2.3 MySQL数据类型 总结 1. 数据库概念 1.1 数据库是干嘛的? 数据库的功能就是用来组织数据,组织很多很多的数据.这些数据通常都是存储在外

随机推荐