一、常用的字节输入与字节输出流类

1.字节输出流OutputStream【顶级类】

public abstract class OutputStream
//不能被new

1.1、FileOutputStream类

定义:

public class FileOutputStream extends OutputStream

构造方法:

FileOutputStream(File file)

通过File对象创建一个不可追加的字节输出流

FileOutputStream(File file, boolean append)

通过File对象创建一个是否追加的字节输出流

FileOutputStream(String name)

通过String 对象创建一个不可追加的字节输出流

FileOutputStream(String name, boolean append)

通过String对象创建一个是否追加的字节输出流

例如:

package com.wangxing.test1;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
public class TestFileOutputStream1 {
	public static void main(String[] args) throws Exception{
		//FileOutputStream(File file) 通过File对象创建一个不可追加的字节输出流。 
		String path1="F:"+File.separator+"test"+File.separator+"info.txt";
		File  file1=new File(path1);
		FileOutputStream  out1=new FileOutputStream(file1);
		OutputStream  out11=new FileOutputStream(file1);
		//FileOutputStream(File file, boolean append) 通过File对象创建一个是否追加的字节输出流。
		FileOutputStream  out2=new FileOutputStream(file1,true);
		OutputStream  out22=new FileOutputStream(file1,true);
		//FileOutputStream(String name) 通过String 对象创建一个不可追加的字节输出流。  
		FileOutputStream  out3=new FileOutputStream(path1);
		OutputStream  out33=new FileOutputStream(path1);
		//FileOutputStream(String name, boolean append) 通过String对象创建一个是否追加的字节输出流
		FileOutputStream  out4=new FileOutputStream(path1,true);
		OutputStream  out44=new FileOutputStream(path1,true);
	}
}

实例方法:

void

write(byte[] b) 将 b.length个字节从指定的字节数组写入此文件输出流

void

write(byte[] b, int off, int len) 将 len字节从位于偏移量 off的指定字节数组写入此文件输出流

void

write(int b) 将指定的字节写入此文件输出流

void

close() 关闭此文件输出流并释放与此流相关联的任何系统资源

例如:

package com.wangxing.test1;

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;

public class TestFileOutputStream2 {

	public static void main(String[] args) throws Exception{
		//通过输出流 的写出方法将数据输出到文件中
		/*
		//void	write(byte[] b) 将 b.length个字节从指定的字节数组写入此文件输出流。
		//1准备需要写出的数据
		String info="hello,world";
		//2.创建字节输出流对象
		String path1="F:"+File.separator+"test"+File.separator+"info.txt";
		File file1=new File(path1); 
		FileOutputStream out1=new FileOutputStream(file1,true);
		//3.void	write(byte[] b) 将 b.length个字节从指定的字节数组写入此文件输出流。
		out1.write(info.getBytes());
		//4.关闭流
		out1.close();
		*/
		
		/*
		//void	write(byte[] b, int off, int len) 将 len字节从位于偏移量 off的指定字节数组写入此文件输出流。 
		//1准备需要写出的数据
		String info="hello,world";
		//2.创建字节输出流对象
		String path1="F:"+File.separator+"test"+File.separator+"info.txt";
		File file1=new File(path1); 
		FileOutputStream out1=new FileOutputStream(file1,true);
		//3.void	write(byte[] b, int off, int len) 将 len字节从位于偏移量 off的指定字节数组写入此文件输出流。 
		byte b[]=info.getBytes();
		out1.write(b,6,5);
		//4.关闭流
		out1.close();
		*/	
		//void	write(int b) 将指定的字节写入此文件输出流。 [执行一次只写出一个字节]
		//1准备需要写出的数据
		String info="hello,world";
		//2.创建字节输出流对象
		String path1="F:"+File.separator+"test"+File.separator+"info.txt";
		File file1=new File(path1); 
		FileOutputStream out1=new FileOutputStream(file1,true);
		//3.void	write(int b) 将指定的字节写入此文件输出流。 [执行一次只写出一个字节]
		byte bytearray[]=info.getBytes();
		for(byte b:bytearray) {
			out1.write(b);
		}
		//关闭流
		out1.close();
	}
}

运行结果:

Java 输出xml java 输出流_stream


  上面的字节输出流只能写出字节数组,不能直接写出基本数据类型的数据。

1.2 、DataOutputStream

定义:

public class DataOutputStream extends FilterOutputStream implements DataOutput

数据输出流使应用程序以便携式方式将原始Java数据类型写入输出流

构造方法:

DataOutputStream(OutputStream out)

创建一个新的数据输出流,以将数据写入指定的底层输出流

例如:

package com.wangxing.test2;

import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;

public class TestDataOutputStream1 {
	public static void main(String[] args) throws Exception{
		//DataOutputStream(OutputStream out) 创建一个新的数据输出流,以将数据写入指定的底层输出流。 
		String path1="F:"+File.separator+"test"+File.separator+"data.txt";
		File  file=new File(path1);
		//FileOutputStream out=new FileOutputStream(file);
		OutputStream out=new FileOutputStream(file);
		DataOutputStream  dout=new DataOutputStream(out);
	}
}

实例方法:

void

writeBoolean(boolean v) 将 boolean写入底层输出流作为1字节值

void

writeByte(int v) 将 byte作为1字节值写入底层输出流

void

writeChar(int v) 将 char写入底层输出流作为2字节值,高字节优先

void

writeFloat(float v) 浮子参数的转换 int使用 floatToIntBits方法在类 Float ,然后写入该 int值基础输出流作为一个4字节的数量,高字节

void

writeDouble(double v) 双参数传递给转换 long使用 doubleToLongBits方法在类 Double ,然后写入该 long值基础输出流作为8字节的数量,高字节

void

writeInt(int v) 将底层输出流写入 int作为四字节,高位字节

void

writeLong(long v) 将 long写入底层输出流,为8字节,高字节为首

void

writeShort(int v) 将 short写入底层输出流作为两个字节,高字节优先

void

writeUTF(String str) 使用 modified UTF-8编码以机器无关的方式将字符串写入基础输出流

void

flush() 刷新此数据输出流

void

close() 关闭此输出流并释放与此流相关联的任何系统资源

例如:

package com.wangxing.test2;

import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;

public class TestDataOutputStream2 {
	public static void main(String[] args) throws Exception{
		//DataOutputStream(OutputStream out) 创建一个新的数据输出流,以将数据写入指定的底层输出流。 
		String path1="F:"+File.separator+"test"+File.separator+"data.txt";
		File  file=new File(path1);
		//FileOutputStream out=new FileOutputStream(file);
		OutputStream out=new FileOutputStream(file,true);
		DataOutputStream  dout=new DataOutputStream(out);
		//void	writeInt(int v) 将底层输出流写入 int作为四字节,高位字节。 
		dout.writeInt(1001);
		//void	writeChar(int v) 将 char写入底层输出流作为2字节值,高字节优先。
		dout.writeChar('\t');
		//void	writeDouble(double v) 双参数传递给转换 long使用 doubleToLongBits方法在类 Double ,然后写入该 long值基础输出流作为8字节的数量,高字节。 
		dout.writeDouble(168.5);
		dout.writeChar('\t');
		//void	writeBoolean(boolean v) 将 boolean写入底层输出流作为1字节值。 
		dout.writeBoolean(true);
		dout.writeChar('\t');
		//void	writeUTF(String str) 使用 modified UTF-8编码以机器无关的方式将字符串写入基础输出流。 
		dout.writeUTF("zhangsan");
		//void	flush() 刷新此数据输出流。 
		dout.flush();
		dout.close();
		out.close();
	}
}

运行结果:

Java 输出xml java 输出流_输出流_02

2.字节输入流InputStream【顶级类】

定义:

public abstract class InputStream
//不能new

2.1、 FileInputStream

定义:

public class FileInputStream extends InputStream

构造方法:

FileInputStream(File file)

通过File对象创建一个字节输入流

FileInputStream(String name)

通过String对象创建一个字节输入流

例如:

package com.wangxing.test1;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
public class TestInputStream1 {
	public static void main(String[] args) throws Exception{
		//FileInputStream(File file) 通过File对象创建一个字节输入流
		String path1="F:"+File.separator+"test"+File.separator+"info.txt";
		File file1=new File(path1);
		FileInputStream  in1=new FileInputStream(file1);
		InputStream  in11=new FileInputStream(file1);
		//FileInputStream(String name) 通过String对象创建一个字节输入流
		FileInputStream  in2=new FileInputStream(path1);
		InputStream  in22=new FileInputStream(path1);
	}
}

实例方法:

int

read() 从该输入流读取一个字节的数据。 返回值:读取到的具体字节数据的int型,如果到达文件末尾返回-1

int

read(byte[] b) 从该输入流读取最多 b.length个字节的数据为字节数组。返回值:读取的总字节数, 如果到达文件末尾返回-1

void

close() 关闭此文件输入流并释放与流相关联的任何系统资源

例如:

package com.wangxing.test1;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
public class TestInputStream1 {
	public static void main(String[] args) throws Exception{
		//读取info.txt中的数据值到我们的程序中
		
		/*
		//创建被读取数据的文件路径
		String path1="F:"+File.separator+"test"+File.separator+"info.txt";
		//根据文件路径创建对应的Fiel对象
		File file1=new File(path1);
		//创建字节输入流对象
		InputStream  in1=new FileInputStream(file1);
		//int	read(byte[] b) 从该输入流读取最多 b.length个字节的数据为字节数组。
		//返回值:读取的总字节数, 如果到达文件末尾返回-1
		byte  bytearray[]=new byte[(int)file1.length()];
		int len=in1.read(bytearray);
		//关闭流
		in1.close();
		String info=new String(bytearray,0,len);
		System.out.println(info);
		*/
		
		//创建被读取数据的文件路径
		String path1="F:"+File.separator+"test"+File.separator+"info.txt";
		//根据文件路径创建对应的Fiel对象
		File file1=new File(path1);
		//创建字节输入流对象
		InputStream  in1=new FileInputStream(file1);
		//int	read()从该输入流读取一个字节的数据。 
		//返回值:读取到的具体字节数据的int型,如果到达文件末尾返回-1
		byte  bytearray[]=new byte[(int)file1.length()];
		//保存每一次读取的数据值
		int data=0;
		//数组下标
		int len=0;
		while((data=in1.read())!=-1) {
			bytearray[len]=(byte)data;
			len++;
		}
		//关闭流
		in1.close();
		String info=new String(bytearray,0,len);
		System.out.println(info);
	}
}

运行结果:

Java 输出xml java 输出流_java_03

2.2、DataInputStream

定义:

public class DataInputStream extends FilterInputStream implements DataInput

构造方法:

DataInputStream(InputStream in)

创建使用指定的底层InputStream的DataInputStream

例如:

package com.wangxing.test2;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
public class TestDataInputStream {
	public static void main(String[] args)throws Exception {
		//DataInputStream(InputStream in) 创建使用指定的底层InputStream的DataInputStream。
		String path1="F:"+File.separator+"test"+File.separator+"data.txt";
		File file=new File(path1);
		//FileInputStream  in=new FileInputStream(file);
		InputStream  in=new FileInputStream(file);
		DataInputStream  din=new DataInputStream(in);
	}

}

实例方法:

boolean

readBoolean()

byte

readByte()

char

readChar()

double

readDouble()

float

readFloat()

int

readInt()

long

readLong()

short

readShort()

String

readUTF()

void

close()

例如:

package com.wangxing.test2;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
public class TestDataInputStream {
	public static void main(String[] args)throws Exception {
		//DataInputStream(InputStream in) 创建使用指定的底层InputStream的DataInputStream。
		String path1="F:"+File.separator+"test"+File.separator+"data.txt";
		File file=new File(path1);
		//FileInputStream  in=new FileInputStream(file);
		InputStream  in=new FileInputStream(file);
		DataInputStream  din=new DataInputStream(in);
		//int	readInt() 
		int intvalue=din.readInt();
		//char	readChar() 
		char op1=din.readChar();
		//double	readDouble() 
		double doublevalue=din.readDouble();
		char op2=din.readChar();
		//boolean	readBoolean() 
		boolean booleanvalue=din.readBoolean();
		char op3=din.readChar();
		//String	readUTF() 
		String string=din.readUTF();
		din.close();
		in.close();
		System.out.println(intvalue);
		System.out.println(doublevalue);
		System.out.println(booleanvalue);
		System.out.println(string);
	}
}

运行结果:

Java 输出xml java 输出流_java_04

二、什么是序列化?如何实现序列化

  因为我们做操作的java对象可能需要在多台计算机之间传递。

  序列化 —> 将一个java对象转成2进制流数据过程。
  反序列化 —> 2进制流数据转换成一个java对象的过程。

如何实现序列化

  1.为被序列化的java对象的生成类实现一个序列化接口【Serializable】

public interface Serializable

特殊 ==> 该接口中一个方法都没有

  类的序列化由实现java.io.Serializable接口的类启用。 不实现此接口的类将不会使任何状态序列化或反序列化。 可序列化类的所有子类型都是可序列化的。

  2. 通过java提供ObjectOutputStream类的writeObject(Object obj)

2.1、ObjectOutputStream

构造方法

ObjectOutputStream(OutputStream out)

创建一个写入指定的OutputStream的ObjectOutputStream

实例方法

void

writeObject(Object obj) 将指定的对象写入ObjectOutputStream

将java对象序列化到记事本文件。

package com.wangxing.test1;
import java.io.Serializable;
public class Student implements Serializable{
	public void  testMethod() {
		System.out.println("这是Student类的实例方法");
	}
}
package com.wangxing.test1;
import java.io.File;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;

public class TestMain {

	public static void main(String[] args)throws Exception {
		Student  student=new Student();
		//ObjectOutputStream(OutputStream out) 创建一个写入指定的OutputStream的ObjectOutputStream。 
		String path1="F:"+File.separator+"test"+File.separator+"student.txt";
		File file=new File(path1);
		FileOutputStream  out=new FileOutputStream(file);
		ObjectOutputStream  objout=new ObjectOutputStream(out);
		objout.writeObject(student);
		objout.flush();
		objout.close();
		out.close();
	}
}

运行结果:

Java 输出xml java 输出流_redis_05

  将上面序列化到记事本文件中的java对象,反序列化回来成一个可使用的java对象。此时就需要ObjectInputStream类的Object readObject()方法读取对象。

2.2、ObjectInputStream

构造方法

ObjectInputStream(InputStream in)

创建从指定的InputStream读取的ObjectInputStream

实例方法

Object

readObject() 从ObjectInputStream读取一个对象

package com.wangxing.test1;

import java.io.File;
import java.io.FileInputStream;
import java.io.ObjectInputStream;

public class Test {

	public static void main(String[] args)throws Exception {
		//ObjectInputStream(InputStream in) 创建从指定的InputStream读取的ObjectInputStream。 
		String path1="F:"+File.separator+"test"+File.separator+"student.txt";
		File file=new File(path1);
		FileInputStream  in=new FileInputStream(file);
		ObjectInputStream  objin=new ObjectInputStream(in);
		Object  obj=objin.readObject();
		objin.close();
		in.close();
		Student stu=(Student)obj;
		stu.testMethod();
	}
}

运行结果:

Java 输出xml java 输出流_redis_06

总结

Java 输出xml java 输出流_redis_07