Java基础知识---IO流

本文详细介绍了Java中File类的使用,包括构造方法、创建、删除、重命名、判断、获取等功能。同时,深入讲解了IO流的概念、分类,如字节流、字符流,并通过实例演示了FileOutputStream、FileInputStream、BufferedOutputStream等流的使用,以及转换流和字符缓冲流在文件复制中的应用。文章最后还涵盖了集合与文件、目录的交互以及文件的批量操作技巧。

13.1 File类的概述和构造方法

文件和目录路径名的抽象表示形式

构造方法:

public File(String pathname);根据一个路径得到File对象 
public File(String parent,String child);根据一个目录和子文件/子目录得到一 个File对象 
public File(File parent,String child);根据一个父File对象和一个子文件/目录 得到File对象

注意:如果创建文件或目录没有盘符,则默认当前项目路径。(例 info.txt)

13.2 File类的创建功能

public boolean createNewFile():创建文件如果存在则不创建(前提目录必须 存在)
public boolean mkdir():创建文件夹如果存在则不创建 
public boolean mkdirs():创建多级目录(文件名也叫目录名)

13.3 File类的删除功能

public boolean delete():删除不走回收站 (目录中有内容则不删除)

13.4 File类的重命名功能

public boolean renameTo(File dest):如果源文件和重名的文件 在不同目录下,剪切;在同一目录下,重命名。

13.5 File类的判断功能

public boolean isDirectory():是否是目录 
public boolean isFile():是否是文件 
public boolean exists():是否存在 
public boolean canRead():是否可读 
public boolean canWrite():是否可写 
public boolean isHidden():是否隐藏

13.6 File类的获取功能

public String getAbsolutePath():获取绝对路径 
public String getPath():获取相对路径 
public String getName():获取名称 
public long length():获取长度,字节数 
public long lastModified():获取最后一次修改时间 (以毫秒为单位)

13.7 File类的高级获取功能

public String[] list():获取指定目录下的所有文件或文件夹的名称字符串数组 
public File[] listFiles():获取指定目录下的所有文件或者文件夹的File数组

13.8 输出指定目录下指定后缀名的文件名称案例

第一步:封装指定的目录 
第二步:获取该目录下所有文件或者文件夹的File数组 
第三步:遍历File数组,得到每一个File对象,然后判断 
第四步:如果是文件,则判断是否以xxx结尾;否则不管

13.9 文件过滤器改进输出指定目录下指定后缀名的文件名称案例

第一步:先获取所有的,然后遍历的时候,依次判断,如果满足条件就输出 
第二步:获取的时候就已经满足条件了,然后输出即可
	public String[] list(FilenameFilter filter):创建接口对象,重写accept方法, 添加需求 
	public File[] listFiles(FileFilter filter):创建接口对象,重写accept方法,添加需求

13.10 批量修改文件名称

第一步:封装目录 
第二步:获取该目录下所有的文件的File数组 
第三步:遍历该File数组,得到每一个File对象 
第四步:拼接一个新的名称,然后重命名

13.11 递归输出指定目录下所有的java文件的绝对路径

第一步:封装目录 
第二步:获取目录下所有的文件或者文件夹的File数组 
第三步:遍历该File数组,得到每一个File对象 
第四步:判断该File对象是否是文件夹 是,回到第一步; 否,继续判断是否以.java结尾?是,输出  否,不管

13.12 递归删除带内容的目录

第一步:封装目录 
第二步:获取目录下的所有文件或者文件夹的File数组 
第三步:遍历该FIle数组,得到每一个FIle独享 
第四步:判断该File对象是否是文件夹 是,回到第一步  否,删除 
第五步:最终删除文件夹

13.13 IO流概述及分类

按照数据流向:

输入流:读入数据 
输出流:写出数据

注意:流向的划分主要依据内存 向内存内传数据叫输入 将数据从内存中传出叫输出

按照数据类型

字节流:二进制文件 
字符流:二进制+编码文件

使用哪种流的场合

如果数据所在的文件通过windows自带的记事本打开并能读懂里面的内容,使用字符流。其他使用字节流。
 如果你什么都不知道,就用字节流。

可以分为四大抽象基类:

字节输入流 InputStream 
字节输出流 OutputStream 
字符输入流 Reader 
字符输出流 Writer 

注意:每种基类的子类都以父类名作为后缀名

13.14 IO流基类概述和一个简单的需求分析

向文本文件中输入一句话:Hello,IO

第一步:文本文件最好用字符流来做,但是字符流是字节流之后出现的 
第二步:由于是从内存向文件中输出数据,所以是输出流 

13.15 FileOutputStream的构造方法

FileOutputStream(File file):关联一个File对象的字节输出流 
FileOutputStream(String name):关联一个文件名所对应的File对象的字节输出流

注意:可能找不到文件对象!(要有对异常的处理–声明/捕获)

13.16 FileOutputStream写出数据

创建字节输出流对象做了几件事情:

第一步:调用系统功能去创建文件 
第二步:创建fos对象 
第三步:把fos对象指向这个文件写出之后,关闭 close() 避免占用系统资源。 

字节输出流基本操作步骤:(逻辑步骤)

第一步:创建字节输出流对象 
第二步:写数据 
第三步:释放资源 

13.17 FileOutputStream的三个write()方法

public void write(byte[]):写入字节数组(如果是文本,需先转成字节) 
public void write(byte[] b.int off,int len):写一个字节数组的一部分 
public void write(int b):写入一个字节

13.18 FileOutputStream写出数据实现换行和追加写入

如何实现数据的换行:

写入换行符"\n",但是windows自带文本没显示 因为其换行符号"\r\n"。
 linux"\n",Max“\r”  ,一般高级记事本都可识别。 

如何实现追加写入:

由fos构造函数决定

13.19 FileInputStream读取数据

字节输入流基本操作步骤:

第一步:创建字节输入流徐爱那个 
第二步:调用read()方法读取数据 
第三步:释放资源
	int read():一次读取一个字节 -1则代表结束 
	int read(byte[]):一次读取一个字节数组

13.20 字节流复制文本文件案例1

数据源:
	从哪里来 a.txt   读取数据 一次一个字节  FileInputStream 
目的地:
	到哪里去 b.txt  写出数据  FileOutputStream 

13.21 字节流复制文本文件案例2

跨盘复制文本文件

数据源:
	从哪里来 一次一个字节 C:\\a.txt  读取数据  FileInputStream 
目的地:
	到哪里去 D:\\b.txt  写出数据  FileOutputStream 

13.22 字节流复制图片案例

数据源:
	从哪里来 一次一个字节 xxx.jpg  读取输入 FileInputStream 
目的地:到哪里去 xxx.jpg  写出数据  FileOutputStream 

13.23 字节流复制视频案例1

数据源:
	从哪里来  一次一个字节 xxx.avi   读取输入 FileInputStream 
目的地:
	到哪里去 xxx.avi   写出数据  FileOutputStream 1

3.24 FileInputStream读取数据一次一个字节数组

int read(byte[]):一次读取一个字节数组  读取到-1则读完

13.25 字节流复制文本文件案例3

数据源:		
	哪里来 一次一个字节数组 a.txt 读取数据  FileInputStream 
目的地:
	到哪里去 b.txt 写除数据  FileOutputStream 

13.26 字节流复制视频案例2

数据源:
	从哪里来 一次一个字节数组 a.txt 读取数据  FileInputStream 
目的地:
	到哪里去 b.txt 写除数据  FileOutputStream 

13.27 BufferedOutputStream写出数据

通过定义数组的方式确实比以前一次读取字节的方式快很多,所以,缓冲区是一个很好的选择。Java提供了带缓冲区的字节类

缓冲区类(高效类)

BufferedOutputStream 
BufferedInputStream

其构造方法可以指定缓冲区的大小,但是我们一般用不上,因为默认缓冲区大小就足够 了。

为什么必须传入OutputStream对象而不是pathname呢?

字节缓冲区仅仅提供缓冲区,为高效而设计,但是,真正的读写操作还得靠基本的流对象实现。 

13.28 字节流四种方式复制MP4并测试效率

字节流四种方式复制文件:

基本字节流一次读写一个字节 
基本字节流一次读写一个字节数组 
高效字节流一次读写一个字节 
高校字节流一次读取一个字节数组 

13.29 转换流出现的原因及格式

由于字节流操作特殊字符不是很方便,所以,java就提供了转换流 。

字符流=字节流+编码表

13.30 编码表概述和常见编码表

编码表:

由字符及其对应的数值组成的一张表。

常见编码表:
ASCII:美国标准信息交换码 1字节
Unicode:国际标准码,融合了多种文字 2字节 I
SO-8859-1:拉丁码表,欧洲码表 1字节
GB2313:中国的中文编码表 、
GBK:中国的中文编码表升级,融合了更多地中文文字符号
GB18030:GBK的取代版本 BIG5:通行于台湾、香港地区的一个繁体字编码方案
UTF-8:最多用3个字节表示一个字符

UTF-8,它定义了一种“区间规则”,这种规则可以和ASCII编码保持最大程度的兼 容。 
	它将Unicode编码为00000000-0000007F的字符,用单个字节表示 
	它将Unicode编码为00000080-000007FF的字符,用两个字节表示 
	它将Unicode编码为00000800-0000FFFF的字符,用三个字节表示 

13.31 String类中的编码和解码问题

编码:把看得懂的变成看不懂的
解码:把看不懂的编程看得懂的

String(byte[] bytes,String charsetName):通过指定的字符集编码解码字节数组
byte[] getBytes(String charSetName):使用指定的字符集合把字符串编码为 字节数组

13.32 转换流OutputStreamWriter的使用

把输出字节流转换为输出字符流

OutputStreamWriter(OutputStream out):根据默认编码把字节流的数据转 换为字符流。 		                   
OutputStreamWriter(OutputStream out,String charsetName):根据指定编 码把字节流数据转换为字符流。

13.33 转换流InputStreamReader的使用

把输入字节流转换为输入字符流

InputStreamReader(InputStream is):用默认的编码读取数据 
InputStreamReader(InputStream is,String charsetName):用指定的编码读 取数据

13.34 字符流的5种写数据的方式

OutputStreamWriter

public void write(int c):写一个字符 
public void write(char[] cbuf):写一个字符数组 
public void write(char[] cbuf,int off,int len):写一个字符数组的部分 
public void write(String str):写一个字符串
public void write(String str,int off,int len):写一个字符串的部分 
flush():将缓冲区的数据存入文件,但不关闭流

flush与close的区别:数据量大时最好刷新,单也可以直接close

13.35 字符流的2种读数据的方式

InputStreamReader

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

13.36 字符流复制文本文件案例1

把当前目录下的文件复制到当前另一个文件中

数据源:
	 a.txt 读取数据  字符转换流  InputStreamReader 
目的地: 
	b.txt 写出数据  字符转换流  OutputStreamWriter 

13.37 字符流复制文本文件案例2

转换流的名字比较长,而我们常见的操作都是按照本地默认编码实现的,所以,为了简化我们的书写,转换流提供了对应的子类

FileWriter 
FileReader

13.38 字符缓冲输出流BufferedWriter的使用
字符流为了高效读写,也提供了对应的字符缓冲流

BufferedWriter:字符缓冲输出流 
BufferedReader:字符缓冲输入流

将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
可以指定缓冲区的大小,或者接受默认的大小。在大多数情况下,默认值就足够大了。

13.39 字符缓冲流的特殊功能

readLine():根据系统来决定换行符 
newLine():一次读取一行数据

13.40 IO流小结图解

在这里插入图片描述
13.41 把集合中的数据存储到文本文件案例

ArrayList集合里存储的是字符串 
遍历ArrayList集合,读取数据 
将数据存储到文件文本中 
文本文件说明使用字符流

13.42 把文本文件中的数据存储到集合中案例

数据源是一个文本文件 
目的地是一个集合 
而且元素是字符串

13.43 随机获取文本文件中的姓名案例

把文本文件中的数据存储到集合中 
随机产生一个索引 
根据索引获取一个值

13.44 复制单级文件夹案例

第一步:封装目录 
第二步:获取该目录下的所有文本的File数组 
第三步:遍历该File数组,得到每一个File对象 
第四步:把File进行复制

13.45 复制指定目录下指定后缀名的文件并修改名称案例

第一步:封装目录 
第二步:获取该目录下的所有文本的File数组 
第三步:遍历该File数组,得到每一个File对象 
第四步:判断该对象是否符合后缀名 
第五步:把File进行复制并改名

13.46 复制多级文件夹案例

第一步:封装数据源File 
第二步:封装目的地File 
第三步:判读该File是文件还是文件夹 
  是文件夹: 就在目的地目录下创建该文件夹 
			获取FIle对象下的所有文件或文件夹File对象 
			遍历每一个FIle对象 
   	        回到第三步 
  是文件: 直接复制 

13.47 本章小结

1.1/0类可以分为文本I/O 和二进制 I/O。文本 I/O将数据解释成字符序列,二进制I /O流将数据解释成原始的二进制数值。文本在文件中如何存储依赖于文件的编码方式。Java自动完成对文本 I/O的编 码和解码。 

2.InputStream 类和OutputStream 类是所有二进制 I/O类的根类。FilelnputStream类和 FileOutputStream 类关联文件用于文件输入 /输出。BufferedInputStream 类和 BufferedOutputStream类可以包装任何一个二进制输入 /输出流以提高其性能。DatalnputStream类和 DataOutputStream类可以用来读写基本类型数据和字符串。 

3.ObjectlnputStream 类和ObjectOutputStream类除了可以读写基本类型数据值和字符串,还可以读写对象。为实现对象的可序列化,对象的定义类必须实现 java.io.Serializable 标记接口。

4.RandomAccessFile 类允许对文件读写数据。可以打开一个模式为"r"的文件,这个模式表示文件是只读的,也可以打开一个模式为"rw"的文件,这个模式表示文件是可更新的。由于 RandomAccessFile 类实现了 DataInput 和 DataOutput 接口,所以,RandomAccessFile 中的许多方法都与 DatalnputStream 和 DataOutputStream 中的方法一样。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值