Java的学习之路Day11

                                      Day11

一、java中的流

1、java中将流分成了几个类别:高级流、低级流、字节流、字符流。其中低级流是直接和文件打交道的,直接操作文件;高级流操作低级流,对低级流进行封装,方便我们使用;字节流操作字节,一般字节流都会以Stream结尾;字符流操作字符。

字节读写流的爸爸:InputStream 读 爸爸  OutputStream 写 爸爸

字符读写流的爸爸:Reader 读 爸爸  Writer 写 爸爸

常见的字节流:-FileIntputStream;FileOutputStream;

                       -ObjectInputStream;ObjectOutputStream

                       -BufferedInputStream;BufferedOutputStream

常见的字符流:-InputStreamReader;OutputStreamWriter;(可以将这两个看成是一个转换流,他是将字节流转换为字符流)

                        -BufferedReader;PrintWriter;commons-io.jar

二、java流的操作

1、通过低级流来操作文件(FIS,FOS)

@Test
 public void test01() throws Exception {
	FileInputStream fis=new FileInputStream("李**.mp3");
	FileOutputStream fos=new FileOutputStream("李**_02.mp3");
	byte[] data=new byte[1024*10];
	int len=-1;
	System.out.println("开始复制");
	long start= System.currentTimeMillis();
	while((len=fis.read(data))!=-1) {
		fos.write(data,0,len);
	}
	System.out.println("复制结束");
	long end=System.currentTimeMillis();
	System.out.println("耗时:"+(end-start));
	fis.close();
	fos.close();

2、高级流通过低级流来实现文件的操作(BOS,BIS)

@Test
 public void test02() throws Exception {
	FileInputStream fis=new FileInputStream("李**_02.mp3");
	FileOutputStream fos=new FileOutputStream("李**_03.mp3");
	BufferedInputStream bis=new BufferedInputStream(fis);
	BufferedOutputStream bos=new BufferedOutputStream(fos);
	int len=-1;
	System.out.println("开始复制");
	while((len=bis.read())!=-1) {
		bos.write(len);
	}
	System.out.println("复制结束");
	
}

3、覆盖写,将文件里面的内容覆盖掉

@Test
public void test03() throws Exception {
	FileOutputStream fos=new FileOutputStream("arr.txt");
	BufferedOutputStream bos=new BufferedOutputStream(fos);
	String str="我爱李**,真的!";
	bos.write(str.getBytes());
	bos.close();
	
}

4、追加写,在文件里面添加内容

@Test
public void test04() throws Exception{
	FileOutputStream fos=new FileOutputStream("arr.txt",true);
	BufferedOutputStream bos=new BufferedOutputStream(fos);
	String str="美女,约吗?";
	bos.write(str.getBytes());
	bos.close();
	
}

5、printWrite 字符流的操作。它非常适合按行输出的文件操作

@Test
public void test05() throws Exception{
 	FileOutputStream fos=new FileOutputStream("李**.txt");
 	PrintWriter pw=new PrintWriter(fos);
 	pw.println("我爱李**");
 	pw.close();



}

想要多行追加则需要如下代码:

@Test
public void test05() throws Exception{
 	FileOutputStream fos=new FileOutputStream("李**.txt",true);
 	//自动行刷新,追加行数据,只有在第一个参数是流的情况下才可以传
 	//布尔类型,在print不是println时,需要手动刷新。
 	PrintWriter pw=new PrintWriter(fos);
 	pw.println("我是某某某");
 	pw.close();

6、按行读取文件的数据

@Test
public void test06() throws Exception{
	FileInputStream fis=new FileInputStream("src/dbConfig.txt");
	//它和OutputStreamReader一起,将字节流转换为字符流
	InputStreamReader isr=new InputStreamReader(fis);
	BufferedReader BR=new BufferedReader(isr);
	/*readLine()读取一行数据,读取到末尾返回值-1,但是有兼容性问题
	 * Windows默认为null
	 * Linux则是空指针异常
	 */
	String line="null";
	while((line=BR.readLine())!=null) {
		System.out.println(line);
	} 
按行读取文件时还可以截取自己想要的文件内容,但是必须要找到每行共有的属性,否则我也不知道
@Test
public void test06() throws Exception{
	FileInputStream fis=new FileInputStream("src/dbConfig.txt");
	//它和OutputStreamReader一起,将字节流转换为字符流
	InputStreamReader isr=new InputStreamReader(fis);
	BufferedReader BR=new BufferedReader(isr);
	/*readLine()读取一行数据,读取到末尾返回值-1,但是有兼容性问题
	 * Windows默认为null
	 * Linux则是空指针异常
	 */
	String line="null";
	while((line=BR.readLine())!=null) {
		//重新定义一个字符串,使用字符串的API来获取想要的字符串内容
		String str=line.substring(line.indexOf("=")+1);
		System.out.println(str);
	} 

三、序列化和反序列化

1、什么是序列化?序列化就是将数据结构转换成字节的过程。

2、什么是反序列化?反序列化就是将字节转化为数据结构的过程。

3、如何实现序列化?如果这个类需要序列化,那么它需要一个空的接口(implements Serializable ),需要给该类添加一个版本号,这个版本号非常重要,它影响着反序列化是否成功。

首先定义一个类:

package javaSEDay16_1;

import java.io.Serializable;

public class student implements Serializable{

	private static final long serialVersionUID = 1L;
     /*这个就是版本号,如果反序列化的时候的版本号和序列化的版本号
      * 不一致,那么反序列化就会失败。
      * 这个属于javaBean的规范
      * 1.属性的私有化
      * 2.对外提供公开的访问和修饰方法
      * 3.重写hashcode和equals方法
      * 4.重写tostring
      * 5.实现Serializable接口
      * 6.给类提供相应的版本号
      * 7.如果属性中有trainsient关键字修饰
      * 那么这个属相在序列化的时候会被排除
      */
	 /*反序列化和版本号的关系
	  * 如果在反序列化的时候,程序会先检查版本号,如果版本号和序列化的版本号不一致
	  * 那么就会抛出异常,如果版本号一直,就会启用兼容模式,在序列化中有属性就输出,
	  * 没有就用默认值替换
	  */
	  private String name;
	  private int age;
	public student() {
		super();
		// TODO Auto-generated constructor stub
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + age;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		student other = (student) obj;
		if (age != other.age)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}
	@Override
	public String toString() {
		return "student [name=" + name + ", age=" + age + "]";
	}
	public student(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}
	
}

然后进行序列化:

package javaSEDay16_1;

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

public class oos {
	/*
	 * 序列化
	 * 将一个学生对象转为字节,存储到硬盘上
	 */
   public static void main(String[] args) throws Exception {
	student stu=new student("周某人最帅",22);
	System.out.println(stu);
	FileOutputStream fos=new FileOutputStream("帅逼.txt");
	ObjectOutputStream oos=new ObjectOutputStream(fos);
	oos.writeObject(stu);
	oos.close();
	
}
}

接着在进行反序列化:

package javaSEDay16_1;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.ObjectInputStream;
/*
 * 反序列化,将字节转换为数据结构
 */
public class OIS {
	public static void main(String[] args) throws Exception {
		FileInputStream fis=new FileInputStream("帅逼.txt");
		ObjectInputStream ois=new ObjectInputStream(fis);
		/*
		 * 反序列化的方法
		 */
		student stu=(student) ois.readObject();
		System.out.println(stu);
	}
	}
	







评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值