Java.io系列


Hello, 好久没有更新博客了,今天和大家一探索io流。话不多说,直接开始。


File

文件或目录路径名的抽象表示
常用构造方法
  • File(File parent, String child) //文件类型的 文件夹 和 文件名 创建新的File 实例

  • File(strinh pathname)

  • File(String parent, string child) //字符串类型文件夹 和 文件名 创建新的File 实例

        File dir = new File("G://javaFiles//1.txt");

        File a = new File(dir,"a.txt");  // File(File parent, String  child) 构造方法
        a.createNewFile();

        File b = new File("G://javaFiles//1.txt","b.txt"); //File(String parent, string child) 构造方法
        b.createNewFile();
常见方法
  • createNewFile() ;只能创建文件,不能创建多级目录,解决办法使用 mkdir方法
//注意G盘下并没有 delete文件夹,运行结果会报错
File file2 = new File("G://delete//b.txt"); 
file2.createNewFile();

在这里插入图片描述

  • mkdir() 方法 创建一层文件夹; mkdirs()创建多层文件夹
    public static void main(String[] args)  throws IOException{
        /*File file = new File("G://javaFiles//a.txt"); //用来创建文件 不能创建文件夹; G://javaFiles已存在
        boolean flag = file.createNewFile();  // 用来创建文件
        System.out.println(flag?"文件创建成功":"文件创建失败");*/

        File dir = new File("G://javaFiles//1.txt");
//        dir.createNewFile(); 无论后缀名是什么,创建的永远是文件
        dir.mkdir(); //无论文件名是什么创建的永远是 文件夹;创建的只是有一层文件夹
    }

在这里插入图片描述

  • delete()
		File a = new File(dir,"a.txt");
        File b = new File("G://javaFiles//1.txt","b.txt");
        
        a.delete();
        b.delete();
  • getAbsolutePath() 得到文件的绝对路径;返回类型为字符串

  • getAbsoluteFile() 得到文件的绝对路径; 返回类型为文件

  • getPath() 将抽象路径 转换为 路径名字符串

  • renameto() 移动位置 并重命名 PS : 原来的文件会被删除>

        File re  = new File("G:\\MyPython\\crawler\\《三国演义》.txt");
        File  newFile = new File("G:\\javaFiles\\三国.txt");
        re.renameTo(newFile);

在这里插入图片描述

字段
        java 可以实现跨平台,但是Windows 和 Linux 使用的符号不一样,所以不能在代码中将此类符号写死
		System.out.println(File.pathSeparator);   //系统有关的路径分隔符 :  ;
        System.out.println(File.separator);   //系统有关的路径分隔符  : \


文件遍历
  • 栗子:遍历 C 盘下所有的 以 后缀名为 .zip 并且文件大于 100MB
    public static void main(String[] args)  throws IOException{

        File h = new File("H:\\");
        File[] files =  h.listFiles();
        myListFile(files);
        System.out.println("H盘遍历完毕");

    }
    public static void myListFile(File[] files){
        //files数组长度 不为空 并且长度不为0
        if(files!=null && files.length>0){
            for (File file:files) {
                //如果 当前 是 文件:判断文件名是否为有.zip
                if(file.isFile()){
                    if(file.getName().endsWith(".zip") && file.length()>=100*1024*1024){
                        System.out.println(file.getName());
                    }
                }else{
                    //如果当前 是 文件夹 ,将此文件夹下 的 第一层存储到 files2数组中
                    File[] files2 = file.listFiles();
                    //递归调用myListFile()方法
                    myListFile(files2);
                }
            }

        }
    }

IO流分类

  • 按照流的分类分: 输入流、输出流
  • 按照流动的数据类型分: 字节流、字符流
    • 字节流
      • 输入流:InputStream
      • 输出流:OutputStream (输出字节流的所有类的超类)
    • 字符流
      • 输入流:Reader
      • 输出流:Writer

字节流

OutputStream
常用方法
  • close()

  • flush()

  • write(byte[] b)

  • write(byte[] b, int off, int length)

  • write(int b) //要写入的字节是参数 b的低八位

常见子类
  • FileOutputStream 用于写入诸如图像数据的原始字节流 每一个FileOutputStream 的对象就是向每一个文件 输出的一个流管道

  • 常见构造方法
    • FileOutputStream(File file) 创建文件输出流 并 写入指定的 File对象的文件

    • FileOutputStream(File file,boolean append) 开启追加模式

    • FileOutputStream(String name) 传入文件字符串路径 并向 创建的文件写入

    • FileOutputStream(String name,boolean append) 开启追加模式

  • 常用方法(继承父类)

  • write(byte[] b)

   public static void main(String[] args) throws IOException {
           //只会自动创建文件 但不会创建文件夹
           FileOutputStream fos = new FileOutputStream("G:\\javaFiles\\1.txt\\fileOutS.txt");
           //写入一个字节
          fos.write(66);      //写入:B 
   
           //写入一组字节
          byte[] bytes = {56,77,85};   //写入: 8MU
           fos.write(bytes);
   
           byte[] bytes2 ="ABCeFH3KLI".getBytes();
           fos.write(bytes2);  //写入:  ABCeFH3KLI
   
           fos.close();
       }
  • write(byte[] b, int off, int length)
     public static void main(String[] args) throws IOException {
             //只会自动创建文件 但不会创建文件夹
             FileOutputStream fos = new FileOutputStream("G:\\javaFiles\\1.txt\\fileOutS.txt");
     
             byte[] bytes2 ="ABCeFH3KLI".getBytes();
     
             fos.write(bytes2, 2,3);    //写入: CeF
             System.out.println("已经写出");
     
             fos.close();
         }
  • write(int b) //要写入的字节是参数 b的低八位

InputStream
常见方法
  • read() 从输入流中读取下一个数据字节,返回 int,范围 0- 255。 如果文件读取完毕 返回 -1

  • read(byte[] b) 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。以整数形式返回实际读取的字节数; -1 同上

  • read(byte[] b, int off, int end)

  • close()

常见子类
  • FileInputStream 常用方法同上

  • read()

    FileInputStream fis = new FileInputStream("G:\\javaFiles\\a.txt") ;
    
    while(true){
      byte b = (byte) fis.read(); //read()每次读取有一个字节,读完当前字节后读取下一个字节;当读取完全部字节一直返回-1
       if(b==-1){
         break;
        }
       System.out.print((char)b);
    }
  • read(byte[]) PS: 当最后又一次读取的元素长度小于 数组的长度,为了保证每次读取长度固定,会将上一次 读取的 相应空缺位置的元素赋值给当前数组
   		FileInputStream fis = new FileInputStream("G:\\javaFiles\\a.txt") ;
   		
   		byte[] bytes = new byte[10];
           fis.read(bytes);
           System.out.println(new String(bytes));
           fis.read(bytes);
           System.out.println(new String(bytes));
           fis.read(bytes);
           System.out.println(new String(bytes));

在这里插入图片描述

  • 解决上述bug
    //解决上述bug
    byte[] bytes = new byte[10];
    int len = fis.read(bytes);  //10 //以整数形式返回实际读取的字节数
    System.out.println("bytes:"+bytes);
    System.out.println(new String(bytes,0,len));
    len= fis.read(bytes); //10
    System.out.println(new String(bytes,0,len));
    len = fis.read(bytes);  //7
    System.out.println(new String(bytes,0,len));

在这里插入图片描述


字符流

Write
常见方法
  • write( char[] cbuf)

  • write(char[] cbuf, int off ,int len)

  • write(int c)

  • write( string str)

  • write(string ,int off, int len)

        FileWriter fw = new FileWriter("G:\\javaFiles\\a.txt",true);
        fw.write('a');
        fw.write("风光无限是你,跌落尘埃也是你,重要的是你,而不是怎样的你!");
        fw.close();

在这里插入图片描述

  • append() PS :追加,并不是基于源文件进行追加,而是正常的写操作,当 append= false 时,如果源文件也有内容 会将源文件的所有内容清除 再写入新的内容
        FileWriter fw = new FileWriter("G:\\javaFiles\\a.txt");
//        fw.write('a');
//        fw.write("风光无限是你,跌落尘埃也是你,重要的是你,而不是怎样的你!");
        fw.append("天官赐福");
        fw.close();

在这里插入图片描述

  • close()

  • flush() //PS: 写入会有缓存,需要刷新,否则文件不会也有内容; 调用close 方法时有会执行刷新操作。

常用子类
  • FileWrite()

Read

常用子类
  • FileReader()
常用方法
  • read(char a)
FileReader fir = new FileReader("G:\\javaFiles\\a.txt");
        while(true){
            int r  = fir.read();
            if(r == -1){
                break;
            }
            System.out.print((char)r);
        }
//输出:天官赐福
  • read(char[] a)
     FileReader fr = new FileReader("G:\\javaFiles\\三国.txt");
            char[] chars = new char[100];
    
            while(true){
                int len = fr.read(chars);
                if(len ==-1){
                    break;
                }
                String text = new String(chars,0,len);
                System.out.println(text);
            }
            fr.close();

在这里插入图片描述

字节转换字符流
  • 字节输入流 转换为 字符输入流
    FileInputStream fis = new FileInputStream("G:\\javaFiles\\三国.txt");
            //字节输入流 转换为 字符输入流
            //参数1. 要转换的字节流
            //参数2.指定编码名称
            InputStreamReader isr = new InputStreamReader(fis,"gbk");
            while (true){
                char[] c = new char[100];
                int l = isr.read(c);
                if(l ==-1){
                    break;
                }
                System.out.println(c);
                isr.close();
    
  • 字节输出流 转换为 字符输入流
    //字节输出流 转换为 字符输入流
            FileOutputStream fos = new FileOutputStream("G:\\javaFiles\\e.txt");
            OutputStreamWriter a = new OutputStreamWriter(fos,"utf8");
            a.write("di didadi didadidi,曾经做错的事多的像天上星");
            a.flush();
            a.close();
    

BufferRead

//缓存读取流,将字符 输入流 转换为带有缓存  可以又一次读取一行 的缓存字符串读取流
        FileReader fw = new FileReader("G:\\javaFiles\\e.txt");
        BufferedReader br = new BufferedReader(fw);
        String text = br.readLine();
        System.out.println(text);

Properties

//.properties 文件 与 properties类
        // 写入
        Properties ppt = new Properties();
        ppt.put("name","那一世");
        ppt.put("author","仓央嘉措");
        ppt.put("info","西域最大的王,拉萨最美的情郎");

        FileWriter fw = new FileWriter("G:\\javaFiles\\boks.properties");
        ppt.store(fw,"存储图书");
        fw.close();

        //读出
        Properties ppt1 = new Properties();
        FileReader fr = new FileReader("G:\\javaFiles\\boks.properties");
        ppt1.load(fr);

        System.out.println(ppt1.getProperty("name"));
        System.out.println(ppt1.get("author"));
        System.out.println(ppt1.getProperty("info"));
        fr.close();

输出:
    那一世
	仓央嘉措
	西域最大的王,拉萨最美的情郎

序列化/反序列化

序列化:将对象存储到文件中
反序列化:将存储的对象加载出来
package Serialization;

import java.io.*;

public class Book{
    public static void main(String[] args) throws IOException {
         //序列化 
        Books b = new Books("高等数学","同济大学","计算机必学");
        ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("G:\\javaFiles\\book.txt"));
        oos.writeObject(b);
        oos.close();
        
        //反序列化
         ObjectInputStream ois = new ObjectInputStream(new FileInputStream("G:\\javaFiles\\book.txt"));
        Books o = (Books) ois.readObject();
        System.out.println(o.getInfo());
    }
}

//Serializable 标记接口;必须打标记,否则不允许使用序列化
 class Books implements Serializable{
    private String name;
    private String author;
    private String info;

    public Books(){

    }
    public Books(String name, String author, String info) {
        this.name = name;
        this.author = author;
        this.info = info;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getAuthor() {
        return author;
    }

    public void setAuthor(String author) {
        this.author = author;
    }

    public String getInfo() {
        return info;
    }

    public void setInfo(String info) {
        this.info = info;
    }

    @Override
    public String toString() {
        return "Book{" +
                "name='" + name + '\'' +
                ", author='" + author + '\'' +
                ", info='" + info + '\'' +
                '}';
    }
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只小白小小白小白鼠

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值