重生之我要精通JAVA--第六周笔记

File

路径

相对路径

路径1:“a.txt”
路径2:“abc\\a.txt”

绝对路径

路径1:“c:\\a.txt”
路径2:“c:\\abc\\a.txt”

  • File对象就表示一个路径,可以是文件的路径、也可以是文件夹的路径
  • 这个路径可以是存在的,也允许是不存在的
方法名称说明
public File(String pathname)根据文件路径创建文件对象
public File(String parent, String child)根据父路径名字符串和子路径名字符串创建文件对象
public File(File parent, String child)根据父路径名对应文件对象和子路径名字符串创建文件对象

常见成员方法

判断、获取

方法名称说明
public boolean isDirectory()判断此路径名表示的File是否为文件夹
public boolean isFile()判断此路径名表示的File是否为文件
public boolean exists()判断此路径名表示的File是否存在
public long length()返回文件的大小(字节数量)
public String getAbsolutePath()返回文件的绝对路径
public String getPath()返回定义文件时使用的路径
public String getName()返回文件的名称,带后缀
public long lastModified()返回文件的最后修改时间(时间毫秒值)

创建、删除

方法名称说明
public boolean createNewFile()创建一个新的空的文件
public boolean mkdir()创建单级文件夹
public boolean mkdirs()创建多级文件夹
public boolean delete()删除文件、空文件夹
  1. createNewFile 创建一个新的空的文件

    • 细节1:如果当前路径表示的文件是不存在的,则创建成功,方法返回true

      如果当前路径表示的文件是存在的,则创建失败,方法返回false

    • 细节2:如果父级路径是不存在的,那么方法会有异常IOException

    • 细节3:createNewFile方法创建的一定是文件,如果路径中不包含后缀名,则创建一个没有后缀的文件

  2. mkdir make Directory,文件夹(目录)

    • 细节1:windows当中路径是唯一的,如果当前路径已经存在,则创建失败,返回false
    • 细节2:mkdir方法只能创建单级文件夹,无法创建多级文件夹
  3. mkdirs 创建多级文件夹

    细节:既可以创建单级的,又可以创建多级的文件夹

  4. delete

    • 如果删除的是文件,则直接删除,不走回收站
    • 如果删除的是空文件夹,则直接删除,不走回收站
    • 如果删除的是有内容的文件夹,则删除失败

获取并遍历

方法名称说明
public File[] listFiles()获取当前该路径下所有内容
  • 当调用者File表示的路径不存在时,返回null
  • 当调用者File表示的路径是文件时,返回null
  • 当调用者File表示的路径是一个空文件夹时,返回一个长度为0的数组
  • 当调用者File表示的路径是一个有内容的文件夹时,将里面所有文件和文件夹的路径放在File数组中返回
  • 当调用者File表示的路径是一个有隐藏文件的文件夹时,将里面所有文件和文件夹的路径放在File数组中返回,包含隐藏文件
  • 当调用者File表示的路径是需要权限才能访问的文件夹时,返回null
方法名称说明
public static File[] listRoots()列出可用的文件系统根
public String[] list()获取当前该路径下所有内容
public String[] list(FilenameFilter filter)利用文件名过滤器获取当前该路径下所有内容
public File[] listFiles()获取当前该路径下所有内容
public File[] listFiles(FileFilter filter)利用文件名过滤器获取当前该路径下所有内容
public File[] listFiles(FilenameFilter filter)利用文件名过滤器获取当前该路径下所有内容

IO流

分类

image-20240521171323931

纯文本文件:Windows自带的记事本打开能读懂

FileOutputStream

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

一、构造方法

构造方法描述
FileOutputStream(String name)使用指定的文件名创建一个 FileOutputStream 对象。如果文件不存在,会创建一个新文件。
FileOutputStream(String name, boolean append)使用指定的文件名和 append 标志创建 FileOutputStream 对象。如果 appendtrue,字节将被写入文件末尾。
FileOutputStream(File file)使用指定的 File 对象创建 FileOutputStream 对象。如果文件不存在,会创建一个新文件。
FileOutputStream(File file, boolean append)使用指定的 File 对象和 append 标志创建 FileOutputStream 对象。如果 appendtrue,字节将被写入文件末尾。
FileOutputStream(FileDescriptor fdObj)创建一个文件输出流以写入指定的文件描述符。

二、书写步骤

  1. 创建字节输出流对象
  2. 写数据
  3. 释放资源

细节

  1. 创建字节输出流对象
    细节1:参数是字符串表示的路径或者是File对象都是可以的
    细节2:如果文件不存在会创建一个新的文件,但是要保证父级路径是存在的。
    细节3:如果文件已经存在,则会清空文件
  2. 写数据
    细节:write方法的参数是整数,但是实际上写到本地文件中的是整数在ASCII上对应的字符
  3. 释放资源
    细节:每次使用完流之后都要释放资源
import java.io.FileOutputStream;
import java.io.IOException;

public class Test {
    public static void main(String[] args) throws IOException {
        FileOutputStream fos = new FileOutputStream("..\\5.20\\a.txt");
        fos.write(97);
        fos.close();
    }
}

三、write用法

方法名称说明
void write(int b)一次写一个字节数据
void write(byte[] b)一次写一个字节数组数据
void write(byte[] b, int off, int len)一次写一个字节数组的部分数据
public class Test {
    public static void main(String[] args) throws IOException {
        FileOutputStream fos = new FileOutputStream("..\\5.20\\a.txt");
        String str = "abcd";
        byte[] bytes = str.getBytes();
        fos.write(bytes);
        fos.close();
    }
}

void write(byte[] b, int off, int len)

off:起始索引:字节数组b中的起始偏移量。表示从数组的哪个索引位置开始写入数据。(off必须是非负整数,且不能超过数组b的长度。)

len:写入字节数:这是要写入的字节数。从off位置开始,连续写入len个字节。

四、换行与续写

1.换行
写出一个换行符即可
windows:\r\n
Linux:\n
Mac:\r

在windows操作系统当中,java对回车换行进行了优化。
虽然完整的是\r\n,但是我们写其中一个\r或者\n,
java也可以实现换行,因为java在底层会补全。

2.续写

FileOutputStream(String name, boolean append)

FileOutputStream(File file, boolean append)

如果 appendtrue,字节将被写入文件末尾。

    FileOutputStream fos = new FileOutputStream("..\\5.20\\a.txt",true);

FileInputStream

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

一、构造方法

构造方法参数描述
FileInputStream(File file)要读取的文件对象。
FileInputStream(String name)要读取的文件的路径名。
FileInputStream(FileDescriptor fd)文件描述符对象,表示已打开的文件。

二、书写步骤

  1. 创建字节输入流对象
  2. 读数据
  3. 释放资源

细节

    • 如果文件不存在,就直接报错。
    • 一次读一个字节,读出来的是数据在ASCII上对应的数字
    • 读到文件末尾了,read方法返回-1。
  1. 每次使用完流必须要释放资源。

三、循环读取

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

public class Demo {
    public static void main(String[] args) throws IOException {
        FileInputStream fis = new FileInputStream("..\\5.20\\a.txt");
        int b;
        while ((b = fis.read()) != -1) {
            System.out.print((char) b);
        }
        fis.close();
    }
}

四、read

方法名称说明
public int read()一次读一个字节数据
public int read(byte[] buffer)一次读一个字节数组数据

image-20240521200038868

字符集

ASCII

存储英文,一个字节就足以

计算机的存储规则

  1. GB2312字符集:1980年发布,1981年5月1日实施的简体中文汉字编码国家标准。
    收录7445个图形字符,其中包括6763个简体汉字
  2. BIG5字符集:台湾地区繁体中文标准字符集,共收录13053个中文字,1984年实施。
  3. GBK字符集:2000年3月17日发布,收录21003个汉字
    包含国家标准GB13000-1中的全部中日韩汉字,和BIG5编码中的所有汉字。
  4. Unicode字符集:
    国际标准字符集,它将世界各种语言的每个字符定义一个唯一的编码,以满足跨语言、跨平台的文本信息转换。

系统显示:ANSI

windows系统默认使用的就是GBK。

image-20240521205532934

为什么会有乱码

  1. 读取数据时未读完整个汉字
  2. 编码和解码时的方式不统一

编码和解码

Java中编码的方法

String类中的方法说明
public byte[] getBytes()使用默认方式进行编码
public byte[] getBytes(String charsetName)使用指定方式进行编码

Java中解码的方法

String类中的方法说明
String(byte[] bytes)使用默认方式进行解码
String(byte[] bytes, String charsetName)使用指定方式进行解码

UTF

UTF-8、UTF-16 和 UTF-32 是三种不同的字符编码方案,它们在存储字符时使用不同的字节长度:

  1. UTF-8: UTF-8 是一种变长编码方案,字符的存储长度可以是 1 到 4 个字节。在 UTF-8 中,常用的 ASCII 字符(0 到 127)使用单个字节存储,而其他字符则使用多个字节。通常情况下,UTF-8 编码的字节数如下:
    • 1 字节:ASCII 字符
    • 2 字节:大多数欧洲语言的常用字符
    • 3 字节:较少使用的非常见字符
    • 4 字节:较少见的字符和符号
  2. UTF-16: UTF-16 使用固定长度的 2 个字节来存储大多数常见字符,但一些辅助字符需要使用额外的 2 个字节(总共 4 个字节)进行编码。这意味着大多数字符都占用 2 个字节,但一些罕见字符占用 4 个字节。
  3. UTF-32: UTF-32 使用固定长度的 4 个字节来表示每个字符,无论字符的编码大小。

字符流

字符流的底层其实就是字节流

字符流 = 字节流 + 字符集

特点

  • 输入流:一次读一个字节,遇到中文时,一次读多个字节
  • 输出流:底层会把数据按照指定的编码方式进行编码,变成字节再写到文件中

image-20240521211433164

FileReader

  1. 创建字符输入流对象

    构造方法说明
    public FileReader(File file)创建字符输入流关联本地文件
    public FileReader(String pathname)创建字符输入流关联本地文件

    细节1:如果文件不存在,就直接报错

  2. 读取数据

    成员方法说明
    public int read()读取数据,读到末尾返回-1
    public int read(char[] buffer)读取多个数据,读到末尾返回-1

    细节1:按字节进行读取,遇到中文,一次读多个字节,读取后解码,返回一个整数
    细节2:读到文件末尾了,read方法返回-1

  3. 释放资源

    成员方法说明
    public int close()释放资源/关闭流
构造方法说明
public FileWriter(File file)创建字符输出流关联本地文件
public FileWriter(String pathname)创建字符输出流关联本地文件
public FileWriter(File file, boolean append)创建字符输出流关联本地文件,续写
public FileWriter(String pathname, boolean append)创建字符输出流关联本地文件,续写
成员方法
成员方法说明
void write(int c)写出一个字符
void write(String str)写出一个字符串
void write(String str, int off, int len)写出一个字符串的一部分
void write(char[] cbuf)写出一个字符数组
void write(char[] cbuf, int off, int len)写出字符数组的一部分
  • 创建字符输出流对象
    细节1:参数是字符串表示的路径或者File对象都是可以的
    细节2:如果文件不存在会创建一个新的文件,但是要保证父级路径是存在的
    细节3:如果文件已经存在,则会清空文件,如果不想清空可以打开续写开关
  • 写数据
    细节:如果write方法的参数是整数,但是实际上写到本地文件中的是整数在字符集上对应的字符
  • 释放资源
    细节:每次使用完流之后都要释放资源

字符流原理解析

  1. 创建字符输入流对象
    底层::联文件,并创建缓冲区(长度为8192的字节数)
  2. 读取数据

底层

  1. 判断缓冲区中是否有数据可以读取
  2. 缓冲区没有数据:就从文件中获取数据,装到缓冲区中,每次尽可能装满缓冲区
    如果文件中也没有数据了,返回-1
  3. 缓冲区有数据:就从缓冲区中读取
    空参的read方法:一次读取一个字节,遇到中文一次读多个字节,把字节解码并转成十进制返回
    有参的read方法:把读取字节,解码,强转三步合并了,强转之后的字符放到数组中

已经到底啦!!

  • 30
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值