【Java学习】Java IO-流概念理解和知识点总结
来源:互联网 发布:净水器推荐知乎 编辑:程序博客网 时间:2024/05/29 10:39
流概念的理解
分类:
输入流
从磁盘或者设备中的文件中读取数据到内存中 -其中的数据就是流输出流
从内存将数据读到文件中
看下图:
流的分类
按输入输出
上面说过:流分为输入流和输出流按传输单位
字节流: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缓冲区,直接操作缓冲流对象就可以了
代码如下:
- BufferInputStream/BufferOutputStream—缓冲区的处理
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学习】Java IO-流概念理解和知识点总结
- Java IO流知识点总结
- 【Java学习】Java IO-File类的理解和总结
- Java学习的基础概念和知识点
- Java中IO流知识点总结
- Java中IO流知识点总结
- java中IO流的知识点总结
- java中IO流的知识点总结
- java中IO流的知识点总结
- Java学习笔记 --- IO理解总结
- JAVA知识点总结-13IO
- Java IO流知识点
- 【学习日记】有关java的IO的知识点总结
- Java IO流学习总结
- Java IO流学习总结
- 【java】IO流学习总结
- Java IO流学习总结
- Java IO流学习总结
- namespace学习笔记
- 二分_D
- matlab简单神经网络示例
- Rundll32.exe文件详解(显示我的电脑 取消自动登录)
- 博客
- 【Java学习】Java IO-流概念理解和知识点总结
- 搜索学习笔记——DFS
- 19. Remove Nth Node From End of List
- 顺序表应用2:多余元素删除之建表算法
- 《匿名》第五课----项目架构
- oracle数据库
- PHP5新特性 trait
- 原型模式
- org.hibernate.hql.ast.QuerySyntaxException