IO流及其简介

IO流

一.IO流的概述

​ IO流,简单来说就是存储和读取数据的解决方案。而IO流与File又息息相关,因此在正式学习IO流之前先来简单的认识一下File。

File

​ 它表示系统中文件或者文件夹的路径,这个路径可以是存在的,也可以是不存在的。File类只能对文件本身进行操作,不能读写文件里面存储的数据。在File类中有三种构造方法

public File(String pathname)    //把字符串表示的路径编程File对象
public File(String pathname,String child)  //把父级路径和子级路径进行拼接
public File(File path,String child)  //把父级路径和子级路径进行拼接

File中有一些常见方法需要我们知道:

public class File文件 {
    public static void main(String[] args){
        /*
        public boolean isDiectory()    判断路径名表示的File是否为文件夹
        public boolean isFile()         判断路径名表示的File是否为文件
        public boolean exists()         判断路径名表示的File是否存在
         */

        //判断的方法
        //1.对一个文件的路径进行判断
        File f1=new File("C:\\Users\\Administrator\\Desktop\\game\\崩坏:星穹铁道.lnk");
        System.out.println(f1.isFile());
        System.out.println(f1.isDirectory());
        //2.对一个文件夹的路径进行判断
        File f2=new File("C:\\Users\\Administrator\\Desktop\\game");
        System.out.println(f2.isFile());
        System.out.println(f2.isDirectory());
        //3.对一个不存在的路径进行判断
        File f3=new File("D:\\Users\\Administrator\\Desktop\\game");
        System.out.println(f3.exists());

        //获取的方法
        /*
        public long length()      返回文件的大小(字节数量)
        public String getAbsolutePath()    返回文件的绝对路径
        public String getPath()    返回定义文件时使用的路径
        public String getName()    返回文件的名称,带后缀
        public long lastModified()  返回文件的最后修改时间(时间毫秒值)
         */

        //1.length
        //细节1:该方法返回的是文件的字节大小,如果要转换位M,G,需要一直除以1024
        System.out.println(f1.length());
        //细节2:该方法不能够返回文件夹的大小,得到的值是错误的,如果要获得文件夹的大小,需要将文件夹里的文件大小累加起来
        System.out.println(f2.length());

        //2.getAbsolutePath
        File f4=new File("lnk");
        System.out.println(f4.getAbsolutePath());
        System.out.println(f2.getAbsolutePath());

        //3.getPath()
        System.out.println(f1.getPath());

        //4.获取名字
        //细节:如果说调用者是文件,则会返回其文件名和后缀名;如果是文件夹,则返回文件夹的名字
        System.out.println(f1.getName());
        System.out.println(f2.getName());

        //5.lastModified  返回文件的最后修改时间(时间毫秒值)
        System.out.println(f1.lastModified());
    }
}
public class File2 {
    public static void main(String[] args) throws IOException {
        /*
        public boolean creatNewFile()   创建一个新的空的文件夹
        public boolean mkdir()        创建单级文件夹
        public boolean mkdirs()        创建多级文件夹
        public boolean delete()        删除文件,空文件夹
         */

        //1.creatNewFile   创建一个新的空的文件夹
        //细节:1.如果当前路径表示的文件是不存在的,则创建成功,方法返回true,否则创建失败,返回false
        //    2.如果父级路径不存在,那么方法会有异常IOEXception
        //    3.creatNewFile方法创建的一定是文件,如果路径中不包含后缀名,则创建一个没有后缀的文件
        File f1=new File("D:\\1\\aaa.txt");
        System.out.println(f1.createNewFile());

        //2.mkdir   make Director     文件夹(目录)
        //细节:1.windows当中路径是唯一的,如果当前路径已经存在,则创建失败,返回false
        //    2.mkdir方法只能创建单级文件夹,无法创建多级文件夹
        File f2=new File("D:\\1\\bbb");
        System.out.println(f2.mkdir());

        //3.mkdirs        创建多级文件夹
        //细节:既可以创建多级,也可以创建单级
        File f3=new File("D:\\1\\ccc\\ddd\\eee");
        File f4=new File("D:\\1\\eee");
        System.out.println(f3.mkdirs());
        System.out.println(f4.mkdirs());

        //4.delete       删除文件,直接永久删除,不经过回收站
        //如果删除的是有内容的文件夹,则删除失败
        File f5=new File("D:\\1\\ccc");
        System.out.println(f1.delete());
        System.out.println(f2.delete());
        System.out.println(f3.delete());
        System.out.println(f4.delete());
        System.out.println(f5.delete());
    }
}

File中常见的方法大致就这些了。

​ 因为File类只能对文件本身进行操作,不能读写文件里面存储的数据,因此,要想对本地,网络文件中的数据进行读写,只能够通过IO流来解决

IO流的分类

​ IO流有两种分类方式,一种是按照流向来分,一种是按照操作文件的类型来分。

​ 按照流向,可以将IO流分为输入流和输出流

​ 按照操作文件的类型可以分为字节流(可以操作所有类型的文件)和字符流(只能操作纯文本文件)

在这里插入图片描述

接下来我们将来一次学习IO流中的各个组成部分。

二.字节流

一.字节输出流

​ FileOutStream:操作本地文件的字节输出流,可以把程序中的数据写到本地文件中。

​ 其书写的步骤分为三步:1.创建数字输出流对象 2.写数据 3.释放空间 。举个例子

public class FileOutputStream测试 {
    public static void main(String[] args) throws IOException {
        //创建对象(参数是字符串表示的路径或者是File对象都是可以的;如果文件不存在会创建一个新的文件,弹药保证腹肌路径是存在的;若文件已经存在,则会覆盖原来的文件)
        FileOutputStream f=new FileOutputStream("D:\\JAVAproject\\untitled\\a.txt");
//        byte[] bytes={97,98,99,100,101};
//        f.write(bytes);
//        f.close();

        byte[] bytes={97,98,99,100,101};
        
        //从0索引开始,写3个字节到文件中
        f.write(bytes,0,3);
        f.close();
    }
}

二.字节输入流

​ FileInput:操作本地文件的字节输入流,可以把本地文件中的数据读到程序中来

​ 其书写的步骤分为三步:1.创建数字输出流对象 2.写数据 3.释放空间。举个例子:

public class FileInputStream测试 {
    public static void main(String[] args) throws IOException {
        //创建对象(如果文件不存在,就直接报错)
        FileInputStream f=new FileInputStream("D:\\JAVAproject\\untitled\\src\\a.txt");
        //read的底层原理就是迭代器,读到文件末尾的时候,方法返回-1
        while(f.read()!=-1){
            System.out.println((char)f.read());
        }
        //释放资源
        f.close();
    }
}

三.字符流

一.字符集详解

​ 在计算机中,任意数据都是以二进制的形式来存储的,计算机中最小的存储单元是一个字节(8个比特位)。在ASCII字符集中,一个英文占一个字节。而在简体中文版Windows系统中,默认使用的是GBK字符集。GBK字符集完全兼容ASCII字符集,并且一个英文占一个字节,二进制第一位是0;一个中文占两个字节,二进制高位字节的第一位是1。

​ 但鉴于全球有多种文字,为了统一标准,由美国牵头,创建了Unicode(万国码)。我们需要知道的是Unicode字符集的UTF-8编码格式:

​ 一个英文占一个字节,二进制第一位是0,转成十进制 是正数;

​ 一个中文占三个字节,二进制第一位是1,第一个字节 转成十进制是负数

在这里插入图片描述

​ 对于乱码出现的原因,我们可以总结为两点:1.读取数据时未读完整个汉字 2.编码和解码的方式不一样

二.字符输入流

字符输入流(Character Input Stream)是一种用于读取字符数据的输入流。它是Java中java.io.Reader类的子类,用于处理以字符为单位的数据。

使用字符输入流,你可以逐个字符地读取文本文件中的内容,并将其转换为相应的字符数据。它提供了各种读取字符的方法,包括按字符、按行等方式读取。

以下是使用字符输入流的基本步骤:

  1. 创建字符输入流对象:通过创建Reader的子类对象来建立字符输入流,可以使用FileReader类来读取文件中的字符数据。

    Reader reader = new FileReader("filename.txt");
    
  2. 读取字符数据:通过调用字符输入流对象的读取方法来读取字符数据。常用的方法包括:

    • read():读取单个字符,并返回其对应的Unicode编码值。如果到达文件末尾,则返回-1。
    • read(char[] cbuf):读取一定数量的字符,并存储到提供的字符数组中。返回实际读取的字符数,如果到达文件末尾,则返回-1。
    • read(char[] cbuf, int off, int len):从指定的偏移位置开始读取一定数量的字符,并存储到提供的字符数组中。返回实际读取的字符数,如果到达文件末尾,则返回-1。

    例如,使用read()方法按字符读取文件中的内容:

    int data;
    while ((data = reader.read()) != -1) {
        char c = (char) data;
        // 处理读取到的字符
    }
    
  3. 关闭字符输入流:在使用完字符输入流后,应关闭它以释放系统资源。

    reader.close();
    

需要注意的是,字符输入流使用的是默认字符集编码(如UTF-8),要指定特定的字符集编码,可以使用InputStreamReader类来创建字符输入流对象。

以上就是使用字符输入流的基本操作,它可以帮助你读取并处理文本文件中的字符数据。

三.字符输出流

字符输出流(Character Output Stream)用于将字符数据写入到输出目标,通常是文本文件或字符数组。它是Java中java.io.Writer类的子类,用于处理以字符为单位的输出操作。

使用字符输出流,你可以逐个字符或按字符数组的方式将字符数据写入到目标中。它提供了各种写入字符的方法,包括按字符、按字符串等方式写入。

以下是使用字符输出流的基本步骤:

  1. 创建字符输出流对象:通过创建Writer的子类对象来建立字符输出流,可以使用FileWriter类来写入字符数据到文件中。

    Writer writer = new FileWriter("filename.txt");
    
  2. 写入字符数据:通过调用字符输出流对象的写入方法来写入字符数据。常用的方法包括:

    • write(int c):将指定的字符写入输出流。
    • write(char[] cbuf):将字符数组中的全部字符写入输出流。
    • write(char[] cbuf, int off, int len):将字符数组中指定范围内的字符写入输出流。
    • write(String str):将字符串中的全部字符写入输出流。
    • write(String str, int off, int len):将字符串中指定范围内的字符写入输出流。
    • flush():将缓冲区内的字符立即写入到目标中。

    例如,使用write()方法按字符写入数据到文件中:

    writer.write('A');
    writer.write("Hello, World!");
    
  3. 关闭字符输出流:在使用完字符输出流后,应关闭它以释放系统资源,并确保数据被完全写入目标。

    writer.close();
    

需要注意的是,字符输出流使用的是默认字符集编码(如UTF-8),要指定特定的字符集编码,可以使用OutputStreamWriter类来创建字符输出流对象。

以上就是使用字符输出流的基本操作,它可以帮助你将字符数据写入到输出目标中。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值