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);
        }


    }
}

运行结果:

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

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

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>