一.字节流(读取字节,输出字节)
OutputStream 所有字节输出流的超类,为抽象类,里面有所有输出流的共性方法.
InputStream 此抽象类表示字节输入流的所有超类,定义了所有子类共性的方法
字节输出流
换行符:windows(\r\n) linux(\n) mac(\r)
1.FileOutputStream 文件字节输出流(超类的一个子类)
(1)作用
把内存中的数据写入到硬盘文件中
(2)构造方法
FileOutputStream(String name,boolean append)
FileOutputStream(File file)
(3)构造方法中的参数:写入数据的目的地.
String name:目的地是一个文件的路径.
boolean append:追加写开关.true-创建对象不会覆盖源文件,继续在文件的末尾追加写数据.false-创建一个新文件,覆盖源文件
File file:目的地是一个文件
(4)构造方法的作用
*创建一个FileOutputStream对象
*会根据构造方法中传递的文件/文件路径,在硬盘创建一个空的文件
*会把FileOutputStream对象指向创建好的文件
(5)写入数据的原理(内存到硬盘)
java程序–>JVM(java虚拟机)–>os(操作系统)–>os调用写数据的方法–>把数据写入到文件中
(6)字节输出流的步骤
*创建一个FileOutputStream对象,构造方法中传递写入数据的目的地
*调用FileOutputStream对象中的方法write,把数据写入到文件中
*释放资源(流使用会占用一定的内存,使用完毕要把内存清空,提搞程序的效率)
字节输入流
1.FileInputStream 文件字节输入流
(1)构造方法
FileInputStream(String name)
FileInputStream(File file)
(2)构造方法参数:读取文件的数据源
String name:文件路径
File file:文件
(3)构造方法的作用:
*会创建一个FileInputStream对象
*会把FileInputStream对象指定构造方法中要读取的文件
(4)读取数据的原理(硬盘到内存)
java程序–>JVM–>OS–>os读取数据的方法–>读取文件
(5)字节输入流的使用步骤
*创建FileInputStream对象,构造方法中绑定要读取的数据源
*使用FileInputStream对象中的read,读取文件
*释放资源
二.字符流(读取字符,输出字符)
Reader 是字符输入流最顶层的父类,定义了一些共性的成员方法,是一个抽象类
字符输入流
1.FileReader 文件字符输入流
(1)作用
把硬盘文件中的数据以字符的形式读取到内存中
(2)构造方法
FileReader(String fileName)
FileReader(File file)
(3)参数:读取文件的数据源
(5)FileReade构造方法的作用
*创建一个FileReader对象
*把FileReader对象指向要读取的文件
(6)字符输入流的使用步骤
*创建FileReader对象,构造方法中绑定要读取的数据源
*使用FileReader对象中的方法read读取文件
*释放资源
字符输出流
FileWriter 文件字符输出流
(1)作用
把内存中的字符数据写入到文件中
(2)构造方法:
FileWrite(File file)
FileWrite(String fileName)
(3)参数:写入数据的目的地
(4)构造方法的作用
*会创建一个FileWrite对象
*会根据构造方法中传递的文件/文件路径,创建文件
*会把FileWriter对象指向创建好的文件
(5)字符输出流的使用步骤
*创建FileWriter对象,构造方法中绑定要写入数据的目的地
*使用FileWrite中的方法write,把数据写入到内存缓冲区中(字符转换为字节的过程)
*使用FileWrite中的方法flush,把内存缓冲去中的数据,刷新到文件中
*释放资源(会先把内存缓冲区中的数据刷新到文件中)
flush与close的区别
flush:刷新缓冲区,流对象可以继续使用
close:先刷新缓冲区,然后通知系统释放资源,流对象不可以在被使用了
三.缓冲流
字节缓冲流
1.BufferedOutputStream:字节缓冲输出流
(1)构造方法:
BufferedOutputStream(OutputStream out) 创建一个新的缓冲输出流,已将数据写入指定的底层输出流
BufferedInputStream(OutputStream out,int size) 创建一个新的缓冲输出流,以将具有指定缓冲区大小的数据写入指定的底层输出流
(2)参数
*OutputStream out:字节输出流.
可以传递FileOutputStream,缓冲流会给FileOutputStream增加一个缓冲区,提高FileOutputStream的写入效率
*int size:指定缓冲流内部缓冲区的大小,不指定默认
(3)使用步骤
*创建 FileOutputStream对象,构造方法中绑定要输出的目的地
*创建BufferedOutputStream对象,构造方法中传递FileOutputStream对象,提高FileOutputStream对象效率
*使用BufferedOutputStream对象中的方法write,把数据写入到内部缓冲区中
*使用BufferedOutputStream对象中的方法flush,把内部缓冲区中的数据,刷新到文件中
*释放资源(会先调用flush方法刷新数据,第4步可以省略)
2.BufferedInputStream:字节缓冲输入流
(1)构造方法
BufferedInputStream(InputStream in)
BufferedInputStream(InputStream in,int size)
(2)参数:
*InputStream in:字节输入流
我们可以传递FileInputStream,缓冲流会给FileInputStream增加一个缓冲区,提高FileInputStream的读取效率
*int size:指定缓冲流内部缓冲区的大小,不指定默认
(3)使用步骤
*创建FileInputStream对象,构造方法中绑定要读取的数据源
*创建BufferedInputStream对象,构造方法中传递FileInputStream对象,提高FileInputStream对象的读取效率
*使用BufferedInputStream对象中的方法read,读取文件
*释放资源(只关闭缓冲流就可以,因为缓冲流会自动关闭字节流)
字符缓冲流
1.BufferedWriter:字符缓冲输出流
(1)特有的方法
void newLine() 写入一个行分隔符.会根据不同的操作系统,获取不同的行分隔符
(2)步骤
*创建字符缓冲输出流对象,构造方法中传递字符输出流
*调用字符缓冲输出流中的方法wirte,把数据写入到内存缓冲区中
*调用字符缓冲输出流中的方法flush,把内存缓冲区中的数据,刷新到文件中
*释放资源
2.BufferedReader:字符缓冲输入流
(1)特有方法
*String readLine() 读取一个文本行,读取一行数据
*行的终止符号:通过下列字符之一即可认为某行已终止:换行(’\n’),回车(’\r’)或回车后直接跟着换行(\r\n)
*返回值:包含该行内容的字符串,不包含任何终止符,如果已到达流末尾,则返回null
(2)步骤
*创建字符缓冲输入对象,构造方法中传递字符输入流
*使用字符输入流对象中的方法read/readLine读取文本
*释放资源
转换流
OutputStreamWriter .wirter. 内存写到硬盘 .字符转字节
InputStreamReader .reader. 硬盘读到内存 . 字节转字符
//字节转字符
BufferedReader br=new BufferedReader(new InputStreamReader(accept.getInputStream()));
//字符转字节
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));
存在的疑问,转了字节流,为什么还可以放到字符缓冲流中?
最后发现字符流和转换流有如下关系
FileWriter为OutputStreamWriter的子类
FileReader为InputStreamReader的子类
个人理解为,在没有转换流的情况下,字符流按照常规对字符进行解码和编码.当使用了转换流,在编码和解码的时候会通过特定码表进行处理.自始至终属于字符流范围内操作.
ps(笔者不揣浅陋,写作匆忙,如有错误,敬请斧正)