File了解及使用

153 阅读11分钟

@TOC

欢迎打开这篇文章

你好! 这是你第一次了解 File 所展示的欢迎页。如果你想学习如何使用File, 可以仔细阅读这篇文章,了解一下基本语法知识。

1,File

File:是具体的类,继承了Object,实现了Seriallizable,Comparable两个接口

文件和路径名的抽象表示

文件和目录i都是可以通过File封装成对象的

对于File而言,其封装的并不是一个真正存在的文件,仅仅是一个路径而已,它可以是存在的,也可以是不存在的。将来是要通过具体操作把这个路径的内容转换为具体存在的。

在这里插入图片描述

File类创建功能在这里插入图片描述 1,如果文件不存在,就创建文件,返回true

​ 如果文件存在,就不创建文件,返回false

2,如果目录不存在,就创建目录,返回true

​ 如果文件目录,就不创建目录,返回false

file类删除功能 相对路径与绝对路径的区别

绝对路径:完整的路径名,不需要任何其他信息就可以定位它所表示的文件。例如:C:\\hhxy\java.txt

相对路径:必须使用取自其他路径名的信息进行解释。例如:myFile\java.txt

删除目录时的注意事项:

如果一个目录中有内容(目录,文件),不能直接删除。应该先删除目录中的内容,最后才能删除目录。

在这里插入图片描述


2,递归

递归概述:以编程的角度来看,递归指的是方法定义中调用方法本身的现象 递归解决问题的思路: 把一个复习的问题层层转化为一个与原问题相似的规模较小的问题来求解

递归策略只需少量的程序就可以描述出解题过程所需要的多次重复计算

递归解决问题找到两个内容:

递归出口:否则会出现内存溢出

递归规则:与原问题相似的规模较小的问题


3,字节流

3.1 IO流概述和分类

io流概述:

IO:输入输出(input/output)
流:是一种抽象概念,是对数据传输的总称,也就是说数据在设备间的传输称为流,流的本质是数据传输
IO流就是用来处理设备间数据传输问题的
常见的应用:文件复制;文件上传;文件下载。

在这里插入图片描述 Io流分类:

按照数据的流向 输入流:读数据 输出流:写数据 按照数据类型来分 字节流 字节输入流;字节输出流 字符流 字符输入流;字符输出流 一般来说,我们说IO流的分类是按照数据类型来分的

两种在什么情况下使用呢

读的懂得内容我们用字符流

读不懂的乱码字节流 如果数据通过window自带的记事本软件打开,我们还可以读懂里面的内容,就使用字符流,否则使用字节流,如果你不知道该使用哪种类型的流,就使用字节流

3.2 字节流写数据

字节流抽象基类

InputStream:这个抽象类是表示字节输入流的所有类的超类
OutputStream:这个抽象类是表示字节输出流的所有类的超类
子类名特点:子类名称都是以父类名作为子类名的后缀
FileOutputStream:文件输出流用于将数据写入File
FileOutputStream(String name):创建文件输出流以指定的名称写入文件
使用字节输出流写数据的步骤
创建字节输出流对象(调用系统功能创建了文件,创建字节输出流对象,让字节输出流对象指向文件)
调用字节输出流对象的写数据方法
释放资源(关闭此文件输出流并释放与此流相关联的任何系统资源)

3.3 字节流写数据的3种方式

在这里插入图片描述

3.4 字节流写数据的两个小问题

字节流写数据如何实现换行呢?

写完数据后,加换行符

windows:\r\n

linux:\n

mac:\r

字节流写数据如何实现追加写入呢?

<ul>
    <li>public FileOutputStream(String name,boolean append)</li>
    <li>创建文件输出流以指定的名称写入文件,如果第二个参数为true,则字节将写入文件的末尾而不是开头</li>
</ul>

3.5 字节流写数据加异常处理

finally:在异常处理时提供finally块来执行所有清除操作,比如说IO流中的释放资源

3.6 字节流读数据(一次读一个数据)

FileInputStream:从文件系统中的文件获取输入字节

FileInputStream(String name):通过打开与实际文件的连接来创建一个FileInputStream,该文件由文件系统中的路径名name命名

使用字节输入流读数据的步骤:

<ul>
    <li>创建字节输入流对象</li>
    <li>调用字节输入流对象的读数据方法</li>
    <li>释放资源</li>
</ul>

4,字节缓冲流

字节缓冲流

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

BufferOutputStream:该类实现缓冲输出流,通过设置这样的输出流,应用程序可以像底层输出流写入字节,而不必为写入的每个字节导致底层系统的调用

构造方法

字节缓存输出流:BufferedOutStream(OutputStream out)

字节缓存输入流:BufferedInputStream(InputStream in)

为什么构造方法需要的是字节流,而不是文件或者路径呢

字节缓冲流仅仅提供缓冲区,而真正读写数据还得依靠基本的字节流对象进行操作


5,字符流

由于字节流操作中文不是特别方便,所以Java就提供字符流

字符流=字节流+编码表

用字节流复制文本文件时,文本文件也会有中文,但是没问题,原因是最终底层操作会自动进行拼接成中文,如何识别是中文呢?

汉字在存储的时候,无论选择那种编码存储,第一个字节都是负数。


6,编码表

基础知识:

<ul>
    <li>计算机中储存的信息都是用二进制数表示的,我们屏幕上看到的英文、汉字等符号是二进制数转换之后的结果</li>
    <li>按照某种规则,将字符存储到计算机中,称为编码。反之,将存储在计算机中的二进制数按照某种规则解析显示出来,称为编码。这里强调一下:按照A编码存储,必须按照A编码解析,这样才能显示正确的文本符号。否则就会出现乱码现象</li>
</ul>

字符编码:就是一套自然语言的字符与二进制数之间的对应规则(A-65)

字符集:

<ul>
    <li>是一个系统支持的所有字符的集合,包括各国家文字、标点符号、图形符号、数字等</li>
    <li>计算机要准确的存储和识别各种字符集符号,就需要进行字符编码,一套字符集必然至少有一套字符编码。</li><br/>
    常见字符集有ASCII字符集,GBXXX字符集,Unicode字符集等
</ul>

编码表

ASCII字符集 ASCII((American Standard Code for Information Interchange,美国信息交换标准代码):基于拉丁字母的一套电脑编码系统,用于显示现代英语,主要包括控制字符(回车键、退格、换行键等)和可显示字符(英文大小写字符、阿拉伯数字和西文符号)

基本的ASCII字符集,使用7位表示一个字符,共128字符。ASCII的扩展字符集使用8位表示一个字符,共256字符,方便支持欧洲常用字符。是一个系统支持的所有字符的集合,包括各国家文字、标点符号、图形符号、数字等

GBXXX字符集: GB2312:简称中文码表。一个小于127的字符的意义与原来相同,但两个大于127的字符连在一起时,就表示一个汉字,这样大约可以组合了包含7000多个简体汉字,此外数字符号、罗马希腊的字母、日文的假名等都编进去了,连在ASCII里本来就有的数字、标点、字母都统统重新编了两个字节长的编码,这就是常说的"全角"字符,而原来在127号一下的那些就叫"半角"字符了

GBK:最常用的中文码表,是在GB2312标准基础上的扩展规范,使用了双字节编码方案,共收录了21003个汉字,完全兼容GB2312标准,同时支持繁体汉字以及日韩汉字等

GB18030:最新的中文码表。收录汉字70244个,采用多字节编码,每个字都可以由1个、2个或者4个字节组成。支持中国国内少数民族的文字,同时支持繁体汉字以及日韩汉字等

Unicode字符集:

为表达任意语言的任意字符而设计,是业界的一种标准,也称为统一码、标准万国码,它最多使用4个字节的数字来表示每个字母、符号,或者文字。UTF-8、UTF-16和UTF-32.最为常用的UTF-8编码

UTF-8编码:可以用来表示Unicode标准中任意字符,它是电子邮件、网页及其他存储或传送文字的应用中,优先采用的的编码。互联网工程工作小组(IETF)要求所有互联网协议都必须支持UTF-8编码,它使用一至四个字节为每个字符编码

编码规则:

​ 128个US-ASCII字符,只需一个字节编码

​ 拉丁文等字符,需要二个字节编码

​ 大部分常用字(含中文),使用三个字符编码

​ 其他极少使用的Unicode辅助字符,使用四字节编码

小结:采用何种规则编码,就要采用对应规则解码,否则就会出现乱码

字符串中的编码解码问题 编码:

<ul>
    <li>byte[] getBytes():使用平台的默认字符集将该String编码为一系列字节,将结果存储到新的字节数组中</li>
    <li>byte[] getBytes(String charsetName):使用指定的字符集将该String编码为一系列字节,将结果存储到新的字节数组中</li>
</ul>

解析:

<ul>
    <li>String(byte[] bytes):通常使用平台的默认字符集解码指定的字节数组来构造新的String</li>
    <li>String(byte[] bytes,String charsetName):通过指定的字符集解码指定的字节数组来构造新的String</li>
</ul>

字符流中的编码解码问题


7,字符流抽象基类

<ul>
    <li>Reader:字符输入流的抽象类</li>
    <li>Writer:字符输出流的抽象类</li>
</ul>

字符流中和编码解码问题相关的两个类

<ul>
    <li>InputStreamReader:是从字节流到字符流的桥梁</li>
    <li>OutputStreamWriter:是从字符流到字节流的桥梁</li>
</ul>

在这里插入图片描述

字符流写数据的5种方法

在这里插入图片描述

字符流读取数据的2中方式

int read() 一次读取一个字符数据

int read(char[] cbuf) 一次读取一个字符组数据

8,字符缓冲流

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


9,特殊操作流

标准输入输出流 public static final InputStream in:标准输入流。通常该流对应于键盘输入或由主机环境或用户指定的另一个输入源

public static final PrintStream out:标准输出流。通常该流对应于显示输出或由用户指定的另一输出目标

自己实现键盘录入数据:
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

写起来太麻烦,Java就提供了一个类实现键盘输入
Scanner sc = new Scanner(System.in);

标准输入输出流

在这里插入图片描述

打印流

打印流分类:

字节打印流:PrintStream

字符打印流:PrintWriter

打印流的特点:

只负责输出数据,不负责读取数据

有字节的特有方法

字节打印流

PrintStream(String fileName):使用指定的文件名创建新的打印流

在这里插入图片描述

在这里插入图片描述

10,IO流小结

在这里插入图片描述

小结:字节流可以复制任意文件数据,有4种方式-般采用字节缓冲流- -次读写- 个字节数组的方式

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

11,案例

在这里插入图片描述

image-20220308215659984

在这里插入图片描述