一、常用的字节输入与字节输出流类
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();
}
}
运行结果:
上面的字节输出流只能写出字节数组,不能直接写出基本数据类型的数据。
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();
}
}
运行结果:
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);
}
}
运行结果:
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对象可能需要在多台计算机之间传递。
序列化 —> 将一个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对象,反序列化回来成一个可使用的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();
}
}
运行结果:
总结