其他流
ByteArrayOutputStream:内存操作输出流
- 构造方法
public ByteArrayOutputStream(){}:构造一个默认的缓冲大小的输出流对象
- 成员方法
public byte[] toByteArray():将内存操作输出流中流对象---数组格式
ByteArrayInputStream:内存操作输入流
- 构造方法
public ByteArrayInputStream(byte[] buf):使用指定的字节数组作为缓冲区,构造
示例
public class ByteArrayStreamDemo {
//创建ByteArrayOutputStream
private static ByteArrayOutputStream baos = new ByteArrayOutputStream() ;
public static void main(String[] args) throws IOException {
write(baos) ;
read() ;
}
//将内存操作流
private static void read() throws IOException {
//public ByteArrayInputStream(byte[] buf)
//public byte[] toByteArray()
byte[] bytes = baos.toByteArray() ;
ByteArrayInputStream bais = new ByteArrayInputStream(bytes) ;
//读取数据
//一次读取一个字节/一个字节数组
int by = 0 ;
while((by=bais.read())!=-1) {
//展示
System.out.print((char)by);
}
bais.close();
}
//创建内存操作输出流,写入临时数据
private static void write(ByteArrayOutputStream baos) throws IOException {
//成员变量已经创建
//写入数据
for(int x = 0 ; x < 10 ; x ++) {
baos.write(("hello"+x).getBytes());
//字节流换行
//写入\r\n
baos.write("\r\n".getBytes());
}
//关闭资源
// baos.close();临时变量---随着方法完毕就消失了
}
}
PrintWriter:字符打印流
PrintWriter:能够操作文件(目标文件) – 字符输出流一种
- 构造方法:
//第二个参数为true:表示开启自动刷新功能
public PrintWriter(Writer out,boolean autoFlush)
public PrintWriter(String fileName):可以操作具体文件路径
- 成员方法
public void println(XXX x):可以换行
- 示例
public class PrintWriterDemo {
public static void main(String[] args) throws IOException {
//创建字符打印流对象
PrintWriter pw = new PrintWriter("pw.txt") ;
//打印数据并可以换行
pw.println("hello");
pw.println("world");
pw.println("java");
//刷新
pw.flush();
//关闭资源
pw.close();
}
}
合并流:SequenceInputStream
- 构造方法
//合并两个文件
public SequenceInputStream(InputStream s1,InputStream s2)
//两个以上的文件复制
public SequenceInputStream(Enumeration<? extends InputStream> e)
- 示例
将两个文件合并复制到目标文件中
public class SequenceStramDemo {
public static void main(String[] args) throws IOException{
InputStream s1 = new FileInputStream("Demo.java") ;
InputStream s2 = new FileInputStream("OutputStreamWriterDemo.java") ;
//创建合并流对象
SequenceInputStream sis = new SequenceInputStream(s1, s2) ;
//封装目标文件
FileOutputStream fos = new FileOutputStream("Copy.java") ;
//读写复制
// 一次读取一个字节数组
byte[] bytes = new byte[1024] ;
int len = 0 ;
while((len=sis.read(bytes))!=-1) {
fos.write(bytes,0,len);
}
//关闭资源
fos.close();
sis.close();
}
}
两个文件以上的复制
步骤:
- 创建 Vector集合对象
- 给添加多个InputStream对象
- Vector集合中:elements()---->Enumeration
- 读写复制
public static void main(String[] args) throws IOException{
//public SequenceInputStream(Enumeration<? extends InputStream> e)
//创建Vector集合对象
Vector<InputStream> v = new Vector<InputStream>() ;
//创建三个InputStream对象
InputStream s1 = new FileInputStream("OutputStreamWriterDemo.java") ;
InputStream s2 = new FileInputStream("Test.java") ;
InputStream s3 = new FileInputStream("Copy.java") ;
//添加到集合中
v.add(s1) ;
v.add(s2) ;
v.add(s3) ;
//获取类似于迭代器elements()-----iterator()
Enumeration<InputStream> en = v.elements() ;
//创建合并流对象
SequenceInputStream sis = new SequenceInputStream(en) ;
//封装目标文件
FileOutputStream fos = new FileOutputStream("d:\\CopyFileDemo.java") ;
//一次读取一个字节数组
byte[] bytes = new byte[1024] ;
int len = 0 ;
while((len=sis.read(bytes))!=-1){
//写
fos.write(bytes, 0, len);
}
//关闭
fos.close();
sis.close();
}
ObjectOutputStream
序列化:需要将网络中的数据/一些对象转成 “流数据”
- 构造方法
public ObjectOutputStream(OutputStream out)
- 成员方法:
public final void writeObject(Object obj):将指定的对象写入到序列化流中
ObjectInputStream
反序列化:将流数据----还原成Java对象/网络数据
- 构造方法
public ObjectInputStream(InputStream in)
- 成员方法
public final Object readObject():将流数据---还原成对象
- 示例
public class ObjectStreamDemo {
public static void main(String[] args) throws IOException, ClassNotFoundException {
//序列化
// write() ;
//反序列化
read() ;
}
//将流数据---还原成对象
private static void read() throws IOException, ClassNotFoundException {
//public ObjectInputStream(InputStream in)
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("oos.txt")) ;
//* public final Object readObject()
Object obj = ois.readObject() ;
System.out.println(obj);
//关闭
ois.close();
}
private static void write() throws IOException, IOException {
//public ObjectOutputStream(OutputStream out)
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("oos.txt")) ;
//写数据
Person p = new Person("张钰",23) ;
//public final void writeObject(Object obj)
oos.writeObject(p);
//释放资源
oos.close();
}
}
Properties
- Properties 类表示了一个持久的属性集 ,没有泛型(属性列表中的键和值都是String)
- 它继承自Hashtable<K,V> implements Map<K,V>
特有功能
public Object setProperty(String key, String value):添加键和值
public Set<String> stringPropertyNames():获取属性列表中的所有的键的集合
public String getProperty(String key):通过键获取值
public void load(Reader reader):将一些配置文件中的数据加载到属性集合类中
示例
在当前项目下user.txt文件 ,如果当前文件中lisi这个键,将它的值改为78,然后重新将值写入到user.txt文件(既要用到load(Reader r),还要用到store(Writer w,String comments))
public class PropertiesTest {
public static void main(String[] args) throws IOException {
// myStore() ;
myLoad() ;
}
//将某个文件中的内容加载到属性集合列表中
private static void myLoad() throws IOException {
//创建属性集合类对象
Properties prop = new Properties() ;
Reader r = new FileReader("user.txt") ;
prop.load(r);
//关闭资源
r.close();
System.out.println(prop);
}
//需要将属性列表中的数据保存到某个文件:当前项目下的name.txt中
private static void myStore() throws IOException {
//创建属性集合类对象
Properties prop = new Properties() ;
//添加数据
prop.setProperty("张三", "30") ;
prop.setProperty("李四", "40") ;
prop.setProperty("王五", "50") ;
//public void store(Writer writer, String comments)
prop.store(new FileWriter("names.txt"), "name's list");
System.out.println(prop);
}
}