欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

I/O 流

程序员文章站 2022-04-03 16:24:41
...

I/O操作的相似性

I/O输出处理是程序设计中非常重要的一部分,比如从键盘读取数据、从文件中读取数据或向文件中写数据等等。这些操作都有相似性,如:

控制台(console)——打印/读入

文件(file)——读/写

File类

File类是IO包中唯一代表磁盘文件本身信息的类,而不是文件中的内容;

File类定义了一些与平台无关的方法来操纵文件,例如;创建、删除文件和重命名文件。

流的抽象

Java把这些不同类型的输入、输出源抽象为流(stream),用统一接口来表示,从而使程序简单明了。

I/O 流


什么是流

流是一个很形象的概念,当程序需要读取数据的时候,就会开启一个通向数据源的流,这个数据源可以是文件,内存,或是网络连接。类似的,当程序需要写入数据的时候,就会开启一个通向目的地的流。这时候你就可以想象数据好像在这其中“流”动起来。

I/O 流


Java I/O流的分类

java.io 包中定义了多个流类型(类或抽象类)来实现输入/输出功能:可以从不同的角度对其进行分类;

按数据流的方向不同可以分为输入流和输出流;

按处理数据单位不同可以分为字节流和字符流;

按照功能不同可以分为节点流和处理流。

JDK所提供的所有流类型位于包java.io内,都分别继承自以下四种抽象流接口:

I/O 流


字节流(byte stream):一个字节(8-bit)一个字节读/写

字符流(character stream):一个字符一个字符读/写(具有特定字符编码的数据)

InputStream

继承自InputStream的流都是用于向程序中输入数据,且数据的单位为字节(8 bit)

InputStream基本方法

public abstract int read( ) throws IOException

读取一个字节并以整数的形式返回(0~255),如果返回-1表示到达输入流的结尾

public int read(byte[] buffer) throws IOException 

读取一系列字节并存储到一个数组buffer,返回实际读取的字节数,到末尾返回-1

public long skip(long n) throws IOException 

跳过n个字节不读,返回实际跳过的字节数

public void close( ) throws IOException

关闭流释放内存资源

读(Reading)

建立联系

选择流

操作流

关闭资源

代码实现示例:

     //1建立联系
       String path = "D:/Test/1.txt";
       File src = new File(path );
       //2选择流
       InputStream is = null;//提升作用域
       try {
        is = new FileInputStream(src );
        //3操作流,不断读取
        byte[] car = new byte[1024];
        int leg = 0;//接受实际读取的大小
        //循环读取
        while(-1!=(leg =is .read(car ))){
            String inf = new String(car,0,leg );
            System. out.println(inf );
        }     
    }
catch (FileNotFoundException e) {
        System. out.println("文件不存在" );
        e.printStackTrace();
    } catch (IOException e) {
         e.printStackTrace();
       System. out.println("文件读取失败" );
    }finally {
        try {
            //4.关闭资源
            is.close();
       } catch (IOException e ) {
            e.printStackTrace();
           System. out.println("关闭失败" );
       }
    }

文件处理

类FileInputStream和FileOutputStream用来进行文件I/O处理,由它们所提供的方法可以打开本地主机上的文件,并进行顺序的读/写。

OutputStream

继承自OutputStream的流都是用于程序中输出数据,且数据的单位为字节(8 bit)

OutputStream基本方法

public abstract void write(int b) throws IOException

向输出流中写入一个字节数据,该字节数据为参数b的第8位

public void write(byte[] data) throws IOException 

将一个字节类型的数组中的数据写入输出流

public void close( ) throws IOException 

关闭流释放内存资源

public void flush( ) throws IOException 

将输出流中缓存的数据全部写出到目的地

流的写出过程

写(Writing)

建立联系

选择流

输出

关闭流

代码实现示例:

File f = new File("D:" + File.separator+"test.txt");
OutputStream out=new FileOutputStream(f);//如果文件不存在会自动创建
//OutputStream out=new FileOutputStream(f,true);//追加内容
String str="Hello World";
byte[] b=str.getBytes();
out.write(b);//因为是字节流,所以要转化成字节数组进行输出
out.close();

字符流Reader

继承自Reader的流都是用于向程序中输入数据,且数据的单位为字符(2个字节)

Reader基本方法

public int read( ) throws IOException 
public int read(char[] text) throws IOException 
public long skip(long n) throws IOException 
public void close() throws IOException

流代码实现:

public static void main(String[] args) throws IOException {
		File f = new File("D:" + File.separator + "text.java");
		Reader input = new FileReader(f);
		int b=0;
		while((b=input.read())!=-1){
			System.out.println((char)b);
		}
		input.close();
	}

字符流Writer

继承自Writer的流都是用于程序输出数据,且数据的单位为字符(16 bit)

Writer基本方法

public void write(int c) throws IOException 
public void write(char[] text) throws IOException 
public void write(String string) throws IOException
public void flush(char[] text) throws IOException
public void close(char[] text) throws IOException

Writer代码实现示例:

public static void main(String[] args) throws IOException {
		File file = new File("D:/text.java");
		Writer w = new FileWriter(file);
		String str = "测试";
		w.write(str);
		w.close();
	}

节点流和处理流

I/O 流


节点流:可以从或向一个特定的地方(节点)读写数据。如:FileReader

处理流:是对一个已存在的流的连接和封装,通过所封装的功能调用实现数据读写。如:BufferedReader。处理流的构造方法总是要带一个其他的流对象做参数。一个流对象经过其他流的多次包装,称为流的链接。

常用的节点流

父类:InputStream、OutputStream、Reader、Writer

对文件进行处理的节点流

FileInputStream 、FileOutputStream 、FileReader、FileWriter

常用的处理流

父类:InputStream、OutputStream、Reader、Writer

缓冲流

BufferedInputStream、BufferedOutputStream

BufferedReader、BufferedWriter

需要父类作为参数构造,增加缓存功能,避免频繁读写硬盘,可以初始化缓冲数据的大小,由于带了缓冲功能,所以就写数据的时候需要使用flush方法。

转换流

InputStreamReader、OutputStreamWriter   要inputStream或OutputStream作为参数,实现从字节流到字符流的转换

通过处理流读数据到程序

第一步:创造一个字符流/字节流,直接操作文件

Reader in = new FileReader("G:/Book1.csv");

第二步:在节点流的基础上,套一个缓冲流,实现缓冲和按行读取

BufferedReader  reader = new BufferedReader(in);

第三步:读取

String line=null;

第四步:关闭流,有两种方式

1. 可以只关闭处理流,不用关闭节点流。处理流关闭的时候,会调用其处理的节点流的关闭方法

2. 关闭原则:先打开的后关闭,后打开的先关闭。否则会抛出异常

通过处理流写数据到文件

第一步:创造一个字符流/字节流,直接操作文件

Writer out = new FileWriter("G:/Book2.csv");

第二步:在节点流的基础上,套一个缓冲流,实现缓冲

BufferedWriter writer = new BufferedWriter(out);

第三步:写入

writer.write("ddddd");  换行的方法是writer.newLine();

第四步:写完之后,关闭之前,必须flush!

writer.flush();

第五步:关闭流,有两种方式

1. 可以只关闭处理流,不用关闭节点流。处理流关闭的时候,会调用其处理的节点流的关闭方法

2. 关闭原则:先打开的后关闭,后打开的先关闭。否则会抛出异常

中文乱码的解决方案

第一步:创造一个节点流/字符流,直接操作文件

InputStream file = new FileInputStream("G:/Book1.csv");

第二步:按照指定编码从字节流转化为字符流

InputStreamReader in = new InputStreamReader(file, "GBK");

第三步:在节点流的基础上,套一个缓冲流,实现缓冲和按行读取

BufferedReader  reader = new BufferedReader(in);

总结

父类:InputStream、OutputStream、Reader、Writer

对文件进行处理的节点流

FileInputStream 、FileOutputStream 、FileReader、FileWriter

处理流中的缓冲流

BufferedInputStream、BufferedOutputStream

BufferedReader、BufferedWriter

处理流中的转化流实现从字节到字符的转换

nputStreamReader、OutputStreamWriter









相关标签: IO流