IO基础加强 day06

---转换流       把字节流转为字符流(不存在字符流转字节流,因为字符流也属于字节流的一类,是对于字节流的增强方便操作中文,如果有字符流说明你是在操作中文,既然操作中文为什么要转成字节流呢)

public static void main(String[] args) throws Exception{
File f2 = new File("1.txt");
File f3 = new File("2.txt");

InputStream inputStream = new FileInputStream(f2);
OutputStream outputStream = new FileOutputStream(f3);
//将字节流丢入 InputStreamReader/OutputStreamWriter
                //就会返回一个Reader /Writer 的子类
                //第二个参数需要传入一个编码格式,根据项目本身编码来确定
                 System.out.println(System.getProperties().get("file.encoding"));//打印项目编码
Reader reader = new InputStreamReader(inputStream,"GBK");
Writer writer = new OutputStreamWriter(outputStream,"GBK");
char[] cbuf = new char[1024];
int i = -1;
while((i=reader.read(cbuf))!=-1){
System.out.println(cbuf);
writer.write(cbuf,0,i);
}
reader.close();
writer.close();
}

---字节合并流 

public static void main(String[] args) throws Exception{
//合并流  也成为顺序流  将两个流合并为一个流(注意只能合并两个InputStream )
File f2 = new File("1.txt");
File f3 = new File("2.txt");
//操作流程很简单跟普通流一样
//构造器接收两个InputStream   或者Enumeration<? extends InputStream> e 一个字节流枚举集合
SequenceInputStream sis = new SequenceInputStream(new FileInputStream(f2), new FileInputStream(f3));
byte[] by = new byte[1024];
int len = -1;
while((len=sis.read(by))!=-1){
System.out.println(new String(by,0,len));
}

}

---IO对对象的序列化操作

public static void main(String[] args) throws Exception{
/*序列化    为什么要做序列化
在分布式系统中需要共享的javaBean(需要在网络上传输)都需要做序列化
存储在HttpSession中的对象都应该实现序列化接口因为需要在网络中传输
服务钝化:如果服务器发现某些对象好久都没有活动了,此时服务器就会把这些内存中的
对象持久化在本地磁盘文件中javaBean-->二进制文件
等到这些对象需要活动时,先在内存中查找,找不到再去磁盘中获取  二进制文件-->javaBean对象
需要序列化的类必须实现Serializable接口
底层会判断该类是否为Serializable 的示例,如果是才能序列化  instanceOf
在java中大多数类都实现了Serializable 接口
*/
//objectOutPutStream   objectInPutStream
File f = new File("1.txt");
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(f));
oos.writeObject(new Student("小明", 12));
oos.close();
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(f));
Student student = (Student)ois.readObject();
System.out.println(student);
ois.close();

}

瞬态修饰符

                /*
* 理论上来说静态和顺泰的字段是无法做序列化的(但是实际上是可以的)
* transient private String pwd;(表示瞬态的字段是无法做序列化的)
* 例如一些隐私的字段我们不希望别人可以做反序列化
* 注意:反序列化的时候必须存在该对象的字节码    但是往往随着系统升级我们的javaBean
* 的属性方法等也会升级,这时之前存储的对象字节码就不再存在就会报错java.io.InvalidClassException
* 提供一个固定序列化版本号private static final long serialVersionUID = -127009957464465277L;
*/
//objectOutPutStream   objectInPutStream
File f = new File("1.txt");
ObjectInputStream ois = new ObjectInputStream(new FileInputStream(f));
Student student = (Student)ois.readObject();
System.out.println(student);

ois.close();

扫描二维码关注公众号,回复: 2726496 查看本文章

---IO输出流    操作简单好用

public static void main(String[] args) throws Exception{
//打印流printStream/printWrite(只有输出流) 
// ps:printStream不需要手动调用flush()方法,而printWrite需手动刷新
//或者使用另外一个new PrintStream(new FileOutputStream("1.txt"),true)
//再或者使用ps.println()时候会刷新流
PrintStream ps = new PrintStream(new FileOutputStream("1.txt"),true);
ps.write("1".getBytes());
ps.print(true);
ps.print("assaf");
ps.print("123");
ps.close();
PrintWriter ps2 = new PrintWriter(new FileOutputStream("1.txt"),true);
ps2.write("1");
ps2.print(true);
ps2.print("assaf");
ps2.print("123");
ps2.close();
//使用打印流输出操作会特别简单因为在打印流中提供了print()和println()方法

//可以打印各种类型的数据就像System.out.println();

                PrintStream out = System.out;//System.out本身就是一个打印输出流

out.println("xxxxx");

                格式化输入

               System.out.printf("姓名:%s,年龄:%s", new Object[]{"xx",123});

}

猜你喜欢

转载自blog.csdn.net/qq_39205291/article/details/80587657