JavaIO流

跳转链接:韩顺平讲Java

  • 文件概念:保存数据的地方
  • 创建文件的三种方法(文件路径可写为: “d:\\”或者  “d:/”):

  •  常用的文件方法:
  1. 获取文件信息:

  2.目录操作:mkdir创建一级目录,mkdirs创建多级目录,delete删除空目录或文件

 

  •  IO原理及分类
  1. IO:Input,Output,用于处理数据传输,如读写文件,网络通讯;Java程序中对于数据的输入输出操作以流(stream)的方式进行
  2. 分类:按操作数据单位不同分为:字节流(8bit),字符流(字符,对应字节与编码相关,更适合操作文本文件)(字符流效率更高,字节流在操作二进制文件时保证文件的无损操作,更适合操作二进制文件); 按数据流的流向不同分为:输入流,输出流; 按流的角色不同分为:节点流,处理流/包装流
  3. 由四个抽象基类派(都无法直接实例化)生出IO流的40多个类,其子类名称都是以父类名作为子类名后缀

  • 如何在IDEA中打开源码,打开类图

 

  •  FileInputStream&FileOutputStream:用对象来操作文件
  1. FileInputStream:文件输入流

     。三种构造方法的参数:File对象;  String 文件系统中的路径名;  文件描述符(?)

     。read方法(到达结尾时都返回-1):()-从输入流中读取一个数据字节,(byte【】b)将最多b.length个字节的数据读入一个byte数组中(优化效率,返回实际读取的字节数),(byte【】b, int off, int len)

     。显示:(char),汉字(三个字节)必然出现乱码(解决方案(?));String(b, 0, read(byte[])

  • 调试

       2.FileOutputStream

    。write方法: write(),write(byte[])  , write(byte[], int off, int len)

复制代码
  public void writeFile(){
        //创建对象,定义在try外扩大作用域
        String filePath = "d:\\Java\\a.txt";
        FileOutputStream file = null;

        //若文件不存在将自动新建文件夹
        try{
            //1.new FileOutputStream(filePath);写入内容时,将覆盖原有内容
            //2.new FileOutputStream(filePath, true);写入内容时,将追加到文件末尾
            file = new FileOutputStream(filePath);
//三种write方法 //写入单个字节 write() file.write('H'); //写入字符串 write(byte[] b) String str1 = "hello"; file.write(str1.getBytes()); //getBytes:字符串——>字节数组 //写入字符串 String str2 = "Hello"; file.write(str2.getBytes(), 0, str2.length()); }catch(IOException e){ e.printStackTrace(); //jdk手册 }finally{ try { file.close(); } catch (IOException e) { e.printStackTrace(); } } }
复制代码
  •  FileReader&FileWriter:字符流
  1. 构造方法:File对象或String指定路径
  2. FileReader:
    read方法,末尾返回-1:read()每次读取一个字符; read(char【】),读取字符数组,效率更高,返回读取到的字符数;相关API: new String(char[]),将char[]转换成String,new String(char[], off , len ), 将char[]的指定部分转换成String
  3. FileWriter常用方法:

    构造方法:new FileWriter(File/String)   *new FileWriter(File/String, true)追加模式

    write方法,write(),写入单个字符,write(char[]),写入字符数组,writer(char[], off, len), write(String), write(String, off, len);相关API:String.toCharArray:将String转换成char[]
      *注意:一定要关闭(close)或者刷新(flush)(这时候还在内存中),否则无法写入文件

   4.

复制代码
public void fileReader(){
        String filePath = "d:\\Java\\a.txt";
        FileReader fileReader = null;

        //1.创建FileReader对象
        try{
            fileReader = new FileReader(filePath);
            //单个字符读取
            //循环读取,使用read
            int read1 = 0;
            while((read1 = fileReader.read())!=-1){
                System.out.print((char)read1);
            }

            //字符数组读取文件
            // 循环读取,使用read(buf),返回实际读取的字符数
            int readLen = 0;
            char [] buf = new char[8];
            while((readLen = fileReader.read(buf))!=-1){
                System.out.println(new String(buf, 0, readLen));    //readLen保证在只有1个字符时仍可以输出
            }
            
        }catch(IOException e){
                System.out.println(e);
        }finally{
            try {
                if(fileReader != null){
                    fileReader.close();
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
复制代码
  •  节点流和处理流
  1. 节点流:从一个特定的数据源(存放数据的地方)读写程序,如FileReader
  2. 处理流(包装流):连接在已有的流(节点流或处理流)之上,为程序提供更强大的的读写功能,也更加灵活,如BufferedReader
  3. BufferedReader封装任意一个节点流(Reader的子类),不局限于具体的数据源(修饰器模式:一种设计模式)

 

  •  BufferedReader:操作文本文件,尽量不要操作二进制文件(图片声音视频),否则可能会出现文件的损失;关闭处理流时只需要关闭外层流

复制代码
    //这里直接抛出异常
    public void BufferedReader_() throws IOException{

        String filePath = "d:\\Java\\a.txt";
        //创建对象
        BufferedReader bufferedReader = new BufferedReader(new FileReader(filePath));
        //读取
        String line;
        //BufferedReader是按行读取文件,效率高
        //读取完毕时返回null
        while((line = bufferedReader.readLine())!=null){
            System.out.println(line);
        }
        //关闭流,只需要关闭BufferedReader,底层会自动关闭节点流
        bufferedReader.close();
    }
复制代码

 

 

 

 

posted @   cvhgfds  阅读(25)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
点击右上角即可分享
微信分享提示