1 概述
I表示intput,把硬盘文件中的数据读入到内存的过程,称之输入,负责读 O表示output,把内存中的数据写出到硬盘文件的过程,称之输出,负责写
总结四大流:
字节输入流:以内存为基准,来自磁盘文件/网络中的数据以字节的形式 读入到内存中去的流称为字节输入流。 字节输出流:以内存为基准,把内存中的数据以字节的形式 写出到磁盘文件或者网络介质 中去的流称为字节输出流。 字符输入流:以内存为基准,来自磁盘文件/网络中的数据以字符的形式 读入到内存中去的流称为字符输入流。 字符输出流:以内存为基准,把内存中的数据以字符的形式 写出到磁盘文件或者网络介质 中去的流称为字符输出流。
IO流体系结构
2 FileInputStream:文件字节输入流
作用:以内存为基准,把磁盘文件中的数据以字节的形式读取到内存中去
构造器 说明 public FileInputStream(File file) 创建字节输入流管道与源文件对象接通 public FileInputStream(String pathname) 创建字节输入流管道与源文件路径接通
InputStream is = new FileInputStream ( new File ( "fileinputstream\\data.txt" ) ) ;
InputStream is = new FileInputStream ( "fileinputstream\\data.txt" ) ;
方法名称 说明 public int read() 每次读取一个字节返回,如果字节已经没有可读的返回-1
int b1 = is. read ( ) ;
System . out. println ( ( char ) b1) ;
int b2 = is. read ( ) ;
System . out. println ( ( char ) b2) ;
int b3 = is. read ( ) ;
System . out. println ( ( char ) b3) ;
int b4 = is. read ( ) ;
System . out. println ( b4) ;
int b;
while ( ( b = is. read ( ) ) != - 1 ) {
System . out. print ( ( char ) b) ;
}
存在问题:性能较慢、读取中文字符输出无法避免乱码问题(一个中文字符占2-3个字节)
方法名称 说明 public int read(byte[] buffer) 每次读取一个字节数组返回,如果字节已经没有可读的返回-1
byte [ ] buffer = new byte [ 3 ] ;
int len = is. read ( buffer) ;
System . out. println ( "读取了几个字节:" + len) ;
String rs = new String ( buffer) ;
System . out. println ( rs) ;
int len1 = is. read ( buffer) ;
System . out. println ( "读取了几个字节:" + len1) ;
String rs1 = new String ( buffer) ;
System . out. println ( rs1) ;
int len2 = is. read ( buffer) ;
System . out. println ( "读取了几个字节:" + len2) ;
String rs2 = new String ( buffer, 0 , len2) ;
System . out. println ( rs2) ;
int len3 = is. read ( buffer) ;
System . out. println ( len3) ;
byte [ ] buffer = new byte [ 3 ] ;
int len;
while ( ( len = is. read ( buffer) ) != - 1 ) {
System . out. print ( new String ( buffer, 0 , len) ) ;
}
读取的性能得到了提升 依旧无法避免读取中文字符输出乱码问题
方法名称 说明 public byte[] readAllBytes() throws IOException 直接将当前字节输入流对应的文件对象的字节数据装到一个字节数组返回
public static void main ( String [ ] args) throws Exception {
File f = new File ( "fileinputstream\\data.txt" ) ;
InputStream is = new FileInputStream ( f) ;
byte [ ] buffer = new byte [ ( int ) f. length ( ) ] ;
int len = is. read ( buffer) ;
System . out. println ( "读取了多少个字节:" + len) ;
System . out. println ( "文件大小:" + f. length ( ) ) ;
System . out. println ( new String ( buffer) ) ;
byte [ ] buffer = is. readAllBytes ( ) ;
System . out. println ( new String ( buffer) ) ;
}
如果文件过大,字节数组可能引起内存溢出 但能解决读取中文字符乱码问题
3 FileOutputStream:文件字节输出流
作用:以内存为基准,把内存中的数据以字节的形式写出到磁盘文件中去的流
构造器 说明 public FileOutputStream(File file) 创建字节输出流管道与源文件对象接通 public FileOutputStream(File file,boolean append) 创建字节输出流管道与源文件对象接通,可追加数据 public FileOutputStream(String filepath) 创建字节输出流管道与源文件路径接通 public FileOutputStream(String filepath,boolean append) 创建字节输出流管道与源文件路径接通,可追加数据
OutputStream os = new FileOutputStream ( "fileinputstream\\data.txt" , true ) ;
OutputStream os = new FileOutputStream ( "fileinputstream\\data.txt" ) ;
方法名称 说明 public void write(int a) 写一个字节出去 public void write(byte[] buffer) 写一个字节数组出去 public void write(byte[] buffer , int pos , int len) 写一个字节数组的一部分出去 flush() 刷新流,还可以继续写数据 close() 关闭流,释放资源,但是在关闭之前会先刷新流。一旦关闭,就不能再写数据
os. write ( 'a' ) ;
os. write ( 98 ) ;
os. write ( "\r\n" . getBytes ( ) ) ;
byte [ ] buffer = { 'a' , 97 , 98 , 99 } ;
os. write ( buffer) ;
os. write ( "\r\n" . getBytes ( ) ) ;
byte [ ] buffer2 = "我是方佬肆" . getBytes ( ) ;
os. write ( buffer2) ;
os. write ( "\r\n" . getBytes ( ) ) ;
byte [ ] buffer3 = { 'a' , 97 , 98 , 99 } ;
os. write ( buffer3, 0 , 3 ) ;
os. write ( "\r\n" . getBytes ( ) ) ;
os. flush ( ) ;
os. close ( ) ;
示例:拷贝文件
try {
InputStream is = new FileInputStream ( "fileinputstream\\data.txt" ) ;
OutputStream os = new FileOutputStream ( "fileinputstream\\data2.txt" ) ;
byte [ ] buffer = new byte [ 1024 ] ;
int len;
while ( ( len = is. read ( buffer) ) != - 1 ) {
os. write ( buffer, 0 , len) ;
}
System . out. println ( "复制完成了!" ) ;
os. close ( ) ;
is. close ( ) ;
} catch ( Exception e) {
e. printStackTrace ( ) ;
}
4 FileReader:文件字符输入流
作用:以内存为基准,把磁盘文件中的数据以字符的形式读取到内存中去
读取中文输出,字符流更合适,因为其最小单位是按照单个字符读取的
构造器 说明 public FileReader(File file) 创建字符输入流管道与源文件对象接通 public FileReader(String pathname) 创建字符输入流管道与源文件路径接通
Reader fr = new FileReader ( new File ( "fileinputstream\\data.txt" ) ) ;
Reader fr = new FileReader ( "fileinputstream\\data.txt" ) ;
方法名称 说明 public int read() 次读取一个字符返回,如果字符已经没有可读的返回-1
int code = fr. read ( ) ;
System . out. print ( ( char ) code) ;
int code1 = fr. read ( ) ;
System . out. print ( ( char ) code1) ;
int code;
while ( ( code = fr. read ( ) ) != - 1 ) {
System . out. print ( ( char ) code) ;
}
存在问题:性能较慢
方法名称 说明 public int read(char[] buffer) 每次读取一个字符数组,返回读取的字符个数,如果字符已经没有可读的返回-1
char [ ] buffer = new char [ 1024 ] ;
int len;
while ( ( len = fr. read ( buffer) ) != - 1 ) {
String rs = new String ( buffer, 0 , len) ;
System . out. print ( rs) ;
}
读取的性能得到了提升 解决读取中文字符输出乱码问题
5 FileWriter:文件字符输出流
作用:以内存为基准,把内存中的数据以字符的形式写出到磁盘文件中去的流
构造器 说明 public FileWriter(File file) 创建字符输入流管道与源文件对象接通 public FileWriter(File file,boolean append) 创建字符输出流管道与源文件对象接通,可追加数据 public FileWriter(String pathname) 创建字符输入流管道与源文件路径接通 public FileWriter(String filepath,boolean append) 创建字符输出流管道与源文件路径接通,可追加数据
方法名称 说明 void write(int a) 写一个字符出去 void write(char[] cbuf) 写一个字符数组出去 void write(char[] cbuf , int pos , int len) 写一个字符数组的一部分出去 void write(String str) 写一个字符串 void write(String str, int off, int len) 写一个字符串的一部分 flush() 刷新流,还可以继续写数据 close() 关闭流,释放资源,但是在关闭之前会先刷新流。一旦关闭,就不能再写数据
fw. write ( 98 ) ;
fw. write ( 'a' ) ;
fw. write ( '徐' ) ;
fw. write ( "\r\n" ) ;
fw. write ( "方佬肆fang" ) ;
fw. write ( "\r\n" ) ;
char [ ] chars = "方佬肆fang" . toCharArray ( ) ;
fw. write ( chars) ;
fw. write ( "\r\n" ) ;
fw. write ( "方佬肆fang" , 0 , 5 ) ;
fw. write ( "\r\n" ) ;
fw. write ( chars, 3 , 5 ) ;
fw. write ( "\r\n" ) ;
fw. flush ( ) ;
fw. close ( ) ;
6 IO流资源释放方式
try-catch-finally
finally:放在try-catch后面的,无论是正常执行还是异常执行代码,最后一定要执 行,除非JVM退出。 作用:一般用于进行最后的资源释放操作(专业级做法)
try {
FileOutputStream fos = new FileOutputStream ( "a.txt" ) ;
fos. write ( 97 ) ;
} catch ( IOException e) {
e. printStackTrace ( ) ;
} finally {
try {
if ( os!= null ) os. close ( ) ;
} catch ( IOException e) {
e. printStackTrace ( ) ;
}
try {
if ( is != null ) is. close ( ) ;
} catch ( IOException e) {
e. printStackTrace ( ) ;
}
}
try-with-resource
try (
InputStream is = new FileInputStream ( "file-io-app/src/out04.txt" ) ;
OutputStream os = new FileOutputStream ( "file-io-app/src/out05.txt" ) ;
) {
byte [ ] buffer = new byte [ 1024 ] ;
int len;
while ( ( len = is. read ( buffer) ) != - 1 ) {
os. write ( buffer, 0 , len) ;
}
System . out. println ( "复制完成了!" ) ;
} catch ( Exception e) {
e. printStackTrace ( ) ;
}