day22(IO(其他流)&Properties)笔记

22.01_IO流(序列流)(了解)

  • 1.什么是序列流

    • 序列流可以把多个字节输入流整合成一个, 从序列流中读取数据时, 将从被整合的第一个流开始读, 读完一个之后继续读第二个, 以此类推.
  • 2.使用方式

    • 整合两个: SequenceInputStream(InputStream, InputStream)

    • 整合多个: SequenceInputStream(Enumeration)
      /**
      * @param args
      * 整合两个输入流
      * SequenceInputStream(InputStream s1, InputStream s2)
      * 整合多个输入流
      * SequenceInputStream(Enumeration<? extends InputStream> e)
      * @throws IOException
      */
      public static void main(String[] args) throws IOException {
      //demo1();
      //demo2();
      FileInputStream fis1 = new FileInputStream(“a.txt”);
      FileInputStream fis2 = new FileInputStream(“b.txt”);
      FileInputStream fis3 = new FileInputStream(“c.txt”);

        	Vector<FileInputStream> v = new Vector<>();		//创建集合对象
        	v.add(fis1);	 //将流对象存储进来
        	v.add(fis2);
        	v.add(fis3);
        	
        	Enumeration<FileInputStream> en = v.elements();		//Vector中的方法,返回此向量的组件的枚举
        	SequenceInputStream sis = new SequenceInputStream(en);		//将枚举中的输入流整合成一个
        	FileOutputStream fos = new FileOutputStream("d.txt");
        	
        	int b;
        	while((b = sis.read()) != -1) {
        		fos.write(b);
        	}
        	
        	sis.close();
        	fos.close();
        }
      
        public static void demo2() throws FileNotFoundException, IOException {
        	FileInputStream fis1 = new FileInputStream("a.txt");
        	FileInputStream fis2 = new FileInputStream("b.txt");
        	SequenceInputStream sis = new SequenceInputStream(fis1, fis2);
        	FileOutputStream fos = new FileOutputStream("c.txt");
        	
        	int b;
        	while((b = sis.read()) != -1) {
        		fos.write(b);
        	}
        	
        	sis.close();	//sis在关闭的时候,会将构造方法中传入的流对象也都关闭
        	fos.close();
        }
      
        public static void demo1() throws FileNotFoundException, IOException {
        	FileInputStream fis1 = new FileInputStream("a.txt");		//创建字节输入流关联a.txt
        	FileOutputStream fos = new FileOutputStream("c.txt");		//创建字节输出流关联c.txt
        	
        	int b1;
        	while((b1 = fis1.read()) != -1) {		//不断的在a.txt上读取字节
        		fos.write(b1);			//将读到的字节写到c.txt上
        	}
        	fis1.close();		//关闭字节输入流
        	
        	FileInputStream fis2 = new FileInputStream("b.txt");
        	int b2;
        	while((b2 = fis2.read()) != -1) {
        		fos.write(b2);		//清空是FileOutputStream fos = new FileOutputStream("c.txt");这条语句清空的,与fos.write()语句无关,两个语句先后,会继续写
        	}
        	
        	fis2.close();
        	fos.close();
        }
      

22.03_IO流(内存输出流*****)(掌握)

  • 1.内存输出流(ByteArrayOutputStream())

    • 该输出流可以向内存中写数据, 把内存当作一个缓冲区, 写出之后可以一次性获取出所有数据
  • 2.使用方式

    • 创建对象: new ByteArrayOutputStream()
    • 写出数据: write(int), write(byte[])
    • 获取数据: toByteArray()
    •   /**
         * @param args
         * ByteArrayOutputStream
         * 内存输出流
         * 
         * FileInputStream读取中文的时候出现了乱码
         * 
         * 解决方案
         * 1,字符流读取
         * 2,ByteArrayOutputStream		//此类实现了一个输出流,其中的数据被写入一个byte数组,缓冲区会随着数据的不断写入而自动增长,可使用toByteArray()和toString()获取数据,参数为空或指定字节数组大小
         * @throws IOException 
         */
        public static void main(String[] args) throws IOException {
        	//demo1();
        	FileInputStream fis = new FileInputStream("e.txt");
        	ByteArrayOutputStream baos = new ByteArrayOutputStream();	//在内存中创建了可以增长的内存数组
        	
        	int b;
        	while((b = fis.read()) != -1) {
        		baos.write(b);		  //将读取到的数据逐个写到内存中
        	}
        	
        	//byte[] arr = baos.toByteArray();		//将缓冲区的数据全部获取出来,并赋值给arr数组
        	//System.out.println(new String(arr));
        	
        	System.out.println(baos.toString());		//将缓冲区的内容转换为了字符串,在输出语句中可以省略调用toString方法
      
        	fis.close();		//流是需要在硬盘上读取数据,所以需要关流,而ByteArrayOutputStream对象与集合,数组一样,都是直接在内存中,所以不需要关流
        }
      
        public static void demo1() throws FileNotFoundException, IOException {
        	FileInputStream fis = new FileInputStream("e.txt");
        	byte[] arr = new byte[3];
        	int len;
        	while((len = fis.read(arr)) != -1) {
        		System.out.println(new String(arr,0,len));
        	}		//FileInputStream读取中文的时候出现了乱码
        	
        	fis.close();
        }
      

22.04_IO流(内存输出流之黑马面试题)(掌握)

定义一个文件输入流,调用read(byte[] b)方法,将a.txt文件中的内容打印出来(byte数组大小限制为5)

  •   public static void main(String[] args) throws IOException {
      	//1,read(byte[] b)是字节输入流的方法,创建FileInputStream,关联a.txt
      	FileInputStream fis = new FileInputStream("a.txt");
    
      	//2,创建内存输出流,将读到的数据写到内存输出流中,这样子,即使是数组长度只有5也不会乱码
      	ByteArrayOutputStream baos = new ByteArrayOutputStream();	//因为是内存,所以不需要写文件名
    
      	//3,创建字节数组,长度为5
      	byte[] arr = new byte[5];
      	int len;
      	
      	while((len = fis.read(arr)) != -1) {
      		baos.write(arr, 0, len);	//数组与普通文件输入不同
      		//System.out.println(new String(arr,0,len));		//大家? ?
      	}
    
      	//4,将内存输出流的数据全部转换为字符串打印
      	System.out.println(baos); 		//大家好,即使没有调用,底层也会默认帮我们调用toString()方法
    
      	//5,关闭输入流
      	fis.close();
      }
    

22.05_IO流(随机访问流概述和读写数据)(了解)

  • A:随机访问流概述(RandomAccessFile())

    • RandomAccessFile概述
    • RandomAccessFile类不属于流,是Object类的子类。但它融合了InputStream和OutputStream的功能。
    • 支持对随机访问文件的读取和写入。
  • B:read(),write(),seek()

      /**
       * @param args
       * @throws IOException 
       */
      public static void main(String[] args) throws IOException {
      	RandomAccessFile raf = new RandomAccessFile("g.txt", "rw");	//读和写,不清空
      	//raf.write(97);	//写入a
      	//int x = raf.read();
      	//System.out.println(x);	//97
      	raf.seek(0);		//在指定位置设置指针
      	raf.write(98);		//a修改为b,因为在第0个位置
      	raf.close();
      }
    

22.06_IO流(对象操作流ObjecOutputStream)(了解)

  • 1.什么是对象操作流

    • 该流可以将一个对象写出, 或者读取一个对象到程序中. 也就是执行了序列化(数据上传)和反序列化(读档)的操作.
  • 2.使用方式

    • 写出: new ObjectOutputStream(OutputStream), writeObject()

    • 将对象存储在集合中写出

       public class Demo3_ObjectOutputStream {
      
       	/**
       	 * @param args
       	 * @throws IOException 
       	 * 将对象写到文件上,序列化
       	 */
       	public static void main(String[] args) throws IOException {
       		//demo1();
       		//将对象存储在集合中写出(对象操作流优化)
       		Person p1 = new Person("张三", 23);
       		Person p2 = new Person("李四", 24);
       		Person p3 = new Person("王五", 25);
       		Person p4 = new Person("赵六", 26);
       		
       		ArrayList<Person> list = new ArrayList<>();
       		list.add(p1);
       		list.add(p2);
       		list.add(p3);
       		list.add(p4);
       		
       		ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("e.txt"));
       		oos.writeObject(list);		//把整个集合对象一次写出
       		oos.close();
       		}
      
       	public static void demo1() throws IOException, FileNotFoundException {
       		Person p1 = new Person("张三", 23);
       		Person p2 = new Person("李四", 24);		//Person类中要实现Serializable 接口,不需要加别的语句,只需implements Serializable,因为接口中没有具体方法
       		//FileOutputStream fos = new FileOutputStream("e.txt");
       		//fos.write(p1);
       		//FileWriter fw = new FileWriter("e.txt");
       		//fw.write(p1);
       		//无论是字节输出流,还是字符输出流都不能直接写出对象
      
       		ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("e.txt"));		//创建对象输出流
       		oos.writeObject(p1);	//Person自动类型提升为Object类,好处是可以写任意对象
       		oos.writeObject(p2);
       		oos.close();	//文件中是乱码,但不重要,因为文件内容不需可读
       	}
      

22.07_IO流(对象操作流ObjectInputStream)(了解)

  • 读取: new ObjectInputStream(InputStream), readObject()

    • 读取到的是一个集合对象

        /**
         * @param args
         * @throws IOException 
         * @throws FileNotFoundException 
         * @throws ClassNotFoundException 
         * ObjectInputStream
         * 对象输入流,反序列化
         */
        public static void main(String[] args) throws FileNotFoundException, IOException, ClassNotFoundException {
        	//demo1();
        	//读取到的是一个集合对象(对象操作流优化)
        	ObjectInputStream ois = new ObjectInputStream(new FileInputStream("e.txt"));
      
        	ArrayList<Person> list = (ArrayList<Person>) ois.readObject();		//强转,将集合对象一次读取
        	//泛型在运行期会被擦除,索引运行期相当于没有泛型
        	//想去掉黄色可以加注解@Suppresswarnings("unchecked")
        	for (Person person : list) {
        		System.out.println(person);
        	}
        	
        	ois.close();
        }
      
        public static void demo1() throws IOException, FileNotFoundException,
        		ClassNotFoundException {
        	ObjectInputStream ois = new ObjectInputStream(new FileInputStream("e.txt"));
        	
        	Person p1 = (Person) ois.readObject();
        	Person p2 = (Person) ois.readObject();		//readObject读的是Object类,所以此处需要强转
        	//Person p3 = (Person) ois.readObject();			//不存在p3,当文件读取到了末尾时出现EOFException
        	
        	System.out.println(p1);
        	System.out.println(p2);
        	
        	ois.close();
        }
      

22.09_IO流(加上id号)(了解)

  • 注意

    • 要写出的对象必须实现Serializable接口才能被序列化
    • 不用必须加id号,id号的改变代表是第几版修改时出现的问题

22.10_IO流(数据输入输出流)(了解)

  • 1.什么是数据输入输出流(DataInputStream(), DataOutputStream())

    • DataInputStream, DataOutputStream可以按照基本数据类型大小读写数据
    • 例如按Long大小写出一个数字, 写出时该数据占8字节. 读取的时候也可以按照Long类型读取, 一次读取8个字节.
  • 2.使用方式

    • DataOutputStream(OutputStream), writeInt(), writeLong()

    • DataInputStream(InputStream), readInt(), readLong()

        /**
         * @param args
         * @throws IOException 
         * 00000000 00000000 00000011 11100101	//int类型的997
         * 11100101
         * 00000000 00000000 00000000 11100101
         */
        public static void main(String[] args) throws IOException {
        	//demo1();
        	//demo2();
        	//demo3();
        	DataInputStream dis = new DataInputStream(new FileInputStream("h.txt"));
        	int x = dis.readInt();
        	int y = dis.readInt();
        	int z = dis.readInt();
        	
        	System.out.println(x);
        	System.out.println(y);
        	System.out.println(z);	//999
        	
        	dis.close();
        }
      
        public static void demo3() throws FileNotFoundException, IOException {
        	DataOutputStream dos = new DataOutputStream(new FileOutputStream("h.txt"));
        	dos.writeInt(997);
        	dos.writeInt(998);
        	dos.writeInt(999);	//乱码,但没关系,读取时可以正常读取
        	dos.close();
        }
      
        public static void demo2() throws FileNotFoundException, IOException {
        	FileInputStream fis = new FileInputStream("h.txt");
        	int x = fis.read();
        	int y = fis.read();
        	int z = fis.read();
        	
        	System.out.println(x);	//十进制: 229
        	System.out.println(y);	//230
        	System.out.println(z);	//231
        	
        	fis.close();
        }
      
        public static void demo1() throws FileNotFoundException, IOException {
        	FileOutputStream fos = new FileOutputStream("h.txt");
        	fos.write(997);
        	fos.write(998);
        	fos.write(999);	//乱码,没有找到对应的码表值,超过一个字节的范围,将前3个8位砍掉,只写最后一个8位
        	
        	fos.close();
        }
      

22.11_IO流(打印流的概述和特点)(掌握)

  • 1.什么是打印流

    • 该流可以很方便的将对象的toString()结果输出, 并且自动加上换行, 而且可以使用自动刷出的模式

    • System.out就是一个PrintStream(打印字节流), 其默认向控制台输出信息

        PrintStream ps = System.out;
        ps.println(97);		//其实底层用的是Integer.toString(x),将x转换为数字字符串打印
        ps.write(97);	//查找码表,找到对应的a并打印
        ps.println("xxx");
      
        ps.println(new Person("张三", 23));
        Person p = null;
        ps.println(p);		//如果是null,就返回null,如果不是null,就调用对象的toString()
      
  • 2.使用方式

    • 打印: print(), println()
    • 自动刷出: PrintWriter(OutputStream out, boolean autoFlush, String encoding) //打印字符流
    • PrintStream和PrintWriter分别是打印的字节流和字符流,打印流只操作数据目的
    •   PrintWriter pw = new PrintWriter(new FileOutputStream("g.txt"), true);
        pw.write(97);	//a
        pw.print("大家好");
        pw.println("你好");		//自动刷出autoFlush,只针对的是println方法,对write与print方法都无效,但若写在最后,前面的在缓冲区的内容也能刷新出来。并没有大用
        pw.close();		//输出流有内置的小的缓冲区,close方法可以将其刷新出来
      

22.12_IO流(标准输入输出流概述和输出语句)

  • 1.什么是标准输入输出流(掌握)

    • System.in是InputStream, 标准输入流, 默认可以从键盘输入读取字节数据
    • System.out是PrintStream, 标准输出流, 默认可以向Console中输出字符和字节数据
  • 2.修改标准输入输出流了解

    • 修改输入流: System.setIn(InputStream)
    • 修改输出流: System.setOut(PrintStream)
    •   /**
         * @param args
         * @throws IOException 
         */
        public static void main(String[] args) throws IOException {
        	//demo1();
        	System.setIn(new FileInputStream("a.txt"));			//改变标准输入流(抽象类)
        	System.setOut(new PrintStream("b.txt"));	//改变标准输出流
        	
        	InputStream is = System.in;			//获取标准的键盘输入流,默认指向键盘,改变后指向文件
        	PrintStream ps = System.out;		//获取标准输出流,默认指向的是控制台,改变后就指向文件
        	
        	int b;
        	while((b = is.read()) != -1) {
        		ps.write(b);
        	}
        	//System.out.println();		//也是一个输出流,不用关,因为没有和硬盘上的文件产生关联的管道
        	is.close();
        	ps.close();
        	
        }
      
        public static void demo1() throws IOException {
        	InputStream is = System.in;
        	int x = is.read();
        	System.out.println(x);
        	
        	is.close();		//不需要关,并没有关联到某个具体的文件,内存与硬盘没有关联,若是关联到某个具体的文件,一定要关流
        	
        	InputStream is2 = System.in;
        	int y = is2.read();
        	System.out.println(y);	//输入流只有一个,关了就没了,这个也再开不了,运行会报错
        }
      

22.13_IO流(修改标准输入输出流拷贝图片)(了解)

	System.setIn(new FileInputStream("IO图片.png"));		//改变标准输入流
	System.setOut(new PrintStream("copy.png")); 		//改变标准输出流
	
	InputStream is = System.in;							//获取标准输入流
	PrintStream ps = System.out;						//获取标准输出流
	
	int len;
	byte[] arr = new byte[1024 * 8];
	
	while((len = is.read(arr)) != -1) {
		ps.write(arr, 0, len);
	}
	
	is.close();
	ps.close();

22.14_IO流(两种方式实现键盘录入)(了解)

  • A:BufferedReader的readLine方法。

    • BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  • B:Scanner

      /*BufferedReader br = new BufferedReader(new InputStreamReader(System.in));		
      //InputStreamReader转换流
      String line = br.readLine();
      System.out.println(line);
      br.close();*/
      
      Scanner sc = new Scanner(System.in);
      String line = sc.nextLine();
      System.out.println(line);
      sc.close();
    

22.15_IO流(Properties的概述和作为Map集合的使用)(了解)

  • A:Properties的概述(读取硬盘中的配置文件,如config.properties)

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

    • Properties作为Map集合的使用

        #Tue Jun 29 05:34:44 CST 2088
        qq=12345
        tel=18912345678
        username=zhangsan
      

22.16_IO流(Properties的特殊功能使用)(了解)

  • A:Properties的特殊功能

    • public Object setProperty(String key,String value)
    • public String getProperty(String key)
    • public Enumeration stringPropertyNames()
  • B:案例演示

    • Properties的特殊功能

22.17_IO流(Properties的load()和store()功能)(了解)

  • B:案例演示

    • Properties的load()和store()功能

        /**
         * @param args
         * Properties是Hashtable的子类,可继承Hashtable的put方法
         * @throws IOException 
         * @throws FileNotFoundException 
         */
        public static void main(String[] args) throws FileNotFoundException, IOException {
        	//demo1();
        	//demo2();
        	Properties prop = new Properties();
        	prop.load(new FileInputStream("config.properties"));		//将文件上的键值对读取到集合中
        	prop.setProperty("tel", "18912345678");		//此处只修改了内存,并没有写入配置文件(硬盘)上
        	prop.store(new FileOutputStream("config.properties"), null);
        	//第二个参数是对列表参数的描述,可以给值(字符串,如“吃吃吃”),也可以给null,写在开头:#吃吃吃,还有一行是:#时间,都是注释
        	System.out.println(prop);		//打印无序,因为是Hashtable的子类,Hash算法存取无序
        }
      
        public static void demo2() {
        	Properties prop = new Properties();
        	prop.setProperty("name", "张三");
        	prop.setProperty("tel", "18912345678");
        	
        	//System.out.println(prop);		//直接打印
      
        	//遍历
        	Enumeration<String> en = (Enumeration<String>) prop.propertyNames();		//返回所有键的枚举,强转,否则默认为Object类
        	while(en.hasMoreElements()) {
        		String key = en.nextElement();				//获取Properties中的每一个键
        		String value = prop.getProperty(key);		//根据键获取值
        		System.out.println(key + "="+ value);
        	}
        }
      
        public static void demo1() {
        	Properties prop = new Properties();
        	prop.put("abc", 123);
        	System.out.println(prop);
        }
      
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值