IO-字节流

来源:互联网 发布:玉和颜去黑头 知乎 编辑:程序博客网 时间:2024/06/07 01:14

IO流的简介

         I/O类库中使用“流”这个抽象概念。Java对设备中数据的操作时通过流的方式。

表示任何有能力产出数据的数据源对象,或者是有能力接收对象。“流”屏蔽了实际的I/O设备中处理数据的细节。IO流用来处理设置之间的数据传输。设备是指硬盘、内存、键盘录入、网络等。

流按操作数据类型的不同分为两种:字节流与字符流。

流按流向分为:输入流,输出流。

字节流

         字节流的抽象基类

                   输入流:InputStream

                   输出流:OutputStream

InputStream是抽象类,需要通过实现类FileInputStream来创建对象。

package Demo;import java.io.File;import java.io.FileInputStream;import java.io.IOException;public class Demo {public static void main(String[] args) throws IOException {showContent("c:"+File.separatorChar+"test.txt");}private static void showContent(String path) throws IOException{//打开流FileInputStream fis=new FileInputStream(path);int len;//循环读取while((len=fis.read())!=-1){System.out.print((char)len);}//关闭流fis.close();}}

上面的demo的读取效率是比较慢的,因为它是一个一个字节读的,读完一个字节写一个字节。那么我们可以使用缓冲,进行循环读取,来提高效率。

我们新建一个byte数组,将数据先缓冲到数组中,然后读取数组中的数据。

package demo;import java.io.File;import java.io.FileInputStream;import java.io.IOException;public class io {public static void main(String[] args) throws IOException {//读取指定路径的文件File file=new File("c:\\test.txt");//构建输入流FileInputStream input=new FileInputStream(file);//定义缓冲数组byte[] byt=new byte[1024];int len=0;//将文件内容写入数组中并循环读取文件中的内容while((len=input.read(byt))!=-1){System.out.println(new String(byt,0,len));}//关闭输入流input.close();}}


OutputStream

OutputStream是抽象了,需要通过实现类FileOutputStream来创建对象。

package demo;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;public class io {public static void main(String[] args) throws IOException {//读取指定路径的文件File file=new File("c:\\test.txt");//构建输出流FileOutputStream fos=new FileOutputStream(file,true);fos.write('a');fos.write('b');fos.write(99);fos.close();}}

上面的是一个简单的字节输出的demo。注意:文件输出流的文件,如果文件已经存在,则不再创建该文件,如果存在,则不再创建(多级目录创建不成功)。FileOutputStream的第二个参数,是来控制新输出的字节是进行覆盖还是在文件末尾进行输出。true表示在文件末尾输出。write(int b)方法中,虽然接收的是int类型参数,但是输出的仍然是一个字节。

 

上面的demo是通过一个一个的进行字符输出,这样做事很繁琐的,那么为了提高效率,我们可以使用缓冲。

 

我们可以将数据保存到数组中,然后通过操作数组来提高效率。API文档中有一个write(byte[] b)方法,将字节数组中的内容写入输出流中

package demo;import java.io.File;import java.io.FileOutputStream;import java.io.IOException;public class io {public static void main(String[] args) throws IOException {//读取指定路径的文件File file=new File("c:\\test.txt");//构建输出流FileOutputStream fos=new FileOutputStream(file,true);//将输出内容转成字节数组byte[] byt="abcdefg".getBytes();fos.write(byt);fos.close();}}


字节缓冲流

         在上面的demo中,为了提高流的使用效率,自定了字节数组作为缓冲区,java专门提供了字节流缓冲来提高效率。BufferedInputStream和BufferedOutputStream。

BufferedInputStream和BufferedOutputStream类可以通过减少读写次数来提高输入和输出速度。它们内部有一个缓冲区,用来提高处理效率,起始内部也是封装了字节数组。

package demo;import java.io.BufferedInputStream;import java.io.BufferedOutputStream;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;public class io {public static void main(String[] args) throws IOException {FileInputStream input=new FileInputStream("c:\\test.txt");FileOutputStream out=new FileOutputStream("c:\\test1.txt",true);BufferedInputStream inputstream=new BufferedInputStream(input);BufferedOutputStream outputstream=new BufferedOutputStream(out);int len=0;while((len=inputstream.read())!=-1){outputstream.write(len);}inputstream.close();outputstream.close();}}

0 0
原创粉丝点击