Java基础-IO流读写详解

IO概述及分类

流是为数据源和目的地建立一个输送通道。

Java对数据的操作是通过流的方式,IO流用来处理设备之间的数据传输。

流按流向分为两种:

输入流:读入,从文件读入到内存。

输出流:写出,从内存写出到文件。

按处理数据单位不同分为 字节流、字符流     1字符 = 2字节 、 1字节(byte) = 8位(bit)  、 一个汉字占两个字节长度

  字节流:每次读取(写出)一个字节,当传输的资源文件有中文时,就会出现乱码。

  字符流:每次读取(写出)两个字节,有中文时,使用该流就可以正确传输显示中文。

字符流默认自带缓冲区内部维护了一个8192大小的缓冲区,是输出到缓冲区再读写, 节流默认没有缓冲区,是直接输的。但字节流和字符流都有提供缓冲流,用来提高读写性能的。

因为自带缓冲区,字符流只有在调用close()方法关闭缓冲区时,信息才输出。要想字符流在未关闭时输出信息,则需要手动调用flush()方法。

按功能不同分为 节点流、处理流

  节点流:以从或向一个特定的地方(节点)读写数据。能直接用来读写的流对象,如FileInputStream 

  处理流:是对一个已存在的流的连接和封装,对流对象的封装增强。如BufferedReader。处理流的构造方法总是要带一个其他的流对象做参数。   

 

流的选择和使用

首先看是读入还是写出,然后看文件类型选字节还是字符,字节流一般用来处理图像,视频,以及PPT,Word类型的文件。字符流一般用于处理纯文本类型的文件,如TXT文件等,字节流可以用来处理纯文本文件,但是字符流不能用于处理图像视频等非文本类型的文件。如果要在此基础上增强功能,那么就在处理流中选择一个合适的即可。

读写文件示例:

1.利用字符缓冲流(处理流)读写文本文件有三种方式:一次读写一个字符,一次读写一个字符数组,一次读写一行

BufferedReader br = new BufferedReader(new FileReader(srcFileName));
BufferedWriter bw = new BufferedWriter(new FileWriter(destFileName));

		//一次读写一个字符
		int ch;
		while((ch=br.read())!=-1) {
			bw.write(ch);
		}

        //一次读写一个字符数组
	    char[] chs = new char[1024];
	    int len;
	    while((len=br.read(chs))!=-1) {
			bw.write(chs,0,len);
	    }

		//一次读写一个字符串
		String line;
		while((line=br.readLine())!=null){
			bw.write(line);
			bw.newLine();
			bw.flush();
		}

        //释放资源
		bw.close();
		br.close();

2.利用字节流节点流复制图片有两种方式:一次读写一个字节,一次读写一个字节数组

//源
FileInputStream fis = new FileInputStream("图片.jpg");
//目标		
FileOutputStream fos = new FileOutputStream("d:\\图片.jpg");

		//一次读写一个字节
		int by;
		while((by = fis.read()) != -1) {
			fos.write(by);
		}

		//一次读写一个字节数组
		int len;//存储读到的字节个数
		byte[] bys = new byte[1024];
		while((len = fis.read(bys)) != -1) {
			fos.write(bys,0,len);
		}
		
		
		//释放资源
		fos.close();
		fis.close();

文件读写可以用节点流也可以用处理流,处理流中带有Buffered的流又称为缓冲流,缓冲流处理文件的输入输出的速度是最快的。所以一般缓冲流的使用比较多。

序列化

将保存在内存中的对象数据转化为二进制数据流进行传输,任何对象都可以序列化

实现方法:实现java.io.Serializable接口

把一个Java对象写入到硬盘或者传输到网路上面的其它计算机,这时我们就需要自己去通过java把相应的对象写成转换成字节流。

这时就用到了对象操作流:

ObjectInputStream 称为 反序列化流,利用输入流从文件中读取对象

ObjectOutputStream 称为 序列化流,利用输出流向文件中写入对象

示例:

package com.vrv;
import java.io.Serializable;
public class Student implements Serializable {

	String name;
	int age;
	
	public Student(String name,int age) {
		this.name = name;
		this.age = age;
	}

	@Override
	public String toString() {
		return "Student [name=" + name + ", age=" + age +"]";
	}
}

读写对象:

//对象存储到文件
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("D:\\a.txt"));
		
Student s = new Student("zhangsan",18);
oos.writeObject(s);
oos.close();

//从文件读取对象
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("D:\\a.txt"));
Student s =(Student)ois.readObject();
ois.close();

字符流与字节流转换

转换流的作用,文本文件在硬盘中以字节流的形式存储时,通过InputStreamReader读取后转化为字符流给程序处理,程序处理的字符流通过OutputStreamWriter转换为字节流保存。

OutputStreamWriter(OutStreamout):将字节流转换成字符流输出。

InputStreamReader(InputStream in):将字节流转换成字符流输入。

这两个流对象是字符体系中的成员,它们有转换作用,本身又是字符流,所以在构造的时候需要传入字节流对象进来。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值