File类及I/O流讲解

目录

一、Stream流

简介

分类

二、File类

概述

常用方法

代码详解

三、字节流

概述

文件输出流

文件输入流

字节缓冲流

四、字符流

概述

转换流

字符缓冲流

一、Stream流
简介
学习下面的知识前,我们先来了解下,什么是流?

流的概念:抽象概念,是对数据传输的总称,数据在设备间的传输称为流,流的本质是数据传输。

I/O流就是用来处理设备间传输问题的。

分类
按数据流向划分:输入流和输出流

按数据类型划分:

二、File类
概述
封装一个磁盘路径字符串,对这个路径可以执行操作,可以封装文件路径、文件夹路径、不存在的路径。

常用方法

代码详解
import java.io.File;
import java.io.IOException;

public class Test {
public static void main(String[] args) throws IOException {

    // 通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例
    File file = new File("E:\\根路径\\路径2");
    // 从父路径名字符串和子路径名字符串创建新的File实例
    File file1 = new File("E:\\根路径","路径2\\test");
    // 从父抽象路径名和子路径名字符串创建新的File实例
    File file2 = new File(file1,"路径2\\test");

    // 当具有该名称的文件不存在时,创建一个由该抽象路径名命名的新空文件
    File f = new File("E:\\根路径\\路径2\\test\\hello.txt");
    // exists() 测试此抽象路径名表示的File是否为文件
    if(!f.exists()){
        f.createNewFile();
    }
    // mkdir() 创建由此抽象路径名命名的目录
    // mkdirs() 创建由此抽象路径名命名的目录,包括任何必需但不存在的父目录
    File f1 = new File("E:\\根路径\\路径2\\test1");
    f1.mkdir();

    System.out.println("----------------------------");
    // getAbsolutePath() 返回此抽象路径名的绝对路径名字符串
    System.out.println(f1.getAbsoluteFile());

    System.out.println("----------------------------");
    // getPath() 将此抽象路径名转换为路径名字符串
    System.out.println(f1.getPath());

    System.out.println("----------------------------");
    //getName() 返回由此抽象路径名表示的文件或目录的名称
    System.out.println(f1.getName());

    System.out.println("----------------------------");
    // list() 返回此抽象路径名表示的目录中的文件和目录的名称字符串数组
    for (String s: file.list()){
        System.out.println(s);
    }

    System.out.println("----------------------------");
    // listFiles() 返回此抽象路径名表示的目录中的文件和目录的File对象数组
    for (File f0 : file.listFiles()){
        System.out.println(f0);
    }

    System.out.println("----------------------------");
    // isFile() 测试此抽象路径名表示的File是否为文件
    // isDirectory() 测试此抽象路径名表示的File是否为目录
    System.out.println(file1.isDirectory());
    System.out.println(file1.isFile());

    System.out.println("----------------------------");
}

}
这里留一个思考,如何获取一个文件夹下所有文件的绝对路径(包括子文件夹下的文件)?

提示:递归遍历

代码参考

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

public class Test {
public static void main(String[] args) throws IOException {

    File file = new File("E:\\根路径\\路径1");
    getAllFile(file);

}
public static void getAllFile(File file){
    File[] files = file.listFiles();
    for (File f : files){
        if(f.isDirectory()){
            getAllFile(f);
        }else {
            System.out.println(f.getAbsolutePath());
        }
    }
}

}
运行结果:

三、字节流
概述
字节流是由字节组成的,Java里字符由两个字节组成.字节流是基本流,主要用在处理二进制数据。所以字节流是比较常用的,可以可以处理多种不同种类的文件,比如文本文档/音频/视频等等。

文件输出流
OutputStream抽象类,表示所有字节输出流的超类。

常用方法

FileOutputStream子类,直接写入文件数据

FileOutStream(String name)创建文件输出流以指定的名称写入文件。

FileOutStream(String name,boolean b)追加写入。

代码部分

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

public class Test {
public static void main(String[] args) throws IOException {

    File file = new File("E:\\根路径\\路径1\\资源文件1\\文件1.txt");
    FileOutputStream fos = new FileOutputStream(file);
    fos.write(48);
    byte[] bys = new byte[]{65, 66,67,68,69,70};
    fos.write(bys);
    fos.write(bys,2,3);
    fos.close();
}

}
运行结果:

文件输入流

FileInputStream子类,直接读取文件数据

FileInputStream(String name)创建文件输入流以指定的名称读取文件。

代码部分

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

public class Test {
public static void main(String[] args) throws IOException {

    File file = new File("E:\\根路径\\路径1\\资源文件1\\文件1.txt");
    FileInputStream fis = new FileInputStream(file);
    int i;
    while ((i=fis.read())!=-1){
        System.out.print((char)i + " ");
    }
}

}
运行结果:

字节缓冲流
BufferedOutputSream 字节缓冲输出流。

实现缓冲输出流,可以向底层输出流写入数据,而不必为写入的每个字节导致系统的调用。

构造方法

BufferedOutputSream(OutputStream out)

BufferedOutputSream(OutputStream out,int size)

BufferedInputSream 字节缓冲输入流

将创建一个内部缓冲数组,当从流中读取或者跳过字节时,内部缓冲区将根据需要从所包含的输入流中重新填充,一次很多字节

构造方法

BufferedInputSream(InputStream in)

BufferedInputSream(InputStream in,int size)

代码部分

import java.io.*;

public class Test {
public static void main(String[] args) throws IOException {

    File file = new File("E:\\根路径\\路径1\\资源文件1\\文件1.txt");
    BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(file));
    bos.write(48);
    bos.close();

    BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file));
    int i;
    while ((i=bis.read())!=-1){
        System.out.println((char)i);
    }
}

}
运行结果:

四、字符流
概述
组成:字节流 + 编码表。

编码表
ASCLL
GBXXX字符集
Unicode
采用任何规则编码,解码时也必须是对应的规则,否则会出现乱码
编码
byte[] getBytes() 使用平台默认规则编码
byte[] getBytes(String charsetName) 使用指定规则编码
解码
String(byte[] bytes) 使用平台默认规则解码
String(byte[] bytes,String charsetName) 使用指定规则解码

转换流
字符流抽象基类
Reader
Writer

转换流
InputStreamReader( FileInputStream fis );
OutputStreamWriter( FileOutputStream fos );

简化版
FileReader
FileWriter

写数据的方式
(根据参数不同)

读数据的方式
read() 一次读一个字符数据
read(char[] c) 一次读一个字符数组数据

代码部分

import java.io.*;

public class Test {
public static void main(String[] args) throws IOException {

    File file = new File("E:\\根路径\\路径1\\资源文件1\\文件1.txt");
    File file1 = new File("E:\\根路径\\路径1\\资源文件1\\文件2.txt");

    // 转换流
    OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(file));
    osw.write("我爱Java");
    osw.close();

    InputStreamReader isr = new InputStreamReader(new FileInputStream(file));
    int s ;
    while ((s=isr.read())!=-1){
        System.out.print((char)s);
    }
    isr.close();

    System.out.println();
    // 简化版
    FileWriter fw = new FileWriter(file1);
    fw.write("我爱Java");
    fw.close();

    FileReader fr = new FileReader(file1);
    int i;
    while ((i = fr.read())!=-1){
        System.out.print((char)i);
    }

}

}
运行结果:

字符缓冲流
BufferedReader

从文本输入流读取文本,缓冲字符,以提供字符,数组和行的高效读取,可以指定缓冲区大小,或者可以接受默认的大小,默认值足够大,可用于大多数用途.

BufferedWrite

将文本写入字符输出流,缓冲字符,以提供单个字符数组和字符串的高效写入,可以指定缓冲区大小,或者可以接受默认的大小,默认值足够大,可用于大多数用途.

特有功能
newLine 写一行行分隔符,行分隔符由系统定义属性
readLine() 读一行文字,结果包含行的内容的字符串,不包括任何行终止符,如果流的结尾已经到达,则返回null.

代码部分

import java.io.*;

public class Test {
public static void main(String[] args) throws IOException {

    File file = new File("E:\\根路径\\路径1\\资源文件1\\文件1.txt");

    BufferedWriter writer = new BufferedWriter(new FileWriter(file));
    writer.write("我非常喜欢Java");
    writer.newLine();
    writer.write("我也非常喜欢Java");
    writer.close();

    BufferedReader reader = new BufferedReader(new FileReader(file));
    String s;
    while ((s=reader.readLine())!=null){
        System.out.println(s);
    }


}

}
运行结果:

这次的分享就暂时到这里,如有错误的地方请多多指出,谢谢您的阅读。

                    ​​​​​​​        ​​​​​​​        

————————————————
版权声明:本文为CSDN博主「进制转生~成为程序员就拿出真本事」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/H445584704/article/details/121299822

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值