IO流总结

IO 流总结

生活中,你肯定经历过这样的场景。当你编辑一个文本文件,忘记了 ctrl+s ,可能文件就白白编辑了。当你电脑 上插入一个 U 盘,可以把一个视频,拷贝到你的电脑硬盘里。那么数据都是在哪些设备上的呢?键盘、内存、硬 盘、外接设备等等。

我们把这种数据的传输,可以看做是一种数据的流动,按照流动的方向,以内存为基准,分为 输入 input 和 输出 output ,即流向内存是输入流,流出内存的输出流。

Java I/O 操作主要是指使用 java.io 包下的内容,进行输入、输出操作。输入也叫做读取数据,输出也叫做作写 出数据。

一.java.io.File 类是文件和目录路径名的抽象表示,主要用于文件和目录的创建、查找和删除等操作。

1. File 类说明

v 存储在变量 , 数组和对象中的数据是暂时的 , 当程序终止时他们就会丢失 . 为了能够永久的保存程序中创建的数据 , 需要将他们存储到硬盘或光盘的文件中 . 这些文件可以移动 , 传送 , 亦可以被其他程序使用 . 由于数据存储在文件中 , 所以我们需要学习一个和文件有密切关系的类 , 叫做 File , 将要掌握获取文件的属性以及删除和重命名文件 . 最终如何向文件中写入数据和从文件中读取数据 .

v File 类关心的是在磁盘上文件的存储 .

v File 类描述的是一个文件或文件夹。(文件夹也可以称为目录)

v 该类的出现是对文件系统的中的文件以及文件夹进行对象的封装。可以通过对象的思想来操作文件以及文件夹。

v 可以用面向对象的处理问题,通过该对象的方法,可以得到文件或文件夹的信息方便了对文件与文件夹的属性信息进行操作。

v 文件包含很多的信息 : 如文件名、创建修改时间、大小、可读可写属性等。

2 . File 类中常用的方法:

创建:

l createNewFile() 在指定位置创建一个空文件,成功就返回 true ,如果已存在就不创建然后返回 false

l mkdir() 在指定位置创建目录,这只会创建最后一级目录,如果上级目录不存在就抛异常。

l mkdirs() 在指定位置创建目录,这会创建路径中所有不存在的目录。

l renameTo(File dest) 重命名文件或文件夹,也可以操作非空的文件夹,文件不同时相当于文件的剪切 , 剪切时候不能操作非空的文件夹。移动 / 重命名成功则返回 true ,失败则返回 false

删除:

l delete() 删除文件或一个空文件夹,如果是文件夹且不为空,则不能删除,成功返回 true ,失败返回 false

l deleteOnExit() 在虚拟机终止时,请求删除此抽象路径名表示的文件或目录,保证程序异常时创建的临时文件也可以被删除

判断

l exists() 文件或文件夹是否存在。

l isFile() 是否是一个文件,如果不存在,则始终为 false

l isDirectory() 是否是一个目录,如果不存在,则始终为 false

l isHidden() 是否是一个隐藏的文件或是否是隐藏的目录。

l isAbsolute() 测试此抽象路径名是否为绝对路径名。

获取

l getName() 获取文件或文件夹的名称,不包含上级路径。

l getPath() 返回绝对路径,可以是相对路径,但是目录要指定

l getAbsolutePath() 获取文件的绝对路径,与文件是否存在没关系

l length() 获取文件的大小(字节数),如果文件不存在则返回 0L ,如果是文件夹也返回 0L

l getParent() 返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null

l lastModified() 获取最后一次被修改的时间。

文件夹相关:

l staic File[] listRoots() 列出所有的根目录( Window 中就是所有系统的盘符)

l list() 返回目录下的文件或者目录名,包含隐藏文件。对于文件这样操作会返回 null

l list(FilenameFilter filter) 返回指定当前目录中符合过滤条件的子文件或子目录。对于文件这样操作会返回 null

l listFiles() 返回目录下的文件或者目录对象( File 类实例),包含隐藏文件。对于文件这样操作会返回 null

l listFiles(FilenameFilter filter) 返回指定当前目录中符合过滤条件的子文件或子目录。对于文件这样操作会返回 null

二.递归

递归的思想

以此类推是递归的基本思想。

具体来讲就是把规模大的问题转化为规模小的相似的子问题来解决。在函数实现时,因为解决大问题的方法和解决小问题的方法往往是同一个方法,所以就产生了函数调用它自身的情况。另外这个解决问题的函数必须有明显的结束条件,这样就不会产生无限递归的情况了。

递归的两个条件

1. 可以通过递归调用来缩小问题规模,且新问题与原问题有着相同的形式。(自身调用)

2. 存在一种简单情境,可以使递归在简单情境下退出。(递归出口)

递归三要素:

1. 一定有一种可以退出程序的情况;

2. 总是在尝试将一个问题化简到更小的规模

3. 父问题与子问题不能有重叠的部分

小贴士:递归一定要有条件限定,保证递归能够停止下来,次数不要太多,否则会发生栈内存溢出。

三.IO 的概述

1.1什么是IO

Java中I/O 操作主要是指使用 java.io 包下的内容,进行输入、输出操作。 输入 也叫做 读取 数据, 输出 也叫做作

数据。

1.2 IO的分类

根据数据的流向分为: 输入流输出流

l 输入流:把数据从其他设备上读取到内存中的流。

l 输出流:把数据从内存中写出到其他设备上的流。

格局数据的类型分为: 字节流字符流

l 字节流 :以字节为单位,读写数据的流。

l 字符流 :以字符为单位,读写数据的流。

1.3 IO的流向说明图解

1.4 顶级分类们

输入流

输出流

字节流

字节输入流

InputStream

字节输出流

OutputStream

字符流

字符输入流

Reader

字符输出流

Writer

二.字节流

2.1一切皆为字节

一切文件数据 (文本、图片、视频等)在存储时,都是以二进制数字的形式保存,都一个一个的字节,那么传输时一 样如此。所以,字节流可以传输任意文件数据。在操作流的时候,我们要时刻明确,无论使用什么样的流对象,底层传输的始终为二进制数据。 

2.2 字节输出流【OutputStream】

java.io.OutputStream 抽象类是表示字节输出流的所有类的超类,将指定的字节信息写出到目的地。它定义了字节输出流的基本共性功能方法。

l public void close() :关闭此输出流并释放与此流相关联的任何系统资源。

l public void flush() :刷新此输出流并强制任何缓冲的输出字节被写出。

l public void write(byte[] b) :将 b.length字节从指定的字节数组写入此输出流。

l public void write(byte[] b, int off, int len) :从指定的字节数组写入 len字节,从偏移量 offff开始输出到此输出流。

l public abstract void write(int b) :将指定的字节输出流。

注意 close方法,当完成流的操作时,必须调用此方法,释放系统资源。 

2.3 FileOutputStream类  

OutputStream 有很多子类,我们从最简单的一个子类开始。

java.io.FileOutputStream 类是文件输出流,用于将数据写出到文件。

构造方法

l public FileOutputStream(File file) :创建文件输出流以写入由指定的 File对象表示的文件。

l public FileOutputStream(String name) : 创建文件输出流以指定的名称写入文件。

当你创建一个流对象时,必须传入一个文件路径。该路径下,如果没有这个文件,会创建该文件。如果有这个文件的数据。

2.4 字节输入流【InputStream】

java.io.InputStream 抽象类是表示字节输入流的所有类的超类,可以读取字节信息到内存中。它定义了字节输入流的基本共性功能方法。

l public void close() :关闭此输入流并释放与此流相关联的任何系统资源。

l public abstract int read() : 从输入流读取数据的下一个字节。

l public int read(byte[] b) : 从输入流中读取一些字节数,并将它们存储到字节数组 b中 。

注意 close方法,当完成流的操作时,必须调用此方法,释放系统资源。

2.5 FileInputStream类

java.io.FileInputStream 类是文件输入流,从文件中读取字节。

构造方法

l FileInputStream(File file) : 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的 File对象 fifile命名。

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

当你创建一个流对象时,必须传入一个文件路径。该路径下,如果没有该文件 ,会抛出 FileNotFoundException 。 

三.字符流

当使用字节流读取文本文件时,可能会有一个小问题。就是遇到中文字符时,可能不会显示完整的字符,那是因为一个中文字符可能占用多个字节存储。所以 Java提供一些字符流类,以字符为单位读写数据,专门用于处理文本文件。 

3.1 字符输入流【Reader】

java.io.Reader 抽象类是表示用于读取字符流的所有类的超类,可以读取字符信息到内存中。它定义了字符输入流的基本共性功能方法。

l public void close() :关闭此流并释放与此流相关联的任何系统资源。

l public int read() : 从输入流读取一个字符。

l public int read(char[] cbuf) : 从输入流中读取一些字符,并将它们存储到字符数组 cbuf中 。

3.2 FileReader类

java.io.FileReader 类是读取字符文件的便利类。构造时使用系统默认的字符编码和默认字节缓冲区。

注意:

1. 字符编码:字节与字符的对应规则。Windows系统的中文编码默认是GBK编码表。 idea中UTF-8

2. 字节缓冲区:一个字节数组,用来临时存储字节数据。

构造方法

l FileReader(File file) : 创建一个新的 FileReader ,给定要读取的File对象。

l FileReader(String fileName) : 创建一个新的 FileReader ,给定要读取的文件的名称。

当你创建一个流对象时,必须传入一个文件路径。类似于 FileInputStream 。

3.3 字符输出流【 Writer

java.io.Writer 抽象类是表示用于写出字符流的所有类的超类,将指定的字符信息写出到目的地。它定义了字节输出流的基本共性功能方法。

l void write(int c) 写入单个字符。

l void write(char[] cbuf) 写入字符数组。

l abstract  void write(char[] cbuf, int off, int len) 写入字符数组的 某一部分 ,offff数组的开始索引,len写的字符个数。

l void write(String str) 写入字符串。

l void write(String str, int off, int len) 写入字符串的某一部分,offff字符串的开始索引,len写的字符个数。

l void flush() 刷新该流的缓冲。

l void close() 关闭此流,但要先刷新它。

3.4 FileWriter类

java.io.FileWriter 类是写出字符到文件的便利类。构造时使用系统默认的字符编码和默认字节缓冲区。

构造方法

l FileWriter(File file) : 创建一个新的 FileWriter,给定要读取的File对象。

l FileWriter(String fileName) : 创建一个新的 FileWriter,给定要读取的文件的名称。

当你创建一个流对象时,必须传入一个文件路径,类似于 FileOutputStream。

关闭和刷新

因为内置缓冲区的原因,如果不关闭输出流,无法写出字符到文件中。但是关闭的流对象,是无法继续写出数据的。如果我们既想写出数据,又想继续使用流,就需要 flush 方法了。 

l flush : 刷新缓冲区,流对象可以继续使用。

l close 先刷新缓冲区,然后通知系统释放资源。流对象不可以再被使用了

注意 :即便是 flflush方法写出了数据,操作的最后还是要调用close方法,释放系统资源。

四.IO处理异常

之前的入门练习,我们一直把异常抛出,而实际开发中并不能这样处理,建议使用 try...catch...finally 代码

块,处理异常部分。

JDK7 的处理 ( 扩展知识点了解内容 )

还可以使用JDK7 优化后的 try-with-resource 语句,该语句确保了每个资源在语句结束时关闭。所谓的资源

(resource )是指在程序完成后,必须关闭的对象。

五.属性集

5.1 概述

java.util.Properties 继承于 Hashtable ,来表示一个持久的属性集。它使用键值结构存储数据,每个键及其对应值都是一个字符串。该类也被许多Java类使用,比如获取系统属性时, System.getProperties 方法就是返回一个 Properties 对象。

5.2 Properties类

构造方法

l public Properties() :创建一个空的属性列表。

基本的存储方法

l public Object setProperty(String key, String value) : 保存一对属性。

l public String getProperty(String key) :使用此属性列表中指定的键搜索属性值。

public Set<String> stringPropertyNames() :所有键的名称的集合。

与流相关的方法  

l public void load(InputStream inStream) :从字节输入流中读取键值对。

参数中使用了字节输入流,通过流对象,可以关联到某文件上,这样就能够加载文本中的数据了。文本数据格式:

filename=a.txt

length=209385038

location=D:\a.txt

注意:文本中的数据,必须是键值对形式,可以使用空格、等号、冒号等符号分隔。

我来评几句
登录后评论

已发表评论数()

相关站点

热门文章