JavaSE--IO流

Java IO流

File类

File类的概念

  1. 代表硬盘上的一个文件或者文件夹
  2. Windows中路径表示方式c:aa.txt
  3. Java中路径表示方式:
    • c:\\bb\\aa.txt
    • c:/aa/bb.txt

File类的构造方法

public File(String pathname) //根据给定的文件路径创建File对象

public File(String parent, String child) //根据给定的文件夹路径以及文件名创建一个File对象

public File(File parent, String child) //根据给定的文件夹对象以及为简明名创建一个File对象

File parent = new File("D:\\stuy");

File child1 = new File("D:\\study","Java2024");

File child2 = new File(parent,"Java2024");

File类的常用方法

public static void main(String[] args) throws IOException {
        File file = new File("D:\\study");
        //创建file路径的文件,如果文件存在返回false;
        System.out.println(file.createNewFile());
        //删除file代表等我文件或目录,若为file代表的为目录,目录必须为空才可以成功删除;
//        file.delete();
        //判断file文件或目录是否存在
        System.out.println(file.exists());
        //获得文件的绝对路径
        System.out.println(file.getAbsolutePath());
        //获得文件或者目录的名字
        System.out.println(file.getName());
        //获得文件或者目录的上级目录
        System.out.println(file.getParent());
        //判断file是不是目录
        System.out.println(file.isDirectory());
        //判断file是不是文件
        System.out.println(file.isFile());
        //获得文件上一次修改时间,单位ms(距1970年1月1日时间)
        System.out.println(file.lastModified());
        //获得文件大小
        System.out.println(file.length());
        //获取当前文件夹的子文件或子文件夹对象
        File[] files = file.listFiles();
        for(File file1 : files){
            System.out.println(file1.getName());
        }
        //创建文件夹,只能创建一级
        System.out.println(file.mkdir());
        //创建文件夹,可以创建多级
        System.out.println(file.mkdirs());
    }

绝对路径和相对路径

绝对路径:从盘符开始算起的路径,例如:D:/study

相对路径:相对于当前项目的路径,例如:src/com

字节流

FileInputStream

FileInputStream是文件字节输入流,继承于抽象类InputStream类,用于以字节为单位读取文件。适用于读取任意格式文件

在系统中,任何文件都是以字节为单位存储的,所有FileInputStream可以读取任意文件

构造方法

public FileInputStream(File file)throws FileNotFoundException //根据文件创建字节输入流。

public FileInputStream(String pathname)throws FileNotFoundException //根据路径创建。

常用方法

//读取一个字节数据,如果没有数据可读取,返回-1
public int read() throws IOException;
//将数据从文件读取到字节数组b中,并返回此次读取数据的字节数,若没有数据可以读取,返回-1
public int read(byte[] bytes) throws IOException;
//跳过n个字节
public long skip(long n) throws IOException;
//关闭流
public void close() throws IOException;

FileOutputStream

FileOutputStream是文件字节输出流,继承于抽象类OutputStream类,用于以字节为单位向文件写入数据

构造方法

public FileOutputStream(File file)throws FileNotFoundException //根据文件创建字节输出流。

public FileOutputStream(String pathname)throws FileNotFoundException //根据路径创建。

public FileOutputStream(File file,append)throws FileNotFoundException //append判断是否追加。

public FileOutputStream(String pathname,append)throws FileNotFoundException

常用方法

//将一个字节写入文件
public void write(int b) throws IOException;
//将字节数组b中的数据写入文件
public void write(byte[] b) throws IOException;
//将字节数组b中,从off下标开始的len个字节写入文件
public void write(byte[] b,int off,int len) throws IOException;
//关闭流
public void close() throws IOException;

FileInputStream和FileOutputStream案例–一边读取一边写入(Copy)

package day23;

import java.io.*;

public class TestCopy {
    /**
     * 把Test文件中的文件拷贝到file文件夹中
     * 遇到文件就拷贝,遇到目录就创建
     */
    public static void main(String[] args) {
        File from = new File("Test");
        File to = new File("file") ;
        File[] files = from.listFiles();
        for(File file : files){
            if(file.isFile()){
                copyFile(file,new File(to, file.getName()));
            }else {
                copyDirectory(file,new File(to, file.getName()));
            }
        }

    }
    //拷贝文件方法
    public static void copyFile(File from, File to){
        //创建输入输出流
        try (FileInputStream inputStream = new FileInputStream(from);
             FileOutputStream outputStream = new FileOutputStream(to)){
            byte[] bytes = new byte[1024];
            for(int n = inputStream.read(bytes); n != -1; n = inputStream.read(bytes)){
                outputStream.write(bytes,0,n);
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
    //创建目录方法
    public static void copyDirectory(File from, File to){
        //判断有没有该目录,没有则创建目录
        if(!to.exists()) to.mkdir();
        //如果是目录则遍历目录下文件
        File[] files = from.listFiles();
        if (files == null)return;
        for(File file: files){
            if(file.isFile()){
                copyFile(file,new File(to,file.getName()));
            }else {
                copyDirectory(file,new File(to,file.getName()));
            }
        }
    }
}

FileReader

FileReader是文件字符输入流以字符为单位读取文件,适用于读取纯文本文件

构造方法

public FileReader(File file) throws FileNotFoundException

public FileReader(String pathname) throws FileNotFoundException

常用方法

//读取一个字符数据,如果没有数据可读取返回-1
public int read() throws IOException;
//从字符数组中读取,如果没有数据可读取返回-1
public int read(char[] c) throws IOException;
//跳过n个字符
public long skip(long n) throws IOException;
//关闭流
public void close() throws IOException;

FileWirter

FileWirter是文件字符输出流以字符为单位向文件写入数据

构造方法

public FileWirter(File file)throws FileNotFoundException //根据文件创建字符输出流。

public FileWirter(String pathname)throws FileNotFoundException //根据路径创建。

public FileWirter(File file,append)throws FileNotFoundException //append判断是否追加。

public FileWirter(String pathname,append)throws FileNotFoundException

常用方法

//将一个字符写入文件
public void write(char c) throws IOException;
//将字符数组c中的数据写入文件
public void write(char[] c) throws IOException;
//将字符数组c中,从off下标开始的len个字节写入文件
public void write(char[] c,int off,int len) throws IOException;
//关闭流
public void close() throws IOException;

缓冲流

在内存中开辟一块空间,当调用read或者wirte的方法时,不进行真正的I/O操作,而是对内存中这块空间进行操作。和自己创建数组的方式差不多,但Java中有内置的缓冲区方法,简化代码更能提高性能。

最普通的一个字节一个字节传送 好比 在河边一勺一勺的把水收集进水库

创建数组的方法把勺子换成了杯子

缓冲流就是有人一边拿一个大桶装一桶水,你一边把水桶中的水运到水库

Buffered(InputStream|OutputStream)

给字节输入|输出流增加缓冲功能

构造方法

public BufferIn(Out)putStream(InputStream/OutputStream b) //创建一个大小为8kB的字节缓冲流

public BufferIn(Out)putStream(InputStream/OutputStream b,int size) //创建一个大小为size的字节缓冲流

Buffered(Reader|Writer)

给字符输入|输出流增加缓冲功能

构造方法

public BufferReader(Writer)(Reader/Writer c) //创建一个大小为8kB的字符缓冲流

public BufferReader(Writer)(Reader/Writer c,int size) //创建一个大小为size的字符缓冲流

try-with-resource(语法糖TWR)

该方法可以在try结束后自动回调close()方法。普通的try-catch需要在finally调用close()方法确保流的关闭。

//将流放入try后的括号中
try (FileInputStream inputStream = new FileInputStream(from);
     FileOutputStream outputStream = new FileOutputStream(to)){
            byte[] bytes = new byte[1024];
            for(int n = inputStream.read(bytes); n != -1; n = inputStream.read(bytes)){
                outputStream.write(bytes,0,n);
            }
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }

ObjectOutputStream

对象输入流,主要作用是把对象写入文件中。需要写入的对象必须是可序列化的,即对象要实现Serializable接口,除了对象还能把基本数据类型写入文件。

构造方法

//创建一个对象输出流,需要一个输出流作为参数

public ObjectOutputStream(OutputStream out) throws IOException

核心方法

package day24;

import java.io.*;

public class TestObject implements Serializable{
    private String name;
    private int age;

    public TestObject(String name, int age) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {
        try(ObjectOutputStream outputStream = new ObjectOutputStream(new FileOutputStream("file\\aa.txt"))) {
            //写入整数类型数据
            outputStream.writeByte(100);
            outputStream.writeShort(200);
            outputStream.writeInt(300);
            outputStream.writeLong(400);
            //写入浮点型数据
            outputStream.writeFloat(3.14F);
            outputStream.writeDouble(3.1415);
            //写入字符数据
            outputStream.writeChar('夏');
            //写入字符串
            outputStream.writeUTF("CnYuu");
            //写入对象
            outputStream.writeObject(new TestObject("CuYuu",21));
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
    }
}

transient关键字

如果对象的某个属性不想序列化(不想存入文件),可以通过transient关键字进行修饰。

ObjectInputStream

构造方法

//创建一个对象输入流,需要一个输出流作为参数

public ObjectInputStream(InputStream in) throws IOException

核心方法

package day24;

import java.io.*;

public class TestObject1 {
    public static void main(String[] args) {
        try(ObjectInputStream inputStream = new ObjectInputStream(new FileInputStream("file\\aa.txt"))) {
            //读出整数类型数据
            System.out.println(inputStream.readByte());
            System.out.println(inputStream.readShort());
            System.out.println(inputStream.readInt());
            System.out.println(inputStream.readLong());
            //读出浮点型数据
            System.out.println(inputStream.readFloat());
            System.out.println(inputStream.readDouble());
            //读出字符数据
            System.out.println(inputStream.readChar());
            //读出字符串
            System.out.println(inputStream.readUTF());
            //读出对象
            System.out.println(inputStream.readObject());
        } catch (IOException e) {
            throw new RuntimeException(e);
        } catch (ClassNotFoundException e) {
            throw new RuntimeException(e);
        }
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值