学习总结最全IO流教程!小白自学总结!(学习并更新中)
目录
(3)File类常用的方法:获取功能、获取绝对路径和相对路径、判断功能、创建删除功能的方法
三.IO分类(in输入也叫做读取数据,out输出也叫做作写出数据)
(1)基本功能方法:(由父类OutputStream定义提供,但是子类都能使用,例如FileOutputStream类)
(3)注意:创建输出流对象的时候,系统会自动去对应位置创建对应文件,而创建输入流对象的时候,文件不存在则会报FileNotFoundException异常,也就是系统找不到指定的文件异常。
(4)FileOutputStream实现数据追加续写、换行
一.使用IO流四点要素
源(System.in) | InputStream(字节输入流) | Reader(字符输入流)(纯文本) |
目的 (System.out) | OutputStream(字节输出流) | Writer(字符输出流)(纯文本) |
(1)明确要操作的数据是数据源还是数据目的(也就是要读还是要写)
(2)明确要操作的设备上的数据是字节还是文本
(3)明确数据所在的具体设备
(4)明确是否需要额外功能(比如是否需要转换流、高效流等)
额外的功能:
1.需要转换—— 转换流 InputStreamReader 、OutputStreamWriter
2.需要高效—— 缓冲流Bufferedxxx
3.多个源—— 序列流 SequenceInputStream
4.对象序列化—— ObjectInputStream、ObjectOutputStream
5.保证数据的输出形式—— 打印流PrintStream 、Printwriter
6.操作基本数据,保证字节原样性——DataOutputStream、DataInputStream
二.File类(操作文件,只对文件本身操作,不对内容操作)
(1)三种常用的构造方法:
1、 public File(String pathname) :通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。
2、 public File(String parent, String child) :从父路径名字符串和子路径名字符串创建新的 File实例。
3、 public File(File parent, String child) :从父抽象路径名和子路径名字符串创建新的 File实例。
(2)注意:
- 一个File对象代表硬盘中实际存在的一个文件或者目录。
- File类构造方法不会给你检验这个文件或文件夹是否真实存在,因此无论该路径下是否存在文件或者目录,都不影响File对象的创建。
(3)File类常用的方法:获取功能、获取绝对路径和相对路径、判断功能、创建删除功能的方法
1、public String getAbsolutePath() :返回此File的绝对路径名字符串。
2、public String getPath() :将此File转换为路径名字符串。
3、public String getName() :返回由此File表示的文件或目录的名称。
4、public long length() :返回由此File表示的文件的长度。
(4)File判断功能的方法:
1、 public boolean exists()
:此File表示的文件或目录是否实际存在。
2、 public boolean isDirectory()
:此File表示的是否为目录。
3、public boolean isFile()
:此File表示的是否为文件。
(5)File类创建和删除功能的方法
1.public boolean createNewFile() :文件不存在,创建一个新的空文件并返回true,文件存在,不创建文件并返回false。
2.public boolean delete() :删除由此File表示的文件或目录。
3.public boolean mkdir() :创建由此File表示的目录。
4.public boolean mkdirs() :创建由此File表示的目录,包括任何必需但不存在的父目录。
(6)File类目录遍历:
1.public String[] list()
:返回一个String数组,表示该File目录中的所有子文件或目录。
2.public File[] listFiles()
:返回一个File数组,表示该File目录中的所有的子文件或目录。
注意:listFiles在获取指定目录下的文件或者文件夹时必须满足下面两个条件
1,指定的目录必须存在
2,指定的必须是目录。否则容易引发返回数组为null,出现NullPointerException异常
三.IO分类(in输入也叫做读取数据,out输出也叫做作写出数据)
根据数据的流向分为:输入流 和 输出流。
- 输入流 :把数据从
其他设备
上读取到内存
中的流。 - 输出流 :把数据从
内存
中写出到其他设备
上的流。
根据数据的类型分为:字节流 和 字符流。
- 字节流 :以字节为单位,读写数据的流。
- 字符流 :以字符为单位,读写数据的流。
- (这四个类的子类名称基本都是以其父类名作为子类名的后缀。)
四.字节输出流(OutputStream)
java.io.OutputStream
抽象类是表示字节输出流的所有类的超类(父类),将指定的字节信息写出到目的地。
(1)基本功能方法:(由父类OutputStream定义提供,但是子类都能使用,例如FileOutputStream类)
1、 public void close() :关闭此输出流并释放与此流相关联的任何系统资源。
2、 public void flush() :刷新此输出流并强制任何缓冲的输出字节被写出。
3、 public void write(byte[] b):将 b.length个字节从指定的字节数组写入此输出流。
4、 public void write(byte[] b, int off, int len) :从指定的字节数组写入 len字节,从偏移量 off开始输出到此输出流。 也就是说从off个字节数开始读取一直到len个字节结束
5、 public abstract void write(int b) :将指定的字节输出流。
(2)FileOutputStream类构造方法
1、 public FileOutputStream(File file)
:根据File对象为参数创建对象。
2、 public FileOutputStream(
String name
)
: 根据名称字符串为参数创建对象。
(3)注意:
创建输出流对象的时候,系统会自动去对应位置创建对应文件,而创建输入流对象的时候,文件不存在则会报FileNotFoundException异常,也就是系统找不到指定的文件异常。
(4)FileOutputStream实现数据追加续写、换行
1、public FileOutputStream(File file, boolean append)
2、public FileOutputStream(String name, boolean append)
这两个构造方法,第二个参数中都需要传入一个boolean类型的值,true 表示追加数据,false 表示不追加也就是清空原有数据。这样创建的输出流对象,就可以指定是否追加续写了,至于Windows换行则是 \n\r。
五.字节输入流
(1)基本功能方法:
1、 public void close() :关闭此输入流并释放与此流相关联的任何系统资源。
2、public abstract int read(): 从输入流读取数据的下一个字节。
3、 public int read(byte[] b): 该方法返回的int值代表的是读取了多少个字节,读到几个返回几个,读取不到返回-1
(2)FileInputStream类的构造方法
1、 FileInputStream(File file): 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的 File对象 file命名。
2、 FileInputStream(String name): 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的路径名name命名。
六.字符流
字符流:因为数据编码的不同,因而有了对字符进行高效操作的流对象,字符流本质其实就是基于字节流读取时,去查了指定的码表,而字节流直接读取数据会有乱码的问题(读中文会乱码)
SO:字符流 = 字节流 + 编码表
七.字符输入流(Reader)
(1)常用方法:
1、public void close() :关闭此流并释放与此流相关联的任何系统资源。
2、 public int read(): 从输入流读取一个字符。
3、 public int read(char[] cbuf): 从输入流中读取一些字符,并将它们存储到字符数组 cbuf中
FileReader类:(取字符文件的便利类。构造时使用系统默认的字符编码和默认字节缓冲区。)
(2)FileReader类构造方法:
1、FileReader(File file)
: 创建一个新的 FileReader ,给定要读取的File对象。
2、 FileReader(String fileName)
: 创建一个新的 FileReader ,给定要读取的文件的字符串名称。
八、字符输出流(Writer)
Writer象类是字符输出流的所有类的超类(父类),将指定的字符信息写出到目的地。它同样定义了字符输出流的基本共性功能方法。
(1)常用方法:
1、void write(int c) 写入单个字符。
2、void write(char[] cbuf)写入字符数组。
3、 abstract void write(char[] cbuf, int off, int len)写入字符数组的某一部分,off数组的开始索引,len写的字符个数。
4、 void write(String str)写入字符串。
5、void write(String str, int off, int len) 写入字符串的某一部分,off字符串的开始索引,len写的字符个数。
6、void flush()刷新该流的缓冲。
7、void close() 关闭此流,但要先刷新它。
FileWriter类:是写出字符到文件的便利类。构造时使用系统默认的字符编码和默认字节缓冲区。
(2)FileWriter类构造方法:
1、 FileWriter(File file)
: 创建一个新的 FileWriter,给定要读取的File对象。
2、FileWriter(String fileName)
: 创建一个新的 FileWriter,给定要读取的文件的名称。
(3)【注意】:
关闭资源时,与FileOutputStream不同。 如果不关闭,数据只是保存到缓冲区,并未保存到文件。
(4)关闭close和刷新flush
因为内置缓冲区的原因,如果不关闭输出流,无法写出字符到文件中。但是关闭的流对象,是无法继续写出数据的。如果我们既想写出数据,又想继续使用流,就需要flush 方法了。
flush :刷新缓冲区,流对象可以继续使用。
close:先刷新缓冲区,然后通知系统释放资源。流对象不可以再被使用了。
flush()这个函数是清空的意思,用于清空缓冲区的数据流,进行流的操作时,数据先被读到内存中,然后再用数据写到文件中,那么当你数据读完时,我们如果这时调用close()方法关闭读写流,这时就可能造成数据丢失,为什么呢?因为,读入数据完成时不代表写入数据完成,一部分数据可能会留在缓存区中,这个时候flush()方法就格外重要了。
以上学习资料来自于java大佬,本人作此文章在于总结强化巩固基础知识,方便日后复习,同时分享一下。