首页 > 代码库 > Java流知识总结详解
Java流知识总结详解
流总结:
一、流的分类:
数据单位:字节流 字符流
方向: 输出流 输入流
角色: 节点流 套节流
字节流:以Stream结尾。
字符流:以Reader 和Writer 结尾。
输入流:所有带有Input或者Reader。
输出流:所有带有Output或者Writer。
节点流:构造时传入文件对象或文件路径的类都是字节流类。
处理流:构造时传入其他流的对象的类都是处理流类。
二、InputStream 是所有字节输入流的基类:
最典型的实现是:FileInputStream
最重要的三个方法:
int read() 从输入流中读取一个字节数据。
int read(byte[] b) 从输入流中将最多 b.length 个字节的数据读入 byte 数组 b 中。
int read(byte[] b, int off, int len) 从输入流中将最多 len 个字节的数据读入 byte 数组 b 中。
三、OutputStream 是所有字节输出流的基类:
最典型的是:FileOutputStream
最重要的三个方法:
void write(int b) 将指定的字节写入此输出流。
void write(byte[] b) 将 b.length 个字节从指定的 byte 数组写入此输出流。
void write(byte[] b, int off, int len) 将指定 byte 数组中从偏移量 off 开始的 len 个 字节写入此输出流。
四、Reader
Reader 是所有字符输入流的基类
Reader 的典型实现时 FileReader 类
最重要的方法:
int read() 从输入流中读取一个字符数据。
int read(char[] c) 从输入流中将最多 c.length 个字符的数据读入 char 数组 c 中。
int read(char[] c, int off, int len) 从输入流中将最多 len 个字符的数据读入 char 数组 c 中。
五、Writer
Writer 是所有字符输出流的基类。
1.Writer 的典型实现就是 FileWriter 最重要的方法:
void write(int c) 将指定的字符写入此输出流。
void write(char[] c) 将 c.length 个字符从指定的 char 数组写入此输出流。
void write(char[] c, int off, int len) 将指定 char 数组中从偏移量 off 开始的 len 个 字符写入此输出流。
void write(String s) 将字符串写入此输出流。
void write(String s, int off, int len) 将指定字符串中从偏移量 off 开始的 len 个 字符写入此输出流。
七、字节缓冲流:
BufferedInputStream(FileInputStream)
BufferedOutputStream(FileOutputStream)//括号里是举例
八、字符缓冲流:
BufferedReader(FileReader)
BufferedWriter(FileWriter)//括号里是举例
缓冲流要套接在相应的节点流上,对读写的数据提供了缓冲的功能,提高了读写的效率,同时增加了一些新的方法。
九、转换流:
转换流提供了在字节流和字符流之间的转换。
InputStreamReader和OutputStreamWriter。
InputStreamReader需要套接在InputStream对象上操,
OutputStreamWriter需要套接在OutputStream对象上操作
构造方法:
InputStreamReader(InputStream)
InputStreamReader(InputStream,String charsetName)
OutputStreamWriter(OutputStream)
OutputStreamWriter(OutputStream,String charsetName)
转换流通常在操作系统非默认的字符(并且明确知道文件的字符编码)编码文件时使用。
十、流的关闭
流的对象是不作为 Java 虚拟机垃圾回收处理的对象的,所以需要手动关闭流。
流的对象在使用完之后必须调用流对象的 close()方法来关闭流,释放堆内存(heap)。
十一、为什么Gc回收不了流对象?
垃圾回收是Java中自动内存管理的另一种叫法。垃圾回收的目的是为程序保持尽可能多的可用堆(heap)。 JVM会删除堆上不再需要从堆引用的对象。
Gc是主要清理内存,但close方法还要释放掉一些系统资源,比如硬盘读写所使用的资源。如果没有close,程序还是在运行,Gc不把它当成垃圾,回收不了。
如果一个流不关闭会产生一些额外问题。比如说锁定了某种资源。如果你用流打开了一个文件,没有关闭的话,这个文件就不能再被操作。会提示有程序在操作这个文件。而且也会占 用系统句柄。
缓冲流的关闭 :关闭缓冲流,那么会自动关闭它所包装的底层节点流。
十二、字节流和字符流的应用
1.在处理视频,音频,图片等二进制数据文件是使用字节流。
2.在处理文本文件等字符文件时使用字符流。
十三、缓冲流通过减少调用本地 API 的次数来优化的输入和输出。
因为:
使用非缓冲 I/O。这意味着每次读或写请求是由基础 OS 直接处理。这可以使一个程序效率非常低下,因为每个这样的请求通常引发磁盘访问,网络活动,
或一些其它的操作,而这些是相对昂贵的。
十四、flush()方法:
1.在调用缓冲输出流的 write 方法时并没有把数据写入文件,而是从内存缓冲进入了输出流中,通过调用缓冲输出流的 flush 方法可以强制把输出流中的数据输出到文件中。
2.缓冲输出流调用 close 方法时会先进行 flush 操作再关闭流。
举例:
例一:输入流
package com.hpe.test2;import java.io.File;import java.io.FileInputStream;import java.io.IOException;public class TestInputStream { public static void main(String[] args) { File file = new File("src/abc.txt"); FileInputStream fis =null; try { fis=new FileInputStream(file); int b=0; while((b=fis.read())!=-1){ System.out.print((char)b); } } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ try { fis.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }}
例二:输出流
package com.hpe.test2;import java.io.File;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;public class TestOutputStream { public static void main(String[] args) { // TODO Auto-generated method stub String src = "http://www.mamicode.com/src/aaa.txt"; String target = "src/bbb.txt"; fileCopyByStream(src,target); fileCopyByStreamArray(src,target); } public static void fileCopyByStream(String srcFile,String targetFile){ File file=new File(srcFile); File file1 = new File(targetFile); FileInputStream fis =null; FileOutputStream fos=null; try { int b; fis = new FileInputStream(file); fos=new FileOutputStream(file1); while((b=fis.read())!=-1){ fos.write(b); } fos.flush(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ try { fis.close(); fos.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public static void fileCopyByStreamArray(String srcFile,String targetFile){ File file=new File(srcFile); File file1 = new File(targetFile); FileInputStream fis =null; FileOutputStream fos=null; try { int length; byte[] b=new byte[10]; fis = new FileInputStream(file); fos=new FileOutputStream(file1); while((length=fis.read(b))!=-1){ fos.write(b,0,length); } fos.flush(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); }finally{ try { fis.close();//关闭流 fos.close();//关闭流
} catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
例三:文件复制四种方法效率比较
package com.hpe.test2;import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;public class TestFileCopy { public static void main(String[] args) { // TODO Auto-generated method stub String src = "D:/aaa/abc.rar"; String target1 = "D:/bbb/cba1.rar"; String target2 = "D:/bbb/cba2.rar"; String target3 = "D:/bbb/cba3.rar"; String target4 = "D:/bbb/cba4.rar"; long start = System.currentTimeMillis(); fileCopyByStream(src,target1); long end = System.currentTimeMillis(); System.out.println("执行时间为" + (end - start) + "毫秒"); start = System.currentTimeMillis(); fileCopyByStreamArray(src,target2); end = System.currentTimeMillis(); System.out.println("执行时间为" + (end - start) + "毫秒"); start = System.currentTimeMillis(); fileCopyByBufferStream(src,target3); end = System.currentTimeMillis(); System.out.println("执行时间为" + (end - start) + "毫秒"); start = System.currentTimeMillis(); fileCopyByBufferStreamArray(src,target4); end = System.currentTimeMillis(); System.out.println("执行时间为" + (end - start) + "毫秒"); } public static void fileCopyByStream(String srcFile, String targetFile){ File file = new File(srcFile); File file1 = new File(targetFile); FileInputStream fis = null; FileOutputStream fos = null; try { fis = new FileInputStream(file); fos = new FileOutputStream(file1); int b = 0; while((b = fis.read()) != -1){// System.out.print((char)b); fos.write(b); } fos.flush(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { fis.close(); fos.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public static void fileCopyByStreamArray(String srcFile, String targetFile){ File file = new File(srcFile); File file1 = new File(targetFile); FileInputStream fis = null; FileOutputStream fos = null; try { fis = new FileInputStream(file); fos = new FileOutputStream(file1); int len = 0; byte[] b = new byte[1024]; while((len = fis.read(b)) != -1){// System.out.print((char)b); fos.write(b,0,len); } fos.flush(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { fis.close(); fos.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public static void fileCopyByBufferStream(String srcFile, String targetFile){ File file = new File(srcFile); File file1 = new File(targetFile); FileInputStream fis = null; FileOutputStream fos = null; BufferedInputStream bis = null; BufferedOutputStream bos = null; try { fis = new FileInputStream(file); fos = new FileOutputStream(file1); bis = new BufferedInputStream(fis); bos = new BufferedOutputStream(fos); int b = 0; while((b = bis.read()) != -1){// System.out.print((char)b); bos.write(b); } bos.flush(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { fis.close(); fos.close(); bis.close(); bos.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public static void fileCopyByBufferStreamArray(String srcFile, String targetFile){ File file = new File(srcFile); File file1 = new File(targetFile); FileInputStream fis = null; FileOutputStream fos = null; BufferedInputStream bis = null; BufferedOutputStream bos = null; try { fis = new FileInputStream(file); fos = new FileOutputStream(file1); bis = new BufferedInputStream(fis); bos = new BufferedOutputStream(fos); int len = 0; byte[] b = new byte[1024]; while((len = bis.read(b)) != -1){// System.out.print((char)b); bos.write(b,0,len); } bos.flush(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { try { fis.close(); fos.close(); bis.close(); bos.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }}
Java流知识总结详解