温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

java中IO的概念及使用

发布时间:2021-08-02 09:27:45 来源:亿速云 阅读:130 作者:chen 栏目:开发技术

本篇内容主要讲解“java中IO的概念及使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“java中IO的概念及使用”吧!

目录
  • 一.认识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读写的方式

    java中IO的概念及使用

    4.IO的特性

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

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

    (3)数据流

    java中IO的概念及使用

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

    • 1.阻塞IO 会导致进程在运行态和阻塞态之间转变,由操作系统完成后序的IO操作

    • 2.java进程,在内核态和用户态之间切换:性能会收到影响(下降)

    (5)IO缓冲流

    java中IO的概念及使用

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

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

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

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

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

    二.文件操作

    1.文件的构成

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

    (2)文件的内容

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

    2.文件的创建

    java中IO的概念及使用

    new操作时的注意事项:

    • 1.既可以指定文件,也可以指定文件夹

    • 2.通过路径创建File:可以使用绝对路径/相对路径

    • 3.不管路径上是否存在这个文件/文件夹,java都可以创建得到一个File对象(但是对这个File操作时,可能会抛出异常)

    3.文件操作的API使用

    java中IO的概念及使用

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

      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.流的分类

    java中IO的概念及使用

    java中IO的概念及使用

    java中IO的概念及使用

    2.流的创建

    java中IO的概念及使用

    3.流的使用

    java中IO的概念及使用

    <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();
        }
    }

    到此,相信大家对“java中IO的概念及使用”有了更深的了解,不妨来实际操作一番吧!这里是亿速云网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

    向AI问一下细节

    免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

    AI