Java学习08-IO流

这篇博客详细介绍了Java中的IO流,包括文件操作、流的分类、FileInputStream和FileOutputStream的使用、FileReader和FileWriter的介绍,以及节点流、处理流的概念和区别。还探讨了包装流、对象流、标准输入输出流、转换流和打印流的使用方法,最后提到了Properties类在读写配置文件中的应用。
摘要由CSDN通过智能技术生成

IO流

一、文件

1.1、概念

文件是保存数据的地方,可以是word,txt,excel,mp3,mp4等等等。保存的内容可以是视频,声音等等

1.2、文件流

文件是在程序中是以流的方式来操作
文件流

流:数据在数据源(文件)和程序(内存)之间的路径

输入流:数据从数据源到程序

输出流:数据从程序到数据源

输入输出是以程序做参考

1.3、常用操作

创建文件对象
  • 在执行方法前,只是在内存里创建了文件并没有跟磁盘交互,调用方法后才写入磁盘
//方法1:根据路径构建一个File对象
public void create01(){
   
    String filePath = "f:\\Garbage\\news1.txt";
    File file = new File(filePath);

    try {
   
        file.createNewFile();
        System.out.println("创建1成功");
    } catch (IOException e) {
   
        e.printStackTrace();
    }

}

//方式2:根据父目录文件+子路径构建
public void create02(){
   
    File parentFile = new File("f:\\Garbage\\");
    String fileName = "news2.txt";
    File file = new File(parentFile, fileName);
    try {
   
        file.createNewFile();
        System.out.println("创建2成功");
    } catch (IOException e) {
   
        e.printStackTrace();
    }

}
//方式3:new File(String parent,String child) //根据父目录+子路径构建
@Test
public void create03(){
   
    String parentPath = "f://Garbage//";
    String fileName = "news3.txt";
    File file = new File(parentPath, fileName);
    try {
   
        file.createNewFile();
        System.out.println("创建3成功");
    } catch (IOException e) {
   
        e.printStackTrace();
    }
}
获取文件信息
//获取文件信息
@Test
public void info(){
    //创建文件对象
    File file = new File("f:\\Garbage\\news1.txt");

    //调用方法
    System.out.println("文件名:"+file.getName());
    System.out.println("绝对路径:"+file.getAbsolutePath());
    System.out.println("父目录:"+file.getParent());
    System.out.println("文件大小:"+file.length());
    System.out.println("是否存在:"+file.exists());
}
目录(文件夹)操作和文件删除
//判断F盘是否有文件存在,如果有则删除
@Test
public void m1(){
    String filePath = "F:\\Garbage\\news1.txt";
    File file = new File(filePath);
    if(file.exists()){
       if (file.delete()){
           System.out.println("删除成功");
       }else{
           System.out.println("删除失败");
       }
    }else{
        System.out.println("不存在该文件");
    }
}

//判断目录是否存在,存在就删除否则提示不存在
//可以体会到目录也被当做文件
@Test
public void m2(){
    String filePath = "F:\\Garbage\\Test";
    File file = new File(filePath);
    if(file.exists()){
        if (file.delete()){
            System.out.println("删除成功");
        }else{
            System.out.println("删除失败");
        }
    }else{
        System.out.println("不存在该目录");
    }
}

//判断目录是否存在,如果不存在创建目录
@Test
public void m3(){
    String directoryPath = "F:\\Garbage\\a\\b\\c";
    File file = new File(directoryPath);
    if(file.exists()){
        System.out.println("该目录已经存在");
    }else {
        if (file.mkdirs()) {       //mkdir创建一级目录,mkdirs创建多级目录
            System.out.println("创建成功");
        } else {
            System.out.println("创建失败");
        }
    }
}

二、IO流原理和流的分类

2.1、IO流原理

  1. I/O是Input/Output的缩写,用于数据传输,读写文件,网络通讯
  2. Java程序中,对于数据的输入/输出操作以“流”的方式进行
  3. java.io包下提供了各种“流”类和接口,用于获取不同种类的数据,并通过方法输入或输出数据
  4. 输入input:读取外部数据(磁盘、光盘等存储设备的数据)到程序(内存中)
  5. 输出output:将程序(内存)中的数据输出到磁盘、光盘等外部设备中

2.2、流的分类

  • 按操作数据单位不同分为:字节流(8bit)二进制文件,字符流(按字符)文本文件

  • 按数据流的流向不同分为:输入流,输出流

  • 按流的角色不同分为:节点流,处理流/包装流

    在这里插入图片描述

    1. Java的IO流设计40多个类,实际上非常规则,都是从四个抽象基类派生的
    2. 由着四个类派生出来的子类都是以父类名作为子类名后缀

在这里插入图片描述

三、FileInputStream/FileOutputStream

(文件字节输入/输出流)

InputStream:字节输入流

  • InputStream抽象类是所有类字节输入流的超类
  • InputStream常用的子类:
    1. FileInputStream:文件输入流
    2. BufferedInputStream:缓冲字节输入流(管道流)
    3. ObjectInputStream:对象字节输入流

3.1、FileInputStream

在这里插入图片描述
在这里插入图片描述

//读取文件
@Test
public void readFile01(){
    String filePath = "f:\\Garbage\\hello.txt";
    int readData = 0;
    FileInputStream fileInputStream = null;

    try {
        //创建FileInputStream对象用来读取hello文件
         fileInputStream = new FileInputStream(filePath);
        //read():从该输入流读取一个字节如果没有输入可用,方法停止
        //如果返回-1读取完毕
        while((readData=fileInputStream.read()) != -1){
            System.out.print((char) readData);
        }
    } catch (IOException e) {
        e.printStackTrace();
    }finally{
        //关闭流释放资源
        try {
            fileInputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

//使用read(byte[] b)读取
@Test
public void readFile02(){
    String filePath = "f:\\Garbage\\hello.txt";
    //字节数组
    byte[] buffer =new byte[8];
    int readLength = 0;
    FileInputStream fileInputStream = null;

    try {
        //创建FileInputStream对象用来读取hello文件
        fileInputStream = new FileInputStream(filePath);
        //从该输入流读取最多b.length字节到字节数组。此方法将阻塞,直到某些输入可以可用
        //如果返回-1读取完毕
        //如果读取正常,返回实际读取字节数
        while((readLength=fileInputStream.read(buffer)) != -1){
            System.out.print(new String(buffer,0, readLength));

        }
    } catch (IOException e) {
        e.printStackTrace(); 
    }finally{
        //关闭流释放资源
        try {
            fileInputStream.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

3.2、FileOutputStream

在这里插入图片描述

在这里插入图片描述

注意:

在使用write(byte[] b)时,若byte[] b = new byte[1024],当有1029个文件,第一次输出1024,第二次仍是1024容易数据错乱

推荐使用write(byte[] b,int off,int len)方法

 // 将数据写入文件中,如果文件不存在就创建
    @Test
    public void writeFile(){
        //创建FileoutputStream对象
        String filePath = "F:\\Garbage\\a.txt";
        FileOutputStream fileOutputStream = null;

        try {
            //初始化fileOutputStream对象
            /*
             fileOutputStream = new FileOutputStream(filePath);  //写入内容时会覆盖原来的内容
             fileOutputStream = new FileOutputStream(filePath,true); //则变成追加而不是覆盖
             */
            fileOutputStream = new FileOutputStream(filePath,true);  //写入内容时会覆盖原来的内容
           //1.写入一个字节
//            fileOutputStream.write('H');
            //2.写入字符串
            //str.getByte()可以把字符串转成字节数
            String str = "helloworld2";
            fileOutputStream.write(str.getBytes(),0,str.length());

        } catch (IOException e) {
            e.printStackTrace();
        }finally {
            try {
                fileOutputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }

3.3、文件复制

通过输入输出流实现文件复制

public static void main(String[] args) {
    //1.将文件读入程序
    //2.将读取的文件数据写入到指定的位置
    String srcFilePath = "C:\\Users\\Administrator\\Pictures\\Saved Pictures\\壁纸 (1).jpg";
    String destFilePath = "F:\\Garbage\\picture.jpg";
    FileInputStream fileInputStream = null;
    FileOutputStream fileOutputStream = null;


    try {
        fileInputStream = new FileInputStream(srcFilePath);
        fileOutputStream = new FileOutputStream(destFilePath);
        //定义一个字节数组提高效率
        byte[] buffer = new byte[1024];
        int readLen = 0;
        while((readLen = fileInputStream.read(buffer)) != -1){
            //读取到之后就输出出去,通过 FileOutputStream
            //边读边写
            fileOutputStream.write(buffer,0,readLen);   //一定要使用这个方法,否则容易数据错乱
            //在使用write(byte[] b)时,如果有1029个文件,第一次输出1024,第二次仍是1024容易数据错乱


        }
        System.out.println("拷贝成功");
    } catch (IOException e) {
        e.printStackTrace();
    }finally {
        if(fileInputStream != null){
            try {
                fileInputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        if(fileOutputStream != null){
            try {
                fileOutputStream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }


}

四、FileReader/FileWriter(文件字符输入/输出流)

  • FileReader和FileWriter介绍

    FileReader和FIleWriter是字符流,及通过字符来操作io

FileReader

相关方法:

  1. new FileReader(File/String)
  2. read():每次读取单个字符,如果到文件末尾返回-1
  3. read(char[]):批量读取字符到数组,返回读到的字符数,如果到文件末尾返回-1

相关API:

  1. new String(char []):将char[]转换为String
  2. new String(char[],int off,int len):将char[]的指定部分转换为String
@Test
public void Read01() {
    String filePath = "F:\\Garbage\\story.txt";
    FileReader fileReader = null;
    int data = 0;

    try {
        //初始化FileReader对象
        fileReader = new FileReader(filePath);
        //利用循环 使用read单个字符读取
        while ((data = fileReader.read()) != -1) {
            System.out.print((char) data);
        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (fileReader != null) {
            try {
                fileReader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

@Test
public void Read02() {
    String filePath = "F:\\Garbage\\story.txt";
    FileReader fileReader = null;
    int len = 0;
    char[] buffer = new char[1024];

    try {
        //初始化FileReader对象
        fileReader = new FileReader(filePath);
        //利用循环 使用read(char [])读取字符数组,返回时机读取到的字符数
        while ((len = fileReader.read(buffer)) != -1) {
            System.out.println(new String(buffer,0,len));

        }
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (fileReader != null) {
            try {
                fileReader.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}

FileWriter

相关方法:

  1. new FileWriter(File/String):覆盖模式,相当于流的指针在首端
  2. new FileWriter(File/String , true):追加模式,相当于流的指针在末端
  3. write(int):写入单个字符
  4. write(char []):写入指定字符数组
  5. write(char [],int off,int len):写入字符数组指定部分
  6. write(String):写入字符串
  7. writer(String,int off,int len):写入字符串指定部分

相关API:

  • String类:toCharArray:将String转化为char[]

注意:

FileWriter使用后,必须要关闭(close)或刷新(f

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值