IO流中的其它流

IO流中的其它流

基本数据类型流

可以读写基本数据类型

数据输入流:DataInputStream
                  DataInputStream(InputStream in)
数据输出流:DataOutputStream
                 DataOutputStream(OutputStream out)
package com.sxt.otheriodemo;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;

/*
 * 可以读写基本数据类型
 *	数据输入流:DataInputStream
 *	                  DataInputStream(InputStream in)
 *	数据输出流:DataOutputStream
 *	                 DataOutputStream(OutputStream out) 
 *	                 
 *	 1.任意类型都是可以转换成字节数组写入到文件,所以写入基本数据类型一般都是一些关键性数据
 *	 2.一般通过这个流写入的数据,外界是无法读懂,可以将一些关键性数据持久化到文件中,提高数据保存的安全性
 *	 3.读取文件中的信息一定要按照写入的顺序读取,更加提高了安全性
 */
public class IODemo01 {
	public static void main(String[] args) throws Exception {
		// write();
		// read();
		read2();
	}
	private static void read2() throws Exception {
		DataInputStream dis = new DataInputStream(new FileInputStream("dos.txt"));
		dis.skipBytes(2);
		byte by = dis.readByte();
		short s = dis.readShort();
		int i = dis.readInt();
		long l = dis.readLong();
		float f = dis.readFloat();
		double d = dis.readDouble();
		boolean bool = dis.readBoolean();
		char ch = dis.readChar();
		System.out.println(by);
		System.out.println(s);
		System.out.println(i);
		System.out.println(l);
		System.out.println(f);
		System.out.println(d);
		System.out.println(bool);
		System.out.println(ch);
	}

	private static void read() throws Exception {
		DataInputStream dis = new DataInputStream(new FileInputStream("dos.txt"));
		int i = dis.readInt();
		System.out.println(i);
	}

	private static void write() throws Exception {
		DataOutputStream dos = new DataOutputStream(new FileOutputStream("dos.txt"));
		dos.write("99".getBytes());
		
		dos.writeByte(10);
		dos.writeShort(20);
		dos.writeInt(30);
		dos.writeLong(40);
		dos.writeFloat(50);
		dos.writeDouble(60);
		dos.writeBoolean(false);
		dos.writeChar('a');
		dos.close();
	}
}

打印流(万能输出流)

PrintWriter   字符流终极版

概述:向文本输出流打印对象的格式化表示形式。此类实现在 PrintStream 中的所有 print 方法。

特点:
1.只能写数据,不能读取数据。
2.可以操作任意类型的数据。
3.如果启动了自动刷新,能够自动刷新。

package com.sxt.otheriodemo;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

import com.sun.corba.se.spi.ior.Writeable;

/*
 * PrintWriter(字符流) PrintStream(字节流)
	概述:向文本输出流打印对象的格式化表示形式。此类实现在 PrintStream 中的所有 print 方法。
	特点:
	只能写数据,不能读取数据。
	可以操作任意类型的数据。
	如果启动了自动刷新,能够自动刷新。
	
	代码演示打印流复制文件内容
	
	PrintStream(字节流)
	1.具备写入到文件的功能  PrintStream(File file)  PrintStream(String fileName) 
	2.具备对流进行编码的功能 
			PrintStream(File file, String csn) 
			PrintStream(OutputStream out, boolean autoFlush, String encoding)
			PrintStream(String fileName, String csn) 
	3.具备装饰流的功能
			PrintStream(OutputStream out)
	4.具备自动刷新的功能 
			PrintStream(OutputStream out, boolean autoFlush) 
	5.具备字节流本身的功能
	6.自动换行 println
	
	PrintWriter(字符流)
	1.具备写入到文件的功能  
			PrintWriter(File file) 
			PrintWriter(String fileName) 
	2.具备对流进行编码的功能 
			PrintWriter(File file, String csn) 
			PrintWriter(String fileName, String csn) 
	3.具备装饰流的功能
			PrintWriter(Writer out) 
			PrintWriter(Writer out, boolean autoFlush) 
	4.具备自动刷新的功能 
			PrintWriter(OutputStream out, boolean autoFlush) 
			PrintWriter(Writer out, boolean autoFlush) 
			完成自动刷新的要求
				a.启动自动刷新
				b.调用 print println format printf
	5.具备字节流本身的功能
	6.具备转换流的功能
			PrintWriter(OutputStream out) 
			PrintWriter(OutputStream out, boolean autoFlush) 
	7.自动换行 println

	写入的方式
		1.print
		2.write
		3.format
		4.append
 */
public class IODemo03 {
	public static void main(String[] args) throws Exception {
		// write();
		copy("Student.java","xxx.txt");
	}

	// 字符流终极版
	private static void copy(String srcFileName, String descFileName) {
		try (BufferedReader br = new BufferedReader(new FileReader(srcFileName));
				PrintWriter pw = new PrintWriter(new FileWriter(descFileName), true)){
			String line = null;
			while ((line = br.readLine()) != null) {
				pw.println(line);
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	private static void write() throws Exception {
		// PrintWriter(Writer out, boolean autoFlush) 
		PrintWriter pw = new PrintWriter(new FileWriter("a.txt"), true);
		pw.append("Hello");
		pw.write("|World");
		pw.format("|我叫做%s,我今年%d岁了", "张三", 18);
		pw.print("Student");
		pw.print(new Student("隔壁老王", 18));
		pw.println();
	}
}

输入输出流

System类中的静态变量:in,out 。

“标准”输入流:static InputStream in 。
“标准”输出流:static PrintStream out 。
 它们各代表了系统标准的输入和输出设备。
 默认输入设备是键盘,输出设备是显示器。

随机访问流

RandomAccessFile概述:此类的实例支持对随机访问文件的读取和写入。

特点

RandomAccessFile类不属于流,是Object类的子类。
包含了InputStream和OutputStream的功能。支持对随机访问文件的读取和写入。
package com.sxt.otheriodemo;

import java.io.FileNotFoundException;
import java.io.RandomAccessFile;

import com.sun.org.apache.bcel.internal.generic.NEW;

/*
	使用该流的思想: 把所有的文件在脑海里都想象成一个大型的字节数组
	主要特点:
		1.支持对随机访问文件的读取和写入
				long getFilePointer() 
				void seek(long pos) 
		2.读写基本数据类型
		3.读写合一,可以通过模式自由切换
		4.清除文件的功能
		5.还是通往NIO的一个流 FileChannel getChannel()  【了解】
 */
public class IODemo06 {
	public static void main(String[] args) throws Exception {
		// write();
		// read();
		clear();
	}

	private static void clear() throws Exception {
		RandomAccessFile raf = new RandomAccessFile("raf.txt", "rw");
        //清除文件的功能
		raf.setLength(0);
	}

	private static void read() throws Exception {
		RandomAccessFile raf = new RandomAccessFile("raf.txt", "rw");
//		int i = raf.readInt();
//		System.out.println(i);
		byte[] bys = new byte[5];
		raf.seek(4);
		int len = raf.read(bys);
		System.out.println(new String(bys, 0, len));
		System.out.println(raf.getFilePointer());
	}

	private static void write() throws Exception {
		RandomAccessFile raf = new RandomAccessFile("raf.txt", "rw");
		raf.writeInt(10);
		raf.write("Hello".getBytes());
		raf.writeChar('a');
		raf.close();
	}
}

序列化流和反序列化流

序列化流ObjectOutputStream 
反序列化流ObjectInputStream
  • ObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream。可以使用 ObjectInputStream 读取(重构)对象。通过在流中使用文件可以实现对象的持久存储。

  • 如何实现序列化?

    类通过实现 java.io.Serializable 接口以启用其序列化功能。未实现此接口的类将无法使其任何状态序列化或反序列化,该接口没有任何方法,是一个标机接口。

  • 序列化数据后,再次修改类文件,读取数据会出问题,如何处理?
    使用transient关键字声明不需要序列化的成员变量。

package com.sxt.otheriodemo;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;


/*
 * 序列化流和反序列化流
 * ObjectInputStream和ObjectOutputStream 对象流
 * 序列化: 将对象写入到外界 (网络  文件  控制台)
 * 反序列化流: 将对象从外界还原
 * 
 * java.io.NotSerializableException
 * 异常名称: 没有序列化异常
 * 
 * InvalidClassException
 * 异常名称: 无效类异常
 * local class incompatible: 
 * 	stream classdesc serialVersionUID = 2512164725794751903, 
 * 	local class serialVersionUID = 799345655256203362
 * 
 * 第一次写入对象到文件中 序列化id是 stream classdesc serialVersionUID = 2512164725794751903
 * 第一次读取流中对象 序列化id是 stream classdesc serialVersionUID = 2512164725794751903
 * 第二次读取流中对象 序列化id是local class serialVersionUID = 799345655256203362
 * 定义一个固定ID,final修饰,static修饰
 * 
 * 1.对象持久化
 * 2.transient
 * 3.Serializable
 * 4.serialVersionUID
 */
public class IODemo02 {
	public static void main(String[] args) throws Exception {
		// write();
		read();
	}
	
	private static void read() throws Exception {
		ObjectInputStream ois = new ObjectInputStream(new FileInputStream("oos.txt"));
		Object obj = ois.readObject();
		System.out.println(obj);
		ois.close();
	}

	private static void write() throws Exception {
		ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("oos.txt"));
		// Student s = new Student("张三", 18);
		// oos.write(String.valueOf(s).getBytes());
		oos.writeObject(new Student("张三", 18));
		oos.close();
	}
}

Properties类

Properties概述: Properties 类表示了一个持久的属性集;Properties 可保存在流中或从流中加载;属性列表中每个键及其对应值都是一个字符串。

Properties可以当做Map集合类使用
Properties的特殊遍历功能
public Object setProperty(String key,String value)
public String getProperty(String key)
public Set<String> stringPropertyNames()
Properties和IO流结合使用
public void load(Reader reader)
public void store(Writer writer,String comments)
package com.sxt.otheriodemo;

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.LinkedHashMap;
import java.util.Properties;
import java.util.Set;

/*
 * Properties概述: Properties 类表示了一个持久的属性集;Properties 可保存在流中或从流中加载;属性列表中每个键及其对应值都是一个字符串。
	Properties可以当做Map集合类使用
	Properties的特殊遍历功能
	public Object setProperty(String key,String value)
	public String getProperty(String key)
	public Set<String> stringPropertyNames()
	Properties和IO流结合使用
	public void load(Reader reader)
	public void store(Writer writer,String comments)
	
	配置文件
		1.xxx.properties 【持久化配置】
		2.xxx.xml 【持久化配置】
		3.xxx.json 【持久化配置】
		4.注解 【运行时配置】
		防止硬编码 【写死】,满足了开闭原则
 */
public class IODemo {
	public static void main(String[] args) throws IOException {
		Properties prop = new Properties();
		// 当成属性集使用
		/*prop.setProperty("username", "zhangsan");
		prop.setProperty("password", "123456");
		prop.setProperty("gender", "nan");*/
		
		// System.out.println(prop);
		/*Set<String> keys = prop.stringPropertyNames();
		for (String key : keys) {
			String value = prop.getProperty(key);
			System.out.println(key + "=" + value);
		}*/
		
		//prop.store(new FileWriter("xxx.properties"), "This is a userInfo");
		prop.load(new FileReader("xxx.properties"));
		System.out.println(prop);
		
	}
}
示例一
package com.sxt.otheriodemo;

import java.io.FileWriter;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Properties;

/*
 * 模拟记录用户登录日志(采用追加方式记录),
 *	从控制台接收用户输入的用户名和密码,在文件中记录用户名和密码以及登录时间。
 *	格式如下: 
 *		name=zhangsan
 *		pwd=123456
 *		time=2014-06-05 18:22:33
 */
public class IODemo {
	public static void main(String[] args) throws IOException {
		Properties prop = new Properties();
		MyScanner input = new MyScanner(System.in);
		System.out.print("请输入用户名: ");
		String username = input.nextLine();
		System.out.print("请输入密码: ");
		String password = input.nextLine();
		System.out.println("请问是否此刻登录? (y/n)");
		String isLogin = input.nextLine();
		if (isLogin.equals("y") || isLogin.equals("Y")) {
			System.out.println("登录成功!");
			String time = new SimpleDateFormat("yyyy-mm-dd HH:mm:ss").format(new Date());
			prop.setProperty("name", username);
			prop.setProperty("pwd", password);
			prop.setProperty("time", time);
			prop.store(new FileWriter("login.properties"), "This is a login message");
		} else {
			return;
		}
		
	}
}
示例二
package com.task;

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Properties;
import java.util.Set;

/*
 * 已知文本文件(userinfo.txt)如下图所示,数据是键值对形式的,
 *	请写一个程序判断是否有admin这样的用户存在,如果有就改变密码为“56789”。
 *	#Wed Apr 26 16:08:53 2017
 *	admin=123456
 *	zhangsan=111111
 *	lisi=222222
 *
 */

public class Task {

	public static void main(String[] args) throws Exception, IOException {

		Properties pro = new Properties();
		pro.load(new FileReader("userinfo.txt"));
		Set<String> keys = pro.stringPropertyNames();
		for (String key : keys) {
			if (key.equals("admin")) {
				pro.setProperty("admin", "56789");
			}
		}
		pro.store(new FileWriter("userinfo.txt"), "this is User information");

	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值