文章目录
Java IO技术可以实现数据的持久化
流概述
什么是流:流是一组有序的数据序列,根据操作类型,可分为输入流和输出流两种。
IO流提供了一条通道程序,可以将源中的字节序列送到目的地。源和目的地可以是文件、键盘、鼠标、内存、显示器等。
输入/输出流
Java中定义了许多类专门负责各种方式的输入输出,都在java.io包中。所有输入流类都是抽象类InputStream(字节输入流)或抽象类Reader(字符输入流)的子类;所有输出流都是抽象类OutputStream(字节输出流)或抽象类Writer(字符输出流)的子类。
Java的字符是Unicode编码,是双字节的,InputStream是用来处理字节的,并不适合处理字符文本。Reader类(字符输入流)在处理字符串时简化了编程,更适合处理字符数据。
File类
File是java.io包中唯一代表磁盘文件本身的对象,File定义了一些平台无关的方法来操作文件并获取文件信息,常用方法如下:
创建文件
File file = new File("word.txt", true) 向文件中追加内容时要加true参数(是append的),新建则不用
file.createNewFile()
获取文件信息
getName() 返回文件名
canRead() 返回boolean
canWrite() 返回boolean
exits() 返回boolean
length() 返回文件长度(long)
getAbsolutePath() 返回文件绝对路径
getParent() 返回文件的父路径
isFile() 返回是否是文件
isDirectory() 返回是否是目录
文件输入输出流
FileInputStream:继承InputStream类
FileOutputStream:继承OutputStream类
常用构造方法:
FileInputStream in = new FileInputStream(String name)
FileInputStream in = new FileInputStream(File file) 可以在将文件链接输入流之前对文件进行前置分析
int len = in.read(byte byt[]) 从文件中读取数据到byt数组中,若要输出可以String(byt)
out.write(byte byt[]) 将byt字节数组中的数据写入文件,字节数组可通过"123".getBytes()获取
由于汉字在文件中占用两个字节,若使用字节流,很可能会出现乱码,此时使用字符流会好一些。
FileReader和FileWriter字符流对应了FileInputStream和FileOutputStream
常用构造方法:
FileReader in = new FileReader(String name)
FileReader in = new FileReader(File file) 可以在将文件链接输入流之前对文件进行前置分析
int len = in.read(char byt[]) 从文件中读取数据到byt数组中,若要输出可以String(byt)
out.write(char byt[]) 将byt字节数组中的数据写入文件,字节数组可通过"123".getBytes()获取
带缓存的输入输出流
缓存是一种IO性能优化方法
BufferedInputStream & BufferedOutputStream
BufferedInputStream类可以对所有InputStream类进行带缓存的包装,以达到性能优化的目的
常用构造方法:
BufferedInputStream bufferedin = new BufferedInputStream(InputStream in) 默认缓存流为32字节
BufferedInputStream bufferedin = new BufferedInputStream(InputStream in, int size) 指定缓存流大小
字节数据文件的读取过程:文件 --> InputStream --> BufferedInputStream --> 目的地
BufferedOutputStream和OutputStream输出信息完全相同,只是BufferedOutputStream有一个flush()方法将缓存区的数据强制输出完
BufferedReader & BufferedWriter
BufferedReader常用方法
read() 读取单个字符
readLine() 读取一个文本行,并将其返回为字符串;无数据则返回null
BufferedWriter常用方法
write(String s, int off, int len) 写入字符串的某一部分,先写入缓存区,若想立即写入输出流,一定要调用flush方法
flush() 刷新该流的缓存
newLine() 写入一个行分隔符
数据输入输出流
数据输入输出流允许程序从底层输入流中读取基本Java数据类型,即:读取数据时不必再关心当前数值是哪种字节
DataInputStream 和 DataOutputStream类的构造方法如下:
DataInputStream dis = new DataInputStream (InputStream in)
DataOutputStream dos = new DataOutputStream(OutputStream out)
DataOutputStream类提供了三种字符串写入方法
writeBytes(String s) 将字符串中每个字符的低字节内容写入,因为java中的字符是Unicode编码双字节的
writeChars(String s) 将字符串中的每个字符都写入
writeUTF(String s) 将字符串按UTF编码后的字节长度写入,然后写入每个字节的UTF编码
DataInputStream只提供了 readUTF() 方法返回字符串。因为要在一个连续的字节流中读取一个字符串,没有特殊标记就无法确定字符串长度,不知道读到哪里才停,