IO流简单来说就是对文件进行操作(in(输入)/out(输出)),java中,根据处理的数据单位不同,一般分为字节流(二进制文--基本上所有文件都可以执行件)和字符流(只能执行txt文件--纯文本文件)。
字节流:
inputoutStream(FileInputStream、bufferedinputoutStream、objectinputStream)--输入
outputStream(FileOutputStream、bufferedinputoutStream、objectoutputstream)--输出
字符流:
writer(bufferedwriter、outputstreamwriter)--输入
reader(bufferedwriter、inputstreamwriter、printwriter/printstream)--输出
流的概念:
数据的读写抽象成数据,在管道中流动。
1、流只能单方向流动(管道中的水只能是同一方向,不可以一部分往后流,一部分向前面流)
2、输入流:程序从输入流中读取数据(网络、键盘、文件)
3、输出流:程序向外界输出数据(文件、显示器、打印机)
4、数据只能从头到尾的顺序进行读写(不能从中间度,也不能从尾到头)
File文件流
概述:封装一个地址路径,可以对这个路径进行一次操作,可以用来封装文件路径、文件夹路径、不存在的路径。
创建对象:File(String pathname--路径名称)
常用方法:
length():文件的字节量
exists():是否存在文件,存在则返回true
isfile():是否为文件,是则返回true
isdirectory():是否为文件夹,是则返回true
getname():获取文件(夹)的名字
getparent():获取父文件夹的路径
getabsolutepath():获取文件夹的完整路径
createnewfile():新建文件,文件夹不存在会异常,已存在会返回false
delete():删除文件,删除空文件夹
inputstream抽象类
字节流的输出所有类的超类、抽象类。
常用方法:
read()从输入流读取数据的下一个关节。
close()关闭此输入流并释放与之关联的所有资源。
FileinputoutStream子类
构造方法FileInputStream(File file)通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的 File 对象 file 指定。
FileInputStream(String pathname)过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的路径名 name 指定。
Bufferedinputstream子类(效率最高,因为有缓冲)
BufferedInputStream 为另一个输入流添加一些功能,即缓冲输入以及支持 mark 和 reset 方法的能力。在创建 BufferedInputStream 时,会创建一个内部缓冲区数组(默认8M大小)。在读取或跳过流中的字节时,可根据需要从包含的输入流再次填充该内部缓冲区,一次填充多个字节。
创建对象BufferedInputStream(InputStream in)创建一个 BufferedInputStream 并保存其参数,即输入流 in,以便将来使用。
outputstream抽象类
输出字节流的所有类的超类
常用方法:
close():关闭此输出流且释放与此流有关的所有系统文件。
flush():刷新此输出并强制写出所有缓冲输出字节
write():将指定的字节写入至文件中
FileoutputStream子类
FileOutputStream(String name)创建一个向具有指定名称的文件中写入数据的输出文件流。FileOutputStream(File file)建一个向指定 File 对象表示的文件中写入数据的文件输出流。
FileOutputStream(File file, boolean append) –追加创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
BufferedOutputStream子类
该类实现缓冲的输出流。通过设置这种输出流,应用程序就可以将各个字节写入底层输出流中,而不必针对每次字节写入调用底层系统。
创建对象BufferedOutputStream(OutputStream out)创建一个新的缓冲输出流,以将数据写入指定的底层输出流。
字符流写出
write抽象类:写入字符流的抽象类。
常用方法:
write():写入数据
close():关闭此输入流并关闭与之相关的系统资源(但要先刷新它)
FileWriter子类
用来写入字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是可接受的。要自己指定这些值,可以先在 FileOutputStream 上构造一个 OutputStreamWriter。
创建对象
FileWriter(String fileName)根据给定的文件名构造一个 FileWriter 对象。
FileWriter(String fileName, boolean append)根据给定的文件名以及指示是否附加写入数据的 boolean 值来构造 FileWriter 对象。
OutputStreamWriter子类
OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编码成字节。它使用的字符集可以由名称指定或显式给定,否则将接受平台默认的字符集。
创建对象:OutputStreamWriter(OutputStream out, String charsetName)创建使用指定字符集的 OutputStreamWriter。
OutputStreamWriter(OutputStream out)创建使用默认字符编码的 OutputStreamWriter
BufferedWriter子类
将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。 可以指定缓冲区的大小,或者接受默认的大小。在大多数情况下,默认值就足够大了。
创建对象:BufferedWriter(Writer out)创建一个使用默认大小输出缓冲区的缓冲字符输出流。
字符流读取
Reader抽象类:用于读取字符流的抽象类
常用方法:read()读取单个字符 close():关闭并释放资源
FileReader子类
用来读取字符文件的便捷类。此类的构造方法假定默认字符编码和默认字节缓冲区大小都是适当的。要自己指定这些值,可以先在 FileInputStream 上构造一个 InputStreamReader。
创建对象
FileReader(String fileName)在给定从中读取数据的文件名的情况下创建一个新 FileReader。
FileReader(File file)在给定从中读取数据的 File 的情况下创建一个新 FileReader。
InputStreamReader子类
InputStreamReader 是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。
创建对象
InputStreamReader(InputStream in, String charsetName) 创建使用指定字符集的 InputStreamReader。
InputStreamReader(InputStream in)创建一个使用默认字符集的 InputStreamReader。
BufferedReader子类
从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。
可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了。
创建对象:BufferedReader(Reader in)创建一个使用默认大小输入缓冲区的缓冲字符输入流。
实操题目:
将一个文件读出并写入到另外一个文件中
package day014; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import javax.security.auth.login.FailedLoginException; public class Test_copy { public static void main(String[] args) throws IOException { String from ="C:\\Users\\Administrator\\Desktop\\frist state2008\\xd.txt"; String to ="C:\\Users\\Administrator\\Desktop\\frist state2008\\xd1.txt"; copy(from,to); } private static void copy(String from,String to) throws IOException { InputStream in =null; OutputStream out = null; try { in = new BufferedInputStream(new FileInputStream ("C:\\Users\\Administrator\\Desktop\\frist state2008\\xd.txt")); out = new BufferedOutputStream(new FileOutputStream ("C:\\Users\\Administrator\\Desktop\\frist state2008\\xd1.txt")); int b; while((b=in.read())!=-1) { out.write(b); out.flush(); } }catch (IOException e) { System.out.println("文件复制失败"); }finally { in.close(); out.close(); } } }