Java的IO流是实现输入和输出的基础,可以方便的实现数据的输入和输出操作。在java中把不同的输入/输出源(键盘,文件,网络连接等)抽象表述为“流”(stream)。
按照 流的文件类型:字节流(InputStream、OutputStream)和字符流(Reader,Writer)
按照 流的流向:输入流和输出流
按照 功能 :节点流 和 过滤流
![](https://img.laitimes.com/img/9ZDMuAjOiMmIsIjOiQnIsISPrdEZwZ1Rh5WNXp1bwNjW1ZUba9VZwlHdsAjMfd3bkFGazxCMx8VesATMfhHLlN3XnxCMwEzX0xiRGZkRGZ0Xy9GbvNGLpZTY1EmMZVDUSFTU4VFRR9Fd4VGdsQTMfVmepNHLrJXYtJXZ0F2dvwVZnFWbp1zczV2YvJHctM3cv1Ce-cmbw5yNwQTOzETNzATO5cTMzYTMvwlNxkDMxIDMy8CXzV2Zh1WavwVbvNmLvR3YxUjLyM3Lc9CX6MHc0RHaiojIsJye.png)
所有文件数据(文本、图片、视频等)在存储时,都是二进制数字的形式,也就是一个一个的字节,传输时一样如此。所以,字节流可以传输任意文件数据。
绝对路径:一个完整的路径,以盘符开头,例如F://123.txt
相对路径:一个简化的路径,不以盘符开头,例如//123.txt//b.txt。
getAbsolutePath() :返回此File的绝对路径名字符串。
getPath() :将此File转换为路径名字符串。
getName() :返回由此File表示的文件或目录的名称。
length() :返回由此File表示的文件的长度(字节)
如果File是目录,则返回值未指定。
exists() :此File表示的文件或目录是否存在。
isDirectory() :此File表示的是否为 目录。
isFile() :此File表示的是否为 文件。
createNewFile() :文件不存在,创建一个新的空文件并返回true,文件存在,不创建文件并返回false。
delete() :删除由此File表示的文件或目录。
mkdir() :创建由此File表示的目录。如果父类不存在,则创建失败
mkdirs():创建由此File表示的目录,同时创建不存在的父级目录。
所以一般选用 mkdirs()
那么什么时候用字节流什么时用字符流呢
在遍历文件时候,一般选择字符流
而对文件的内容进行读写操作时一般用字节流
无论使用什么样的流对象,底层传输的始终为二进制数据。但在用字符流读写文件内容时,规定的字符容器可能会大于需要读写的的内容(字节)
public FileOutputStream(File file):以File对象为参数创建对象。
public FileOutputStream(String name): 以名称字符串为参数创建对象。
开发常用第二种,指定路径字符串
注意:创建输出流对象的时候,如果路径不存在,系统会自动去对应位置创建对应文件
输入流对象的时候,文件不存在则会报FileNotFoundException异常
当我向有数据的文件中写出字节时,可以传入第二个参数Boolean
boolean为ture时,表示追加数据,不会对元数据进行覆盖。
false 表示不追加 也就是清空原有数据。
构造方法类比输出流
同样推荐第二种狗构造方法
当你创建一个流对象时,传入的路径下,该文件,会抛出
输出结果为 ab cd ed
为何:因为长度为2的数组,每次读取2个字符,下次读取时,另外两个字符将原字符覆盖
第一次:ab
第二次:c覆盖a,d覆盖b 结果为cd
第三次:e覆盖d,原来的d没有被覆盖,所以结果为 ed
close() :关闭流
flush() :强制缓冲的输出字节写出。
write(byte[] b):将Byte数组 .length()个字节数组写入输出流。
write(byte[] b, int off, int len) :从偏移量 off开始输出到此输出流,读取len个字符
write(int b) :将指定的字节输出流。
创建流对象时,会创建一个内置的默认大小的缓冲区数组,通过缓冲区读写,减少系统IO次数,从而提高读写的效率。
public BufferedInputStream(InputStream in) :创建一个新的缓冲输入流,注意参数类型为InputStream。
字节输出流一样。
举例:
编码:字符(能看懂的) –> 字节(看不懂的)
解码:字节(看不懂的) –> 字符(能看懂的)
FileReader 读取项目中的文本文件。由于IDEA的设置,都是默认的UTF-8编码
但是,由于Windows系统的默认是GBK编码,读取Windows系统中创建的文本文件时,就会出现乱码。
Java 提供了一种对象序列化的机制。用一个字节序列可以表示一个对象,该字节序列包含该对象的数据、对象的类型和对象中存储的属性等信息。字节序列写出到文件之后,相当于文件中持久保存了一个对象的信息
1.该类必须实现java.io.Serializable 接口,Serializable 是一个标记接口,不实现此接口的类将不会使任何状态序列化或反序列化,会抛出NotSerializableException 。
2.该类的所有属性必须是可序列化的。如果有一个属性不需要可序列化的,则该属性必须注明是瞬态的,使用transient 关键字修饰。
一种类与类交互的模式