IO流

xiaoxiao2021-02-28  32

1.IO流

    在java中把不同的输入/输出源(键盘、文件、网络连接等)抽象表述为“流”,通过流的方式允许java程序使用相同的方式来访问不同的输入/输出源。

1.1流的分类

按照不同的分类方式,可以将流分为不同类型。

(1)输入流和输出流

按照流的流向来分,可以分为输入流和输出流。

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

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

这里的输入、输出都是从程序运行所在内存的角度来划分的。数据从内存到硬盘,通常称为输出流。

1.2字节流和字符流

    字节流和字符流的用法几乎完全一样,区别在于字节流和字符流所操作的数据单元不同。字节流操作的数据单元是8位的字节,而字符流操作的数据单元是16位的字符。

    字节流主要由InputStream和OutputStream作为基类,而字符流则主要由Reader和Writer作为基类。

1.3节点流和处理流

    可以从/向一个特定的IO设备(如磁盘/网络)读/写数据的流,称为节点流,节点流也被称为低级流。

    处理流用于对一个已存在的流进行连接或封装,通过封装后的流来实现数据读写功能。处理流也被称为高级流。(java使用处理流来包装节点流是一种典型的装饰器设计模式,通过使用处理流来包装不同的节点流,既可以消除不同节点流的实现差异,也可以提供更方便的方法来完成输入/输出功能。)

2.字节输出流OutputStream

OutputStream此抽象类,表示输出字节流所有类的父类,操作的数据都是字节。

2.1FileOutputStream

FileOutputStream类,即文件输出流,是用于将数据写入File的输出流。

构造方法:

2.2FileOutputStream写入数据到文件中

示例:

package com.xupt.fos; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class FileOutputStream01 { public static void main(String[] args) throws IOException { File file=new File("F:\\AAA\\aa.txt"); FileOutputStream fos=new FileOutputStream(file); fos.write("既然选择了远方,那么留给世界的只能是背影".getBytes()); fos.close(); } }

3.字节输入流InputStream

InputStream此抽象类,是表示字节输入流的所有类的父类,定义了字节输入流的基本共性功能方法。

    int read():读取一个字节并返回,没有字节返回-1.

    int read(byte[]): 读取一定量的字节数,并存储到字节数组中,返回读取到的字节数。

3.1FileInputStream

FileInputStream 从文件系统中的某个文件中获得输入字节。

构造方法:

3.2 FileInputStream读取数据

在读取文件中的数据时,调用read方法,实现从文件中读取数据。

(1)一次读取一个字节

示例:

package com.xupt.fos; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; public class FileInputStream01 { public static void main(String[] args) throws IOException { File file=new File("F:\\AAA\\a.txt"); FileInputStream fis=new FileInputStream(file); int len=0; while((len=fis.read())!=-1){ System.out.print((char)len); } fis.close(); } }

(2)一次读取一个字节数组

package com.xupt.fos; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; public class FileInputStream02 { public static void main(String[] args) throws IOException { File file=new File("F:\\AAA\\a.txt"); FileInputStream fis=new FileInputStream(file); byte[] b=new byte[1024]; int len=0; while((len=fis.read(b))!=-1){ System.out.println(new String(b,0,len)); } fis.close(); } }

3.3复制文件

方式一:

package com.xupt.fos; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; public class copyFile { public static void main(String[] args) throws IOException { File srcFile=new File("F:\\AAA\\a\\1.jpg"); File destFile=new File("F:\\AAA\\b\\1.jpg"); FileInputStream fis=new FileInputStream(srcFile); FileOutputStream fos=new FileOutputStream(destFile); int len=0; while((len=fis.read())!=-1){ fos.write(len); } fos.close(); fis.close(); } }

方式二:

package com.xupt.fos; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; public class copyFile02 { public static void main(String[] args) throws IOException { File srcFile=new File("F:\\AAA\\a\\2.jpg"); File destFile=new File("F:\\AAA\\b\\2.jpg"); FileInputStream fis=new FileInputStream(srcFile); FileOutputStream fos=new FileOutputStream(destFile); //定义一个缓冲区 byte[] b=new byte[1024]; int len=0; while((len=fis.read(b))!=-1){ //将数组中的指定长度的数据写入到输出流中 fos.write(b,0,len); } fos.close(); fis.close(); } }

4.字符输入流Reader

Reader是字符输入流的抽象父类,本身并不能创建实例来执行输入。

     read():读取单个字符并返回

     read(char[]):将数据读取到数组中,并返回读取的个数。

4.1FileReader

构造方法:

FileReader读取文本文件:

package com.xupt.reader; import java.io.FileReader; import java.io.IOException; public class FileReaderTest01 { public static void main(String[] args) throws IOException { FileReader fr=new FileReader("a.txt"); int len=0; while((len=fr.read())!=-1){ System.out.print((char)len); } fr.close(); } }

5.字符输出流Writer

Writer是字符输入流的抽象父类,其方法如下:

5.1FileWriter

构造方法:

FileWriter将中文写入文本文件中:

package com.xupt.writer; import java.io.FileWriter; import java.io.IOException; public class FileWriterTest01 { public static void main(String[] args) throws IOException { FileWriter fw=new FileWriter("a.txt"); fw.write("我可以等在这路口,不管你会不会经过"); fw.flush(); fw.close(); } } 写入字符到文件中,先进行流的刷新,再进行流的关闭。

5.2flush()和close()的区别

    flush():将流中的缓冲区缓冲的数据刷新到目的地中,刷新后,流还可以继续使用。

    close():关闭资源,但在关闭前会将缓冲区中的数据先刷新到目的地,否则丢失数据,然后在关闭流。流不可以使用。如果写入数据多,一定要一边写一边刷新,最后一次可以不刷新,由close完成刷新并关闭。

6.字符流复制文本文件

package com.xupt.copy; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; public class CopyFile { public static void main(String[] args) throws IOException { FileReader fr=new FileReader("a.txt"); FileWriter fw=new FileWriter("b.txt"); char[] c=new char[1024]; int len=0; while((len=fr.read(c))!=-1){ fw.write(c, 0, len); fw.flush(); } fw.close(); fr.close(); } }
转载请注明原文地址: https://www.6miu.com/read-2625622.html

最新回复(0)