700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > IO流1(字节流+字符流+输入流+输出流+节点流+处理流)

IO流1(字节流+字符流+输入流+输出流+节点流+处理流)

时间:2021-05-17 12:10:29

相关推荐

IO流1(字节流+字符流+输入流+输出流+节点流+处理流)

一(IO流简介)

大多数应用程序都需要实现与设备间的数据传输,如键盘输入数据、显示器显示程序运行的结果等。在Java中,将这种通过不同输入输出设备之间的数据传输抽象表述为“流”,程序允许通过流的方式与输入输出设备进行数据传输。

二(IO流分类)

1.根据流操作的数据单位不同分为:字节流+字符流

字节流:以字节为单位进行数据的读写,每次读写一个或多个字节数据,可以用于操作任何文件。

字符流:以字符为单位进行数据的读写,每次读写一个或多个字符数据,操作中文字符串方便(如记事本读写的时候)。

字节流一般用于处理非文本文件(.jpg .mp3 .mp4 .zip .rar等)。

字符流一般用于处理文本文件(.txt .java .c等)

2.根据流传输的方向不同分为:输入流+输出流

输入流:只能从流中读取数据,而不能向其写入数据。

输出流:只能从流中写入数据,而不能向其写读取数据。

注意:输入输出都是以程序为参照物

3.根据流的功能不同分为节点流和处理流

节点流:也被称为“低级流”,可以从一个特定的I/O设备读写数据的流,只能直接连接数据源,进行数据的读写操作。

处理流:也被称为“高级流”,用于对一个已存在的节点流或处理流进行连接与封装,通过封装后的流来提高流的读写能力。当使用处理流时,程序不会直接连接到实际的数据源,而是连接到已存在的流之上。

文件流(File流)是属于节点流的一种,程序用于直接操作目标文件所对应的类即文件流。

缓冲流(Buffered流)是属于处理流的一种,有缓冲字节输入流BufferedInputStream 、缓冲字节输出流BufferedOutputStream、缓冲字符输入流BufferedReader、缓冲字符输出流BufferedWriter

Java中的IO流是定义在java.io包中,有4个抽象类是流的顶级类:InputStream(字节输入流)和OutputStream(字节输出流),Reader(字符输入流)+Writer(字符输出流)。

三(字节流)

在计算机中,无论是文本、图片、音频还是视频。都是以二进制(字节)形式存在的,I/O流针对字节的输入输出提供了一系列的流,统称为字节流。在JDK中,提供了2个抽象类InputStream和OutputStream,是字节流的顶级父类,所有的字节输入流都继承自InputStream,所有的字节输出流都继承自OutputStream。

我们可以将InputStream看作一个输入管道,OutputStream看作一个输出管道,数据通过InputStream从源设备输入到程序,通过OutputStream从程序输出到目标设备,从而实现数据的传输,由此可见,IO流中的输入和输出都是针对程序而言的。

InputStream中的常用方法:

int read():从输入流中读取一个8位的字节,把它转为0-255之间的整数并返回,当没有可用字节时(即读取完所有字节)返回-1。

int read(byte[ ] b):从输入流中读取若干字节保存到参数b指定的字节数组中,返回的整数表示读取的字节数目。

int read(byte[ ] b,int off,int len):从输入流中读取若干字节保存到参数b指定的字节数组中,off指定字节数组开始保存数据的起始下标,len表示读取的字节数目。

void close( ):关闭此输入流并释放与该流关联的所有系统资源。

OutputStream的常用方法:

void write(int b):向输出流中写入一个字节。

void write(byte[ ] b):把参数b指定的字节数组的所有字节写到输出流。

void write(byte[ ] b,int off,int len):将指定byte数组从偏移量off开始的len个字节写入输出流

void flush():将当前输出流缓冲区(通常是字节数组)的数据强制写入目标设备,此过程称为刷新。

void close():关闭此输出流并释放与该流关联的所有系统资源。

针对文件的读写操作,JDK提供了2个类:FileInputStream(文件字节输入流)和FileOutputStream(文件字节输出流)。FileInputStream是InputStream的子类,是操作文件的字节输入流,专门用于读取文件中的数据。FileOutputStream是OutputStream的子类,是操作文件的字节输出流,专门用于把数据写入文件。

注意:在读取文件数据时,必须保证文件在相应的目录存在并且可读,否则会抛出java.io.FileNotFuondException(文件找不到的异常)

案例1:使用文件字节流来读取文件

package IO流;import java.io.FileInputStream;import java.io.IOException;public class Demo1 {public static void main(String[] args) throws IOException {//创建文件字节输入流来读取文件FileInputStream fit=new FileInputStream("src\\test.txt");//定义int类型的data来接收读取的字节int data=0;//通过循环来读取文件,当返回值为-1时结束循环while((data=fit.read())!=-1){//为了效果展示,将读取的字节强转为char字符System.out.print( (char) data);}//关闭字节输入流fit.close();}}

test.txt中的内容:

从text.txt中读取的内容:

案例2:使用文件字节流将数据写入文件

package IO流;import java.io.FileOutputStream;import java.io.IOException;public class Demo2 {public static void main(String[] args) throws IOException {//1.创建文件字节输出流FileOutputStream fos=new FileOutputStream("src\\out.txt");//2.将数据写入文件String str="FGHIJ";//调用getBytes()将字符串转为字节数组进行写入操作fos.write(str.getBytes());//3.关闭文件字节输出流fos.close();}}

需要注意的是,如果是通过FileOutputStream向一个已经存在的文件写入数据,该文件的原始数据会被清除,再写入新的数据。若希望在已存在的文件内容之后添加新内容,可以使用FileOutputStream的构造函数FileOutputStream (String filename,boolean append)来创建文件输出流对象,并把append参数的值设置为true。

接下来添加新数据到out.txt文件末尾:

package IO流;import java.io.FileOutputStream;import java.io.IOException;public class Demo3 {public static void main(String[] args) throws IOException {//1.创建文件字节输出流FileOutputStream fos=new FileOutputStream("src\\out.txt",true);//2.将新数据写进out.txt文件String str="KLMNO";fos.write(str.getBytes());//3.关闭文件字节输出流fos.close();}}

打开out.txt,内容显示为FGHIJKLMNO,说明成功将KLMNO添加到原数据FGHIJ的末尾。

案例3: 实现文件的拷贝(将src目录下的out.txt拷贝为新文件out_copy.txt)

package IO流;import java.io.FileInputStream;import java.io.FileNotFoundException;import java.io.FileOutputStream;import java.io.IOException;public class Demo4 {public static void main(String[] args) throws IOException {//1.创建文件字节输入流和输出流FileInputStream fis=new FileInputStream("src\\out.txt");FileOutputStream fos=new FileOutputStream("src\\out_copy.txt");//2.将数据读取和写入int data;while((data=fis.read())!=-1){fos.write(data);}//3.关闭文件字节输入流和输出流fis.close();fos.close();}}

可见成功的将src目录下的out.txt拷贝为新文件out_copy.txt。

四(字节流的缓冲区)

当通过流的方式拷贝文件时,为了提高传输效率,可以定义一个字节数组作为缓冲区。这样在拷贝文件时,就可以一次性的读取多个字节的数据,先将读取到的数据保存在字节数组中,再将字节数组中的数据一次性写入到新文件。

案例:使用缓冲区来实现文件的拷贝

package IO流;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;public class Demo5 {public static void main(String[] args) throws IOException {FileInputStream fis=new FileInputStream("src\\out.txt");FileOutputStream fos =new FileOutputStream("src\\out_copy1.txt");//使用字节数组来存储读取的数据byte[] b=new byte[10];int len=0;while((len=fis.read(b))!=-1){fos.write(b,0,len);}fis.close();fos.close();}}

五(字节缓冲流)

在I/O包中提供了2个带缓冲的字节流,分别是BufferedInputStream和BufferedOutputStream,它们的构造方法中分别接收InputStream和OutputStream类型的参数作为对象,在读写数据时提供缓冲功能。应用程序、缓冲流和底层字节流之间的关系如下图:

从上图可看出,应用程序是通过缓冲流来完成数据读写的,而缓冲流又是通过底层的字节流与设备进行关联的。

案例:使用字节缓冲流来实现文件的拷贝

package IO流;import java.io.*;public class Demo6 {//使用字节缓冲流实现out.txt的复制public static void main(String[] args) throws IOException {BufferedInputStream bi=new BufferedInputStream(new FileInputStream("src\\out.txt"));BufferedOutputStream bo=new BufferedOutputStream(new FileOutputStream("src\\out_copy2.txt"));byte[] b=new byte[10];int len=0;while((len=bi.read(b))!=-1){bo.write(b,0,len);bo.flush();}bi.close();bo.close();}}

六(字符流)

同字节流一样,字符流也有2个抽象的顶级父类:Reader和Writer,Reader是字符输入流,用于从某个源设备读取字符;Writer是字符输出流,用于向某个目标设备写入字符。FileReader和FileWriter用于读写文件,BufferReader和BufferWriter是具有缓冲功能的字符缓冲流,能够提高读写效率。

注意:在BufferedReader中有一个重要的方法readLine():该方法用于一次读取一行文本

案例:使用字符输入流来读取文件

package IO流;import java.io.FileReader;import java.io.IOException;public class Demo7 {public static void main(String[] args)throws IOException {//1.创建字符输入流FileReader fr=new FileReader("src\\example");//2.读取文件int len=0;while((len=fr.read())!=-1){System.out.print((char)len);}//3.关闭流fr.close();}}

案例:使用字符输出流将字符写入文件

package IO流;import java.io.FileWriter;import java.io.IOException;public class Demo8 {public static void main(String[] args) throws IOException {//1.创建字符输出流FileWriter fw=new FileWriter("src\\example.txt");//2.将字符内容写入文件fw.write("你不努力谁也救不了你!!!\n");fw.write("现在的努力是为了将来的幸福!!!\n");//3.关闭流fw.close();}}

FileWriter同FileOutputStream一样,如果指定的文件不存在,就会先创建文件,再写入数据;如果文件存在,会先清空文件的原有内容,在写入新数据。如果想在文件末尾添加数据,同样需要调用重载的构造方法FileWriter fw=new FileWriter("文件名",true)。

案例:使用字符流的缓冲区实现文件的拷贝

package IO流;import java.io.FileReader;import java.io.FileWriter;import java.io.IOException;public class Demo9 {public static void main(String[] args)throws IOException {//1.创建字符输入流和输出流FileReader fr=new FileReader("src\\example.txt");FileWriter fw=new FileWriter("src\\example_copy.txt");//2.读取和写入char[] c=new char[1024];int len=0;while((len=fr.read(c))!=-1){fw.write(c,0,len);}//3.关流fr.close();fw.close();}}

案例:使用字符缓冲流实现文件的拷贝

package IO流;import java.io.*;public class Demo10 {public static void main(String[] args)throws IOException {//1.创建字符缓冲输入流和输出流BufferedReader br=new BufferedReader(new FileReader("src\\example.txt"));BufferedWriter bw=new BufferedWriter(new FileWriter("src\\example_copy1.txt"));//2.读取和写入// String str=null;// //循环时每次读取一行文本,如果不为null(为null表示达到文件末尾),再继续循环// while((str= br.readLine())!=null){// bw.write(str);// //换行// bw.newLine();// }char[] c=new char[1024];int len=0;while((len=br.read(c))!=-1){bw.write(c,0,len);}//3.关流br.close();bw.close();}}

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。