您的位置:首页 > 编程语言 > Java开发

【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();
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: