java第十九天---数据输入流,内存操作流,打印流PrintWrit, 序列化流 随机访问流 Properties

1    数据输入输出流 DataInputStream、DataOutputStream

     特点: 可以写基本数据类型,可以读取基本数据类型

// 写基本数据类型
		dos.writeInt(45) ;
		dos.writeChar('中');
		dos.writeUTF("你好");

// 读取数据
		int a = dis.readInt() ;
		System.out.println(a);
		
		char ch = dis.readChar() ;
		System.out.println(ch);
		
		String str = dis.readUTF() ;
		System.out.println(str);

2 打印流

打印流的特点
      
     a: 打印流只能操作目的地,不能操作数据源(不能进行读取数据)
            b: 可以操作任意数据类型的数据 调用print() 方法可以写任意数据类型
            c: 如果我们启用自动刷新,那么在调用println、printf 或 format 方法中的一个方法的时候,会完成自动刷新

                            public PrintWriter(OutputStream out,  boolean autoFlush)     启动 自动刷新
                            public PrintWriter(Writer out,  boolean autoFlush)        启动自动刷新

             d: 这个流可以直接对文件进行操作(可以直接操作文件的流: 就是构造方法的参数可以传递文件或者文件路径)     

                      public PrintWriter(File file)
                      public PrintWriter(String fileName)

                      PrintWriter pw = new PrintWriter("printWriter.txt");

案例演示:PrintWriter实现自动刷新和换行
		PrintWriter pw = new PrintWriter(new FileWriter("printWriter2.txt") , true) ;
		pw.println(true) ;
		pw.println(100) ;
		pw.println("中国") ;
打印流复制文本文件,这个打印流只能进行写数据,不能进行读取数据,
		那么我们应该找一个可以读取文本文件中的的数据的流对象进行读取操作.
  		而我们非常喜欢高效的流对象,于是我们可以使用BufferedReader进行读取数据.

        BufferedReader br = new BufferedReader(new FileReader("PrintStreamDemo.java")) ;

		PrintWriter pw = new PrintWriter(new FileWriter("copyFile.java") , true) ;
		
		// 频繁的读写操作
		// 一次读取一行
		String line = null ;
		while((line = br.readLine()) != null){
			pw.println(line);
		}
		
	
		pw.close() ;
		br.close() ;

 3 标准输入输出流

        public static final InputStream in: 标准输入流, 对应的设备是键盘
        public static final PrintStream out: 标准输出流 , 对应的设备就是显示器
        System.in的类型是InputStream.
        System.out的类型是PrintStreamOutputStream的孙子类FilterOutputStream 的子类.

 

  二种键盘输入模式

    A:Scanner
    B:BufferedReader的readLine方法。
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

4 随机访问流

RandomAccessFile概述 最大特点 能读能写
        RandomAccessFile类不属于流,是Object类的子类。但它融合了InputStream和OutputStream的功能。
        支持对随机访问文件的读取和写入。

 RandomAccessFile的父类是Object , 这个流对象可以用来读取数据也可以用来写数据.可以操作任意数据类型的数据.
       我们可以通过getFilePointer方法获取文件指针,并且可以通过seek方法设置文件指针

// 创建对象
		RandomAccessFile raf = new RandomAccessFile("raf.txt" , "rw");
		
		// 写数据
		raf.writeInt(100) ;
		raf.writeChar('中') ;
		raf.writeUTF("你好") ;
		
		// 释放资源
		raf.close() ;
		
// 创建对象
		RandomAccessFile raf = new RandomAccessFile("raf.txt" , "rw");
		
		// 读取数据
		int a = raf.readInt() ;
		System.out.println(a);	
		System.out.println(raf.getFilePointer());//4 获取文件指针 按字节获取的 写了个int 所以是4
		
		char ch = raf.readChar() ;
		System.out.println(ch);
		System.out.println(raf.getFilePointer());// 获取文件指针
		
		String result = raf.readUTF() ;//这里会多读两个字节 是因为writeUTF("你好") 会多写两个字节
		System.out.println(result);
		System.out.println(raf.getFilePointer());
		
		// 设置文件指针的位置 可以往回读
		raf.seek(4) ;
		ch = raf.readChar() ;
		System.out.println(ch);
		
		// 释放资源
		raf.close() ;

 

5 序列化流和反序列化流(也就是对象操作流)

A:序列化流的概述
        所谓的序列化:就是把对象通过流的方式存储到文件中.注意:此对象 要重写Serializable 接口才能被序列化
        反序列化:就是把文件中存储的对象以流的方式还原成对象
        序列化流:    ObjectOutputStream
        反序列化流:    ObjectInputStream

像这样一个接口中如果没有方法,那么这样的接口我们将其称之为标记接口(用来给类打标记的,相当于猪肉身上盖个章)
 一个对象可以被序列化的前提是这个对象对应的类必须实现Serializable接口

 

序列化
	
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("obj.txt")) ;
		
		
		Student s = new Student("刘亦菲" , 18) ;
		
	
		oos.writeObject(s) ;
		
	
		oos.close() ;、
--------------------------------------------------

	反序列化
	
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("obj.txt")) ;
		
		
		Object obj = ois.readObject() ;	
		
	
		Student s = (Student)obj ;
		System.out.println(s.getName() + "----" + s.getAge());
				
		
		ois.close() ;

private transient int age ;// 可以阻止成员变量的序列化使用transient

6 Properties

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

属于双列集合,这个集合中的键和值都是字符串 Properties不能指定泛型

Properties的特殊功能
        public Object setProperty(String key,String value)
        public String getProperty(String key)
        public Set<String> stringPropertyNames()

Properties的load()和store()功能

       public void load(Reader reader): 读取键值对数据把数据存储到Properties中
       public void store(Writer writer, String comments)把Properties集合中的键值对数据写入到文件中, comments注释

Properties prop = new Properties() ;
		
		// 添加元素
		prop.setProperty("张三", "23") ;
		prop.setProperty("李四", "24") ;
		prop.setProperty("王五", "25") ;
		
		// public void store(Writer writer, String comments)
	
//把Properties集合中的键值对数据写入到文件中, comments注释
		// 创建输出流对象

		FileWriter fw = new FileWriter("userInfo.txt") ;
		prop.store(fw, "姓名和年龄对应信息") ;
		
		// 释放资源
		fw.close() ;

7 总结

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值