【Java学习】Java IO-流概念理解和知识点总结
2016-08-03 22:49
405 查看
流概念的理解
分类:输入流
从磁盘或者设备中的文件中读取数据到内存中 -其中的数据就是流
输出流
从内存将数据读到文件中
看下图:
流的分类
按输入输出上面说过:流分为输入流和输出流
按传输单位
字节流:8位二进制文件:mp3 mp4等多媒体文件
字符流:16位二进制文件 :一般 txt文件
按功能
节点流:直接操作数据源(磁盘 或 文件)
过滤流:直接操作节点流的流,为节点流添加新的功能,使得节点流更加灵活
InputStream和OutputStream
这两个类是IO操作中最顶层的抽象类,提供一些基本的方法InputStream【又叫做字节输入流]】-read()OutputStream【又叫做字节输出流】-write();
close()-IO操作属于操作系统底层的操作,所以字节流使用完毕需要关闭
FileInputStream和FileOutputStream
InputStream和OutputStream的子类,可以对磁盘文件,网络连接,甚至于内存缓冲区FIleInputStream可以理解为:从文件读取字节的字节输入流
构造方法:
FileInputStream(File file)
FileInputStream(String path)
一般方法:
int read()-返回读到的下一个字节,若是到达文件末尾,返回-1;;<效率太低>
int read(Byte[] b)-将文件中的b.length个字节读入byte[] b中·,返回读入的字节数,读不到的时候返回-1;相当于添加了一个缓冲区;
FIleOutputStream可以理解为:向文件写入字节的字节输出流
构造方法:
FIleOutputStream(File file)
FIleOutputStream(String path)
FIleOutputStream(String path,boolean append)//append为true时,追加到最后一个字节的后面,否则覆盖整个文件内容
一般方法:
int write()-返回写入的下一个字节,若是到达文件末尾,返回-1;<效率太低>
int write(Byte[] b)-)-将内存中的b.length个字节写入入byte[] b中·,返回写入的字节数,写不到的时候返回-1;相当于添加了一个缓冲区;
int write(Byte[] b,int off,int len)和上面的类似,只是截取b中从off开始长为len的数据,比较常用,防止读入不需要的数据。
测试代码如下
public class demoStream { public static void main(String[] args) throws IOException { // TODO Auto-generated method stub FileInputStream fis=new FileInputStream("D:/wuhuan/java.txt"); FileOutputStream fos=new FileOutputStream("D:/javanew.txt"); //使用read() write(int i)方法 // int data; // while((data=fis.read())!=-1) // { // fos.write(data); // } //使用read(byte[] b) write(byte b,int off ,int len)和 write(byte[] b)方法 byte[] b=new byte[1024*1024]; int len=0; while((len=fis.read(b))!=-1) { // fos.write(b, 0, len); fos.write(b); } } }
最后通过测试,第一种方式使用了32300毫秒 第二种方式使用了16毫秒,明显单字节传输效率太低。
ByteArrayInputStream和ByteArrayOutputStream
由内存到内存的流的操作ByteArrayInputStream:字节数组输入流
将字节数组作为输入流
可以这样简单的理解:将内存中的字符串转化为字节数组,然后将字节数组中的元素一个个取出。(感觉好多余)
ByteArrayOutputStream:字节数组输出流 将字节数组作为输出流 但使用默认的构造函数时,会初始化一个32位的字节缓冲区,
一般的方法:
write(byte b)添加一个字节
write(byte[] b) 添加一个字节数组
writeTo(FileInputStream fis) 将字节数组输出流的数据输出到文件输出流中去 <个人理解:还是觉得很多余,完全可以替代,直接将字节数组byte[] b,使用 文件输出流的write(byte[] b)写入即可>
过滤流
字节过滤流-为底层的字节流提供扩展功能,对其进行封装过滤输入字节流 FilterInputStream
过滤输出字节流 FilterOutputStream
常用的过滤流
BufferInputStream/BufferOutputStream—缓冲区的处理
相当于为文件输入输出流包装了一个byte缓冲区,直接操作缓冲流对象就可以了
代码如下:
public class demoStream { public static void main(String[] args) throws IOException { // TODO Auto-generated method stub FileInputStream fis=new FileInputStream("D:/KuGou/Animals - Maroon 5.mp3"); FileOutputStream fos=new FileOutputStream("D:/javanew.mp3"); //缓冲输入输出流初始化 BufferedInputStream bis=new BufferedInputStream(fis); BufferedOutputStream bos=new BufferedOutputStream(fos); long time1=System.currentTimeMillis(); int data; while((data=bis.read())!=-1) { bos.write(data);//等待输入缓冲流中数据填满或数据填完,就写到输出流 } long time2=System.currentTimeMillis(); //缓冲流的close方法中包括了文件输入输出流的close方法 bis.close(); bos.close(); System.out.println(time2-time1); } }
- DataInputStream/DataOutputStream---基本数据的处理 将基本数据类型写入到文件流中去,代码如下:
public class DemoDataStream { public static void main(String[] args) throws IOException { String name="liukang"; char s='K'; int age=22; double weight=65; boolean flag=true; //写进去 DataOutputStream dos=new DataOutputStream(new FileOutputStream("D:/vari.txt")); dos.writeUTF(name); dos.writeInt(age); dos.writeDouble(weight); dos.writeBoolean(flag); dos.close(); //读出来 DataInputStream dis=new DataInputStream(new FileInputStream("D:/vari.txt")); //读的顺序要和写的顺序一样 System.out.println( dis.readUTF()); System.out.println(dis.readInt()); System.out.println(dis.readDouble()); System.out.println(dis.readBoolean()); dis.close(); } }
相关文章推荐
- 【学习日记】有关java的IO的知识点总结
- 【学习日记】有关java的IO的知识点总结
- 【Java学习】Java IO-File类的理解和总结
- Java学习笔记 --- IO理解总结
- Java之多线程流学习总结-知识点目…
- java零碎知识点总结 2:IO 流 --------2 RandomAccessFile
- java零碎知识点总结 2:IO 流 ------类型转换
- Java IO流学习总结八:Commons IO 2.5-IOUtils
- Java IO流学习总结八:Commons IO 2.5-IOUtils
- java中IO的基本知识点及其个人理解
- Java基础知识学习总结(一)---深入理解Java的接口和抽象类
- Spring MVC学习总结(一)---(一:基本概念和意义的理解)
- Java中的IO学习总结
- java IO 学习总结
- JAVA学习总结之IO/NIO概述
- Java基础学习总结(2)——流IO
- Java基础学习总结(71)——深入理解Java虚拟机内存
- Java基础学习总结(71)——深入理解Java虚拟机内存
- Java IO学习笔记总结
- Java IO知识点总结一(File类)