一、IO流
1.概念:
IO流用来处理设备之间的数据传输。
java对数据的操作是通过流的方式。
java用于操作流的对象都在IO包中。
流操作的数据分为两种:
(1)字节流:可以操作任何数据
(2)字符流:只能操作纯字符数据
流按照数据流向分为两种:
(1)输入流:是指向java程序中输入数据(读入数据)。
(2)输出流:是指从java程序中向外写出数据。
2.IO流常用父类
输入流:字节流---InputStream 字符流-----Reader
输出流:字节流---OutputStream 字符流-----Writer
由这四个类派生的子类名称都是以这四个类名称作为子类名的后缀
例如:InputStream 的子类 FileInputStream Reader 的子类 FileReader
3.IO流的书写流程
1.使用前,导入IO包中的类
2.使用时,进行IO异常处理
3.使用后,释放资源
二、字节流
1.读入文件步骤:
(1)创建FileInputStream对象,指定一个文件,文件必须存在,不存在则会抛出fileoutfoundexception
(2)使用read()方法可以从文件中读取一个字节,如果读取到文件末尾则会读到-1
(3)读取结束后需要释放资源,调用close()方法关闭输入流
2.写入文件步骤
(1)创建FileOutputStream对象,置顶一个文件,文件不存在系统会自动创建该文件,存在则会清空原内容,如果需要追加,在构造函数中传入true
(2)使用Write()方法可以向文件写出一个字节
(3)写出结束后同样需要调用close()方法关闭资源
3.拷贝文件
有四种拷贝方式:
(1)从文件中逐个字节读取,逐个字节写出,但这样做效率非常低
- public static void main(String[] args) throws IOException {
- // TODO Auto-generated method stub
- FileInputStream fis = new FileInputStream("C:/Users/king/Desktop/Readme.txt");
- FileOutputStream fos = new FileOutputStream("abc.txt");
- int a;
- while ((a = fis.read()) != -1) {
- fos.write(a);
- }
- fis.close();
- fos.close();
- }
(2)自定义字节数组,一次性从文件中读取多个字节装入数组,然后再一次性把数组中的字节写出
- FileInputStream fis = new FileInputStream("C:/Users/king/Desktop/Readme.txt");
- FileOutputStream fos = new FileOutputStream("bcd.txt");
- int len;
- byte[] arr= new byte[1024];
- while((len = fis.read(arr)) != -1){
- fos.write(arr, 0, len);
- }
- fis.close();
- fos.close();
(3)将文件一次性拷贝,但是有弊端,如果文件过大,则会出现内存溢出。用availavle()方法获取文件的字节长度。
- FileInputStream fis = new FileInputStream("C:/Users/king/Desktop/Readme.txt");
- FileOutputStream fos = new FileOutputStream("edd.txt");
- byte[] arr = new byte[fis.available()];
- int len;
- while((len = fis.read(arr)) != -1){
- fos.write(arr, 0, len);
- }
- fis.close();
- fos.close();
(4)使用系统提供的缓冲区buffered,使用方法和自定义数组相同。
- FileInputStream fis = new FileInputStream("C:/Users/king/Desktop/Readme.txt");
- FileOutputStream fos = new FileOutputStream("daf.txt");
- BufferedInputStream bis = new BufferedInputStream(fis);
- BufferedOutputStream bos = new BufferedOutputStream(fos);
- int len;
- while((len = bis.read()) != -1){
- bos.write(len);
- }
- bis.close();
- bos.close();
InputStream:
read()获取一个字节 available() 获取可读的字节数
read(byte[])读取若干(数组长度)字节 close()关闭流 释放资源
OutputStream:
write()写出一个字节 write(byte[],start,len)写出一个字节,写出的长度从start开始,到len结束
write(byte[])写出数组内的所有字节 close()关闭流,释放资源
5.BufferedInputStream
BufferedInputStream内置了一个缓冲区(数组)
BufferedInputStream会一次性从文件中读取8192个字节,然后一个一个传给java程序
6.BufferedOutputStream
BufferedOutputStream内置了一个缓冲区(数组)
程序向流中写出字节时,不会直接写到文件,先写到缓冲区中。
直到缓冲区写满,BufferedOutputStream才会把缓冲区中的数据一次性写到文件中
7.flush和close的区别
flush():只刷新缓冲区,流依然存在,并可以继续使用,可以使用多次
close():也会刷新缓冲区,但是刷新后,立刻关闭流资源,流不可以继续使用,只能用一次。
Java IO 的一般使用原则 :
一、按数据来源(去向)分类:
1 、是文件: FileInputStream, FileOutputStream, ( 字节流 )FileReader, FileWriter( 字符 )
2 、是 byte[] : ByteArrayInputStream, ByteArrayOutputStream( 字节流 )
3 、是 Char[]: CharArrayReader, CharArrayWriter( 字符流 )
4 、是 String: StringBufferInputStream, StringBufferOuputStream ( 字节流 )StringReader, StringWriter( 字符流 )
5 、网络数据流: InputStream, OutputStream,( 字节流 ) Reader, Writer( 字符流 )
二、按是否格式化输出分:
1 、要格式化输出: PrintStream, PrintWriter
三、按是否要缓冲分:
1 、要缓冲: BufferedInputStream, BufferedOutputStream,( 字节流 ) BufferedReader, BufferedWriter( 字符流 )(Reader,Writer类由于是直接从文件读取字节流再转化成字符流,开销大,所以需要以Buffered包裹,提高效率)
四、按数据格式分:
1 、二进制格式(只要不能确定是纯文本的) : InputStream, OutputStream 及其所有带 Stream 结束的子类
2 、纯文本格式(含纯英文与汉字或其他编码方式); Reader, Writer 及其所有带 Reader, Writer 的子类
五、按输入输出分:
1 、输入: Reader, InputStream 类型的子类
2 、输出: Writer, OutputStream 类型的子类
六、特殊需要:
1 、从 Stream 到 Reader,Writer 的转换类: InputStreamReader, OutputStreamWriter
2 、对象输入输出: ObjectInputStream, ObjectOutputStream
3 、进程间通信: PipeInputStream, PipeOutputStream, PipeReader, PipeWriter
4 、合并输入: SequenceInputStream
5 、更特殊的需要: PushbackInputStream, PushbackReader, LineNumberInputStream, LineNumberReader
决定使用哪个类以及它的构造进程的一般准则如下(不考虑特殊需要):
第一,考虑最原始的数据格式是什么,(四)
第二,是输入还是输出,(五)
第三,是否需要转换流,(六)
第四,数据来源(去向)是什么,(一)
第五,是否要缓冲,((三 ),特别注明:一定要注意的是 readLine() 是否有定义,有什么比 read, write 更特殊的输入或输出方法)
第六,是否要格式化输出,(二)