Java IO流之(转换流 缓冲流 序列化流 过渡类 打印流 配置文件)

转换流

  • 使用转换流来设置文件的编码,使文件的读取更方便
  • 解决乱码问题
  • 转换流使字节和字符之间的桥梁
  • InputStreamReader是字节通过字符流的桥梁,把字节流转成字符流。
  • outputStreamWriter是字符通过字节流的桥梁,把字符流转成字节流。
    在这里插入图片描述
    在这里插入图片描述
  • 读取 InputStreamReader
    构造方法
InputStreamReader(InputStream in) 
创建一个使用默认字符集的InputStreamReader。  

InputStreamReader(InputStream in, String charsetName) 
创建一个使用命名字符集的InputStreamReader。  
charsetName:表示指定的字符编码,可以使用指定的字符编码来实现编码的转换

常用方法

int read(char[] cbuf) 
将字符读入数组。  

乱码文件

//读文件(utf-8 ->ansi->utf-8)
		FileReader fr=new FileReader("E:/c.txt");
	    //缓冲区
		char []chars=new char[2];
		int len;
		while((len=fr.read(chars))!=-1) {
			System.out.print(new String(chars,0,len));
		}

在这里插入图片描述

//创建读取转换流 InputStream是个抽象类,字节流FileInputStream 是它的子类  
		InputStreamReader isr=new InputStreamReader(new FileInputStream("E:/c.txt"));
		//缓冲区
		char[] chars =new char[2];
		int len;
		while((len=isr.read(chars))!=-1) {
			System.out.println(new String(chars,0,len));
		}
		isr.close();
  • OutputStreamWriter
OutputStreamWriter(OutputStream out) 
创建一个使用默认字符编码的OutputStreamWriter。  

OutputStreamWriter(OutputStream out, String charsetName) 
创建一个使用命名字符集的OutputStreamWriter。  
charsetName指定编码格式

	OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("E:/c.txt"),"gbk");
		osw.write("计算机");
		osw.close();

输出可以指定编码格式

缓冲流(高效流)

  • 通过对字符流、字节流的封装/包装,提高io流的读写速度

  • 一般还是用:FileReader,FileWriter,FileInputStream,FileOutputStream;但是遇到增强流的时候,就使用缓冲流,读取的时候,是一行一行的读取
    在这里插入图片描述

  • 缓冲字符流:
    BufferedReader:缓冲字符输入流
    BufferedWriter:缓冲字符输出流

  • 缓冲字节流:
    BufferedInputStream:缓冲字节输入流
    BufferedOutputStream:缓冲字节输出流

BufferedReader:缓冲字符输入流
BufferedReader(Reader in) 
创建使用默认大小的输入缓冲区的缓冲字符输入流

BufferedReader(FileReader)

String readLine() 
读一行文字。  
包含行的内容的字符串,不包括任何行终止字符,如果已达到流的末尾,则为null 
BufferedReader br=new BufferedReader(new FileReader("E:/b.txt"));
		String line;
		while((line=br.readLine())!=null) {
			System.out.println(line);
		}
		br.close();

BufferedWriter:缓冲字符输出流
BufferedWriter(Writer out) 
创建使用默认大小的输出缓冲区的缓冲字符输出流。 

BufferedWriter(FileWriter)

void newLine() 
写一行行分隔符,跟\n是一样的效果,可以跨平台使用,windows,linux都可以使用  

使用缓冲流复制文件

//使用缓冲流复制文件
		BufferedReader br=new BufferedReader(new FileReader("E:/a.txt"));
		BufferedWriter bw=new BufferedWriter(new FileWriter("cpoy.txt"));
		
		String line;
		while((line=br.readLine())!=null) {
			bw.write(line);//一次读一行
			bw.newLine();//读完一行换行
			bw.flush();
		}
		System.out.println("写入成功");
		bw.close();
		br.close();
  • 缓冲字节流输入流BufferedInputStream
BufferedInputStream(InputStream in) 
创建一个 BufferedInputStream并保存其参数,输入流 in ,供以后使用。  
BufferedInputStream(InputStream in, int size) 
创建 BufferedInputStream具有指定缓冲区大小,并保存其参数,输入流 in ,供以后使用。  

  • 缓冲字节输出流
BufferedOutputStream(OutputStream out) 
创建一个新的缓冲输出流,以将数据写入指定的底层输出流。  
BufferedOutputStream(OutputStream out, int size) 
创建一个新的缓冲输出流,以便以指定的缓冲区大小将数据写入指定的底层输出流。  

使用缓冲流复制音乐文件

package com.m.demo;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class Test2 {

	public static void main(String[] args) {
		BufferedInputStream bis=null;
		BufferedOutputStream bos=null;
		try {
			bis=new BufferedInputStream(new FileInputStream("F:/01.mp3"));
			bos=new BufferedOutputStream(new FileOutputStream("copy.mp3"));
			byte [] bytes=new byte[1024];
			int len;
			while((len=bis.read(bytes))!=-1) {
				bos.write(bytes,0,len);
				bos.flush();
			}
			System.out.println("复制成功");
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			try {
				if(bos!=null) {
					bos.close();
				}
				if(bis!=null) {
					bis.close();
				}
				
				
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
		}		

	}

}

序列化流

在普通流里面是不可以直接保存基本数据类型和对象

而序列化流专门用来保存对象到文件中

  • 什么是对象的序列化
    实际上,java程序中的数据本来是不能脱离程序的,想把对象保存到文件中,在需要重新获取对象的时候,再把对象从文件读取出来。

就是把java程序中的对象写入到文件中存储,这个过程叫做对象的序列化,把对象写入到文件:对象字节输出流:ObjectOutputStream

  • 什么是对象的反序列化
    就是把文件中的对象,加载到java程序中继承使用,这个过程叫做对象的反序列化,把对象读取到内存中:对象字节输入流:ObjectInputStream

  • 总结
    对象的序列化:就是将对象转化为字节序列,保存到文件中
    对象的反序列化:就是把字节序列转换为对象,读到内存中

  • 对象序列化的用途
    1、把对象保存到硬盘中,永久保存
    2、把网络传输中,可以使用序列化来传递对象
    网络编程:TCP编程,把对象通过客户端传递到服务器上使用,或者是交互,使用序列化完成

  • 序列化和反序列化的前提

  • ObjectOutputStream
    对象字节输出流(FileOutputStream)

构造方法
ObjectOutputStream(OutputStream out) 
创建一个写入指定的OutputStream的ObjectOutputStream。 
主要方法
void writeObject(Object obj) 
将指定的对象写入ObjectOutputStream。  
对象序列化步骤
1、必须实现序列化接口:Serializable,序列化接口没有任何内容
package com.m.demo2;

import java.io.Serializable;

public class Person implements Serializable {
	private String name;
	private int age;
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	

}

package com.m.demo2;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;

public class Test {

	public static void main(String[] args) throws FileNotFoundException, IOException {
		ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("a.txt"));
		oos.writeObject(new Person("张三",12));
		oos.close();
		

	}

}

  • ObjectInputStream 反序列化
    对象的反序列化:就是把字节序列转换为对象,读到内存中
构造方法
ObjectInputStream(InputStream in) 
创建从指定的InputStream读取的ObjectInputStream。 
常用方法
Object readObject() 
从ObjectInputStream读取一个对象。  

在使用eclipse会出现读取失败的问题,这是因为serialVersionUID不同,在使用序列化和反序列化时,需要保证serialVersionUID一致。
在类中,添加serialVersionUID,创建类后,实现Serializable接口,person下会出现小黄线,第一个是默认的UID第二个会生成哈希字段。

package com.m.demo2;

import java.io.Serializable;

public class Person implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = -8959568670833292965L;
	
	private String name;
	private int age;
	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	@Override
	public String toString() {
		return "Person [name=" + name + ", age=" + age + "]";
	}
	
	

}

package com.m.demo2;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;

public class Test {

	public static void main(String[] args) throws Exception {
//		ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("a.txt"));
//		oos.writeObject(new Person("张三",12));
//		oos.close();
		ObjectInputStream ois = new ObjectInputStream(new FileInputStream("a.txt"));
		Object obj=ois.readObject();
		Person p=(Person)obj;
		System.out.println(p);
		ois.close();

	}

}

在修改类里面的字段或方法也会导致版本问题,所以必须加上UID!!!

过度类(DataInputStream DataOutputStream)

主要用来读写基本数据类型

打印流

可以提高写速度,方便写(只有写!!!!没有读!!!!)
字节打印流:PrintStream
字符打印流:PrintWriter

  • 字符打印流:PrintWriter
PrintWriter(File file) 
使用指定的文件创建一个新的PrintWriter,而不需要自动的线路刷新。  
PrintWriter(File file, String csn) 
使用指定的文件和字符集创建一个新的PrintWriter,而不需要自动进行线条刷新。  
PrintWriter(OutputStream out) 
从现有的OutputStream创建一个新的PrintWriter,而不需要自动线路刷新。  
PrintWriter(OutputStream out, boolean autoFlush) 
从现有的OutputStream创建一个新的PrintWriter。  
PrintWriter(String fileName) 
使用指定的文件名创建一个新的PrintWriter,而不需要自动执行行刷新。  
PrintWriter(String fileName, String csn) 
使用指定的文件名和字符集创建一个新的PrintWriter,而不需要自动线路刷新。  
PrintWriter(Writer out) 
创建一个新的PrintWriter,没有自动线冲洗。  
PrintWriter(Writer out, boolean autoFlush) 
创建一个新的PrintWriter。  

PrintWriter pw=new PrintWriter(new FileWriter("a.txt"),true);
	pw.println("abc");//ln 自带刷新缓冲区
	pw.println("123");
	pw.print("456");//不自带刷新
	pw.flush();

配置文件

在项目运行过程中,需要读取一些关键性的信息,将信息保存在文件中,这些文件叫做配置文件
格式:.xml .properties
1、以.properties后缀
2、内容以key=value的方式保存,类似Map集合
3、井号#表示注释
4、一般放在src文件下

  • Properties类
String getProperty(String key) 
使用此属性列表中指定的键搜索属性。  
Object setProperty(String key, String value) 
致电 Hashtable方法 put 。  
它是保存在对象中
   Properties pp=new Properties();
	pp.setProperty("usn", "abc");
	System.out.println(pp.getProperty("usn"));
void store(OutputStream out, String comments) 
将此属性列表(键和元素对)写入此 Properties表中,以适合于使用load(InputStream)方法加载到 Properties表中的格式输出流。   

void load(InputStream inStream) 
从输入字节流读取属性列表(键和元素对)。  
	Properties pp=new Properties();
	pp.setProperty("usn", "123");//先设置,后存储
	pp.store(new FileWriter("src\\db.properties"), null);
	pp.load(new FileReader("src\\db.properties"));
	System.out.println(pp.getProperty("usn"));
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值