IO流的理解

目录

1.文件类

2.FileInputStream

3.FileOutputStream

4.FileReader

5.FileWriter

6.BufferedInputStream

7.BufferedReader

8.转换流

9.打印流

10.对象流

11.总结


1.文件类

在Java中,java.io.File 类是用于表示文件系统中的文件和目录路径名的实用工具类。这个类提供了创建、删除、移动、重命名以及查询文件和目录的方法。但是需要注意的是,java.io.File 类并不支持文件锁定,而且它所提供的功能是基于文件系统的底层操作,并不涉及文件的读写操作。若需要进行文件的读写操作,应使用 java.io 包中的其他类,如 FileInputStreamFileOutputStream 等。

其中包含了一些方法,直接看实例。

package day12;

import java.io.File;
import java.io.IOException;

public class FileTest {
    public static void main(String[] args) {
        //绝对路径
        File file = new File("C:\\Users\\34569\\Desktop\\a.txt");
        //相对路径
        File file1 = new File("pro01/src/day12/b.txt");
        //可读可写
        System.out.println(file.canRead());
        System.out.println(file.canWrite());
        //判断文件是否隐藏
        System.out.println(file.isHidden());
        //判断file类型:文件 | 目录
        System.out.println(file.isFile());
        System.out.println(file.isDirectory());
        //判断是否为绝对路径
        System.out.println(file.isAbsolute());
        //判断文件或目录是否存在
        System.out.println(file.exists());
        //文件或目录的创建
        File file2 = new File("temp");
        if (!file2.exists()){
            //创建对应的子目录(基于父目录存在)
            file2.mkdir();
        }
        //File file3 = new File("a/b/c");
        //目录的创建(如果父级目录不存在,则父目录不存在)
        //file3.mkdirs();
        //创建临时文件
        //File.createTempFile("AAA",".java",file2);
        //删除文件或目录
        //file.delete();
        System.out.println("文件大小:"+file1.length());
        System.out.println("最后修改时间"+file1.lastModified());
        System.out.println("文件名:"+file1.getName());

        String fileName=file1.getName();
        System.out.println("格式:"+fileName.substring(fileName.lastIndexOf('.')));
        System.out.println("路径:"+file1.getPath());
        System.out.println("绝对路径:"+file1.getAbsoluteFile());
        System.out.println("父目录:"+file1.getParentFile());
        System.out.println("分区大小:"+file1.getTotalSpace());
        System.out.println("空闲大小:"+file1.getFreeSpace());

    }
}

2.FileInputStream

作用:用于读取文件的字节数据(字节输入流)。

实例运用:

package day12;

import java.io.FileInputStream;
import java.io.IOException;

public class FileInput {
    public static void main(String[] args) throws IOException {
        //可读
        FileInputStream fil= new FileInputStream("pro01/src/day12/b.txt");
        //读取一个字符
        //System.out.println((char)fil.read());
        /*//循环读取,一次读取10个字节
        int count = 0;
        byte by[] = new byte[10];
        while ((count = fil.read(by)) != -1) {
             System.out.print(new String(by, 0, count));
            }
        System.out.println((char) fil.read());*/
        //读取三个字节的数据为字节数组。 
        byte by[]=new byte[3];
        fil.read(by);
        System.out.println(new String(by));
        //实现关流操作
        fil.close();
    }
}

3.FileOutputStream

作用:向文件中写人字节数据(字节输出流)。

实例运用:

package day12;

import javax.lang.model.element.NestingKind;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class Fileoutput {
    public static void main(String[] args) throws IOException {
        //可写,true用于追加写入
        FileOutputStream fil = new FileOutputStream("pro01/src/day12/c.txt",true);
        //写入信息
        String str="fhw\n";
        //将字符串转换为字节数组
        byte by[]=str.getBytes();
        fil.write(by);
        fil.close();

    }
}

4.FileReader

作用:FileReader类创建了一个可以读取文件内容的Reader类(字符输入流)。

实例运用:

package day13;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;

public class FileReader_Text {
    public static void main(String[] args) throws IOException {
        //字符流
        FileReader file = new FileReader("pro01/src/day13/readme.txt");
        //一次读取一个
        /*System.out.println((char)file.read());
        System.out.println((char)file.read());
        System.out.println((char)file.read());*/
        //一次读取一个,循环读取
       /* int ch=0;
        while ((ch=file.read())!=-1){
            System.out.print((char) ch);
        }*/
        //一次读取10个,循环读取
        char chs[]=new char[10];
        int len=0;
        while ((len= file.read(chs))!=-1){
            System.out.print(new String(chs,0,len));
        }
        file.close();
    }
}

5.FileWriter

作用:​ FileWriter 创建一个可以写文件的Writer类(字符输出流)

实例运用:

package day13;

import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;

public class FileWrite_Text {
    public static void main(String[] args) throws IOException {
        //字符流(输出流,如果文件不存在,将自动创建),如需追加数据,则在后面添加true
        FileWriter file = new FileWriter("pro01/src/day13/hello.txt",true);
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你要写入的数据:");
        String str=scanner.nextLine();
        file.write(str);
        //刷流,内存->刷新->键盘
        file.flush();
        //file.close();

    }
}

6.BufferedInputStream

缓冲字节输入流:BufferedInputStream。BufferedInputStream为另一个输入流添加一些功能,即缓冲输入以及支持`mark` 和`reset` 方法的能力。

实例运用:

package day13;

import java.io.*;

public class Buf_InputStream {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("pro01/src/day13/dk.txt");
        BufferedInputStream bos = new BufferedInputStream(fis);
        System.out.println((char) bos.read());
        //做一个标记
        bos.mark(0);
        System.out.println((char) bos.read());
        System.out.println((char) bos.read());
        //是否支持mark()和reset()
        System.out.println(bos.markSupported());
        System.out.println("----------");
        //回溯
        bos.reset();
        System.out.println((char) bos.read());
        //跳过两个字符
        bos.skip(2);
        System.out.println((char) bos.read());
        bos.close();
        fis.close();
    }
}

注:BufferedOutputStream()无新方法,与FileOutputStream()一样

7.BufferedReader

BufferedReader从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。 mark和 reset方法。新增了readLine()方法用于一次读取一行字符串(以‘\r’或‘\n’认为一行结束)。

BufferedWriter将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入,BufferedWriter也有readLine()方法,void newLine() 可以换行。

实例运用,实现文件的复制和粘贴:

package day13;

import java.io.*;

public class Ts {
    public static void main(String[] args) throws IOException {
        
        File file = new File("pro01/src/day13/dk.txt");
        FileReader file1 = new FileReader(file);
        BufferedReader brd = new BufferedReader(file1);
    
        File file2 = new File("pro01/src/day13/hello.txt");
        FileWriter file3 = new FileWriter(file2);
        BufferedWriter hdc = new BufferedWriter(file3);
        //先从文件中读出数据,再将读出的数据写入另一个文件
        String str;
        while ((str=brd.readLine())!=null){
            hdc.write(str);
        }
        brd.close();
        hdc.close();
        
    }
}

8.转换流

转换流InputStreamReader和OutputStreamWriter分别将InputStream字节输入流和OutputStream字节输出流 转换成BufferedReader和BufferedWriter(字符缓冲流),以便实现高效率的读写操作

举例:

FileOutputStream fileOutputStream = new FileOutputStream("example.txt");

OutputStreamWriter outputStreamWriter = new OutputStreamWriter(fileOutputStream);

BufferedWriter bufferedWriter = new BufferedWriter(outputStreamWriter);

9.打印流

在这里简单介绍一下字节打印流和字符打印流

请看两个实例说明:

1.字节打印流

package day14;

import java.io.FileNotFoundException;
import java.io.PrintStream;
import java.util.Scanner;

public class Text_PrintStr {
    public static void main(String[] args) throws FileNotFoundException {
        //字节打印流,可以自动刷流
        PrintStream pri = new PrintStream("pro01/src/day14/one.txt");
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入你要输出的内容");
        String str=scanner.nextLine();
        pri.println(str);
        //追加输入内容
        pri.append("搁浅");
        pri.close();
    }
}

2.字符打印流

package day14;

import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

public class Text_PrintWri {
    public static void main(String[] args) throws IOException {
        //字符打印流,不自动刷流
        PrintWriter pop = new PrintWriter("pro01/src/day14/two.txt");
        /*如果需要连续追加,就可以这样
        FileWriter fileWriter = new FileWriter("pro01/src/day14/two.txt",true);
        PrintWriter pop = new PrintWriter(fileWriter);*/
        String str="大话西游";
        //传统的字符流输出方法
        //pop.write(str);
        pop.println(str);
        pop.append("主演:周星驰");
        pop.flush();

    }
}

10.对象流

在Java中提供了ObjectlnputStream与ObjectOutputStream这两个类用于序列化对象的操作。使用对象输出流输出序列化对象的步骤,有时也称为序列化。使用对象输入流读入对象的过程,有时也称为反序列化。

下面请看实例:

首先我们先创建一个学生类:

package day14;
//序列化接口,接口中定义了一种特定序列化规则,以及反序列化规则
import java.io.*;

public class Student implements Serializable {
    //Idea 配置自动生成序列号:
    private static final long serialVersionUID = -8278694685252690580L;
    //如果不希望类中的属性被序列化,可以在声明属性之前加上transient关键字。
    private  String name;
    private int age;
    private char sex;

    public String getName() {
        return name;
    }

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

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public char getSex() {
        return sex;
    }

    public void setSex(char sex) {
        this.sex = sex;
    }

    public Student() {
    }

    public Student(String name, int age, char sex) {
        this.name = name;
        this.age = age;
        this.sex = sex;
    }
    public void stduy(){
        System.out.println("好好学习,天天向上");
    }
    public void showMe(){
        System.out.println("姓名:"+this.name+",年龄:"+this.age+",性别:"+this.sex);
    }
    //字符流:对象toString后的对象信息存入文件
    //将对象信息,转换成为某种特定规则的字符串信息,字符串信息->文件中(序列化)
    //从文件读取字符串信息->解剖->对象(反序列化)


    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                ", sex=" + sex +
                '}';
    }



    }

接下来我们写入对象数据(序列化)

package day14;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

public class Tx_ObjectOpStream {
    public static void main(String[] args) throws IOException {
        FileOutputStream fos = new FileOutputStream("pro01/src/day14/object.txt");
        //创建对象流
        ObjectOutputStream oos = new ObjectOutputStream(fos);
        Student s1 = new Student("张三",22,'男');
        oos.writeObject(s1);
        oos.writeObject(null);
        oos.flush();
        /*对象数据存储思维:
        1.
        写:循环写入对象数据,最后再写null对象。
        读:循环读取对象数据,当读取到null时候结束。
        2。
        写:把所有对象数据写入到集合中(List,Set,Map),将集合对象写入。
        读:读取对象将对象强转换为集合对象,循环遍历集合。*/


    }
}

最后读取对象数据(反序列化)

package day14;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.ObjectInputStream;

public class Tx_ObjectIpStr {
    public static void main(String[] args) throws IOException, ClassNotFoundException {
        FileInputStream fis = new FileInputStream("pro01/src/day14/object.txt");
        ObjectInputStream ois = new ObjectInputStream(fis);
        //Student obj=(Student) ois.readObject();
        //System.out.println(obj);
        //循环读取
        //读取到最后没有对象不是返回Null,而是直接抛异常
        Object obj=null;
        while ((obj=ois.readObject())!=null){
            Student student=(Student) obj;
            System.out.println(student);
        }

    }
}

11.总结

以上就是我对IO流的理解,内容较多,比较繁杂,容易混淆,大家可以通过练习,多加巩固,以达到熟练掌握的地步。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值