在java中把不同的输入/输出源(键盘、文件、网络连接等)抽象表述为“流”,通过流的方式允许java程序使用相同的方式来访问不同的输入/输出源。
按照不同的分类方式,可以将流分为不同类型。
(1)输入流和输出流
按照流的流向来分,可以分为输入流和输出流。
输入流:只能从中读取数据,而不能向其写入数据。
输出流:只能向其写入数据,而不能从中读取数据。
这里的输入、输出都是从程序运行所在内存的角度来划分的。数据从内存到硬盘,通常称为输出流。
字节流和字符流的用法几乎完全一样,区别在于字节流和字符流所操作的数据单元不同。字节流操作的数据单元是8位的字节,而字符流操作的数据单元是16位的字符。
字节流主要由InputStream和OutputStream作为基类,而字符流则主要由Reader和Writer作为基类。
可以从/向一个特定的IO设备(如磁盘/网络)读/写数据的流,称为节点流,节点流也被称为低级流。
处理流用于对一个已存在的流进行连接或封装,通过封装后的流来实现数据读写功能。处理流也被称为高级流。(java使用处理流来包装节点流是一种典型的装饰器设计模式,通过使用处理流来包装不同的节点流,既可以消除不同节点流的实现差异,也可以提供更方便的方法来完成输入/输出功能。)
OutputStream此抽象类,表示输出字节流所有类的父类,操作的数据都是字节。
FileOutputStream类,即文件输出流,是用于将数据写入File的输出流。
构造方法:
示例:
package com.xupt.fos; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class FileOutputStream01 { public static void main(String[] args) throws IOException { File file=new File("F:\\AAA\\aa.txt"); FileOutputStream fos=new FileOutputStream(file); fos.write("既然选择了远方,那么留给世界的只能是背影".getBytes()); fos.close(); } }InputStream此抽象类,是表示字节输入流的所有类的父类,定义了字节输入流的基本共性功能方法。
int read():读取一个字节并返回,没有字节返回-1.
int read(byte[]): 读取一定量的字节数,并存储到字节数组中,返回读取到的字节数。
FileInputStream 从文件系统中的某个文件中获得输入字节。
构造方法:
在读取文件中的数据时,调用read方法,实现从文件中读取数据。
(1)一次读取一个字节
示例:
package com.xupt.fos; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; public class FileInputStream01 { public static void main(String[] args) throws IOException { File file=new File("F:\\AAA\\a.txt"); FileInputStream fis=new FileInputStream(file); int len=0; while((len=fis.read())!=-1){ System.out.print((char)len); } fis.close(); } }(2)一次读取一个字节数组
package com.xupt.fos; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; public class FileInputStream02 { public static void main(String[] args) throws IOException { File file=new File("F:\\AAA\\a.txt"); FileInputStream fis=new FileInputStream(file); byte[] b=new byte[1024]; int len=0; while((len=fis.read(b))!=-1){ System.out.println(new String(b,0,len)); } fis.close(); } }方式一:
package com.xupt.fos; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class copyFile { public static void main(String[] args) throws IOException { File srcFile=new File("F:\\AAA\\a\\1.jpg"); File destFile=new File("F:\\AAA\\b\\1.jpg"); FileInputStream fis=new FileInputStream(srcFile); FileOutputStream fos=new FileOutputStream(destFile); int len=0; while((len=fis.read())!=-1){ fos.write(len); } fos.close(); fis.close(); } }方式二:
package com.xupt.fos; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class copyFile02 { public static void main(String[] args) throws IOException { File srcFile=new File("F:\\AAA\\a\\2.jpg"); File destFile=new File("F:\\AAA\\b\\2.jpg"); FileInputStream fis=new FileInputStream(srcFile); FileOutputStream fos=new FileOutputStream(destFile); //定义一个缓冲区 byte[] b=new byte[1024]; int len=0; while((len=fis.read(b))!=-1){ //将数组中的指定长度的数据写入到输出流中 fos.write(b,0,len); } fos.close(); fis.close(); } }Reader是字符输入流的抽象父类,本身并不能创建实例来执行输入。
read():读取单个字符并返回
read(char[]):将数据读取到数组中,并返回读取的个数。
构造方法:
FileReader读取文本文件:
package com.xupt.reader; import java.io.FileReader; import java.io.IOException; public class FileReaderTest01 { public static void main(String[] args) throws IOException { FileReader fr=new FileReader("a.txt"); int len=0; while((len=fr.read())!=-1){ System.out.print((char)len); } fr.close(); } }Writer是字符输入流的抽象父类,其方法如下:
构造方法:
FileWriter将中文写入文本文件中:
package com.xupt.writer; import java.io.FileWriter; import java.io.IOException; public class FileWriterTest01 { public static void main(String[] args) throws IOException { FileWriter fw=new FileWriter("a.txt"); fw.write("我可以等在这路口,不管你会不会经过"); fw.flush(); fw.close(); } } 写入字符到文件中,先进行流的刷新,再进行流的关闭。flush():将流中的缓冲区缓冲的数据刷新到目的地中,刷新后,流还可以继续使用。
close():关闭资源,但在关闭前会将缓冲区中的数据先刷新到目的地,否则丢失数据,然后在关闭流。流不可以使用。如果写入数据多,一定要一边写一边刷新,最后一次可以不刷新,由close完成刷新并关闭。
