一:IO流
1.合并流
构造方法1:
public SequenceInputStream(InputStream s1,InputStream s2)
示例:
//分别封装这个两个java文件
InputStream s1 = new FileInputStream("DataStreamDemo.java") ;
InputStream s2 = new FileInputStream("ByteArrayStreamDemo.java") ;
//创建合并流对象
SequenceInputStream sis = new SequenceInputStream(s1, s2) ;
//构造方法2
SequenceInputStream(Enumeration<? extends InputStream> e)
通过记住参数来初始化新创建的 SequenceInputStream,该参数必须是生成运行时类型为 InputStream 对象的 Enumeration 型参数。
Vector集合中Enumeration<E> elements() 返回此向量的组件的枚举。
示例:
InputStream s1 = new FileInputStream("DataStreamDemo.java") ;
InputStream s2 = new FileInputStream("ByteArrayStreamDemo.java") ;
InputStream s3 = new FileInputStream("CopyFileDemo.java") ;
//添加到集合中
v.add(s1) ;
v.add(s2) ;
v.add(s3) ;
//调用特有功能:
//public Enumeration<E> elements()
Enumeration<InputStream> en = v.elements() ;
//创建合并刘对象
SequenceInputStream sis = new SequenceInputStream(en) ;
2.数据输入/出流
//构造方法`
DataOutputStream(OutputStream out)
创建一个新的数据输出流,将数据写入指定基础输出流。
示例:
//DataOutputStream dos = new DataOutputStream(new FileOutputStream("dos.txt"));
DataInputStream(InputStream in)
使用指定的底层 InputStream 创建一个 DataInputStream。
示例:
//DataInputStream dis = new DataInputStream(new FileInputStream("dos.txt"));
常用方法:
void writeBoolean(boolean v)
将一个 boolean 值以 1-byte 值形式写入基础输出流。
void writeByte(int v)
将一个 byte 值以 1-byte 值形式写出到基础输出流中。
void writeBytes(String s)
将字符串按字节顺序写出到基础输出流中。
void writeChar(int v)
将一个 char 值以 2-byte 值形式写入基础输出流中,先写入高字节。
void writeChars(String s)
将字符串按字符顺序写入基础输出流。
void writeDouble(double v)
使用 Double 类中的 doubleToLongBits 方法将 double 参数转换为一个 long 值,然后将该 long 值以 8-byte 值形式写入基础输出流中,先写入+-------------------------------------------------------------------------------高字节。
void writeFloat(float v)
使用 Float 类中的 floatToIntBits 方法将 float 参数转换为一个 int 值,然后将该 int 值以 4-byte 值形式写入基础输出流中,先写入高字节。
void writeInt(int v)
将一个 int 值以 4-byte 值形式写入基础输出流中,先写入高字节。
void writeLong(long v)
将一个 long 值以 8-byte 值形式写入基础输出流中,先写入高字节。
void writeShort(int v)
将一个 short 值以 2-byte 值形式写入基础输出流中,先写入高字节。
void writeUTF(String str)
以与机器无关方式使用 UTF-8 修改版编码将一个字符串写入基础输出流。
3.内存操作输入/出流
内存操作输入流
//构造方法
ByteArrayInputStream(byte[] buf)
创建一个 ByteArrayInputStream,使用 buf 作为其缓冲区数组。
示例:
ByteArrayOutputStream baos = new ByteArrayOutputStream() ;
//创建内存操作输出流对象
byte[] buffer = baos.toByteArray() ;
//创建内存操作输入流对象
ByteArrayInputStream bais = new ByteArrayInputStream(buffer) ;
//常用方法
byte[] toByteArray()
创建一个新分配的 byte 数组。
int read()
从此输入流中读取下一个数据字节。
int read(byte[] b, int off, int len)
将最多 len 个数据字节从此输入流读入 byte 数组。
void close() (查看源码可知该方法为空方法,故可以不关闭)
关闭 ByteArrayInputStream 无效。
内存操作输出流
//构造方法
ByteArrayOutputStream()
创建一个新的 byte 数组输出流。
//常用方法
void write(byte[] b, int off, int len)
将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此 byte 数组输出流。
void write(int b)
将指定的字节写入此 byte 数组输出流。
4.打印流
特点:(1)打印流不能操作数据源,只能操作目的地的数据(对数据进行打印)
(2)自动刷新
(3)可以对文本文件进行操作
1.字节打印流
//构造方法
PrintStream(OutputStream out, boolean autoFlush)
创建新的打印流。
2.字符打印流
//构造方法
PrintWriter(Writer out, boolean autoFlush)
通过现有的 OutputStream 创建新的 PrintWriter。
参数autoFlush指定为true,自动刷新
//常用方法
void println(String x)
打印 String,然后终止该行。
void write(String s)
写入字符串。
5.随机访问流
//构造方法
public RandomAccessFile(String name, String mode)
参数一:指定该文件的路径
参数二:指定的一种模式:常用的模式:"rw",这种模式是可以读也可以写
常用方法:
long getFilePointer()
返回此文件中的当前偏移量。
6.标准输入输出流
输入流
in:----->InputStream is = System.in ;
键盘输入方式1
Scanner sc=new Scanner(System.in);
键盘输入方式2
BufferedReader br=new BufferedReader(new InputStreamReader(Ssytem.in));
输出流
out----->PrintStream ps = System.out ;
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
二:属性类
Properties:属性集合类,该类继承自Hashtable<K,V>,该类属于Map集合
//构造方法
public Properties():创建一个空属性列表
//常用方法
Object setProperty(String key, String value)
调用 Hashtable 的方法 put。
void store(Writer writer, String comments)
以适合使用 load(Reader) 方法的格式,将此 Properties 表中的属性列表(键和元素对)写入输出字符。
void load(Reader reader)
按简单的面向行的格式从输入字符流中读取属性列表(键和元素对)。
String getProperty(String key)
用指定的键在此属性列表中搜索属性。
三:序列化
如果一个类实现了标记接口:Serializable,那么对应的该类加载的时候,会产生一个ID
序列化和反序列化版本号不一致,会出现InvalidClassException
解决方法:
1)要么改动当前某个类中的数据之后,然后重新序列化和反序列化
这种做法不符实实际要求,在实际开发中,可能直接读数据:将流数据—>还原成对象
2)发现黄色警告线,点击它:生成一个固定ID
比如一个类中有很多成员变量,并不想让一些成员变量被序列化,Java提供了一个关键字:
transient:不用被序列化的时候用它修饰
对象----->>流对象
该对象所在的类一定要实现标记接口serializable