IO流

IO流

递归

方法递归:
 		就是方法本身调用方法一种现象!
  
递归思想:
  		1)必须定义一个方法:方法调用方法
  		2)满足一定的规律
  		3)方法必须有出口条件(结束条件)--->否则:就是死递归!
  		
 
注意事项:
		构造方法不存在递归!

File类

java.io.File:
 		文件和目录路径名的抽象表示形式。
  
  构造方法:
  	public File(String pathname):里面当前文件夹/文件的路径 (推荐方式)
 	public File(String parent,String child):parent的字符串路径名和child的字符串路径名构造一个File
 	public File(File parent,String child):参数1:需要描述parent的字符串路径名和子文件字符串路径名:构造一个File
 
  
  URL:这个是URI的子集合(统一资源定位符)
  			http://localhost:8080/web/login
  
  URI:(统一资源标识符):/web/login
  		网络协议:http://
  				https://
  				ftp://
  				thunder:// 




File类的获取功能

  基本获取功能
  
		public String getAbsolutePath():获取绝对路径名
 		public String getPath():当前文件所表示的路径
  		public long length():获取文件长度
  		public long lastModified():获取当前文件最后一次修改的时间(long:毫秒值)
  
  
  File的判断功能
 
  		public boolean isFile():判断是否是文件
  		public boolean isDirectory():判断是否是文件夹(目录)
		public boolean canRead():判断是否可读
  		public boolean canWrite():判断是否可写
  		public boolean exists():判断所file表示的文件/目录是否存在
  		public boolean isAbsolute():判断是否是绝对路径
 		public boolean isHidden():判断是否是隐藏文件
 
 
  File类的创建功能:
  
      public boolean createNewFile()throws IOException:创建文件
      public boolean mkdir():创建目录(文件夹):如果存在该文件夹,返回值false
      public boolean mkdirs():
  			创建目录(文件夹):创建多级目录,如果父目录不存在,会自动创建!
  		如果描述文件或者文件夹没有指定盘符,相对路径:默认是当前项目路径下
 

  File类的删除功能
            
  		public boolean delete():删除目录/文件,
  		如果删除的是目录,那么前提条件:目录必须为空


  重命名功能:
      针对某个文件操作
      public boolean renameTo(File dest):

      需求:将当前项目下的高圆圆.jpg --- 杨桃.jpg  

      情况1:
            当前文件的路径和该名后的路径相同,仅仅是改名字

      情况2:
            当前文件的路径名和该后面的路径名不相同,剪切并重命名
                
  		
  		
  高级获取功能

  		public File[] listFiles():获取的是某个盘符下/目录File数组(目录中的文件)
  		public String[] list():获取某个盘符/目录的下的所有文件以及目录的字符串数组
               
                                          
获取当前d盘下的所有的以".jpg"结尾的文件!:
         //描述下d盘符			
		File file = new File("d:\\") ;
		//public File[] listFiles()
		File[] fileArray = file.listFiles() ;
		//防止空指针
		if(fileArray!=null) {
			//遍历
			for(File f:fileArray) {
				//System.out.println(f);
				//判断f对象是否描述的文件
				if(f.isFile()) {
					//是文件
					//还需要判断:当前文件是否以.jpg结尾
					if(f.getName().endsWith(".jpg")) {
						//是以.jpg结尾
						//输出
						System.out.println(f.getName());
					}
                    
 使用public File[] listFiles()能够实现功能,但是比较麻烦,提供了一下这个方法:                  
  		 //描述一下D盘
		File file = new File("D:\\") ;
		//public File[] listFiles(FilenameFilter filter):
           //高级功能:获取file表示的目录中文件的File数组
		//参数为:文件名称过滤器
		File[] fileArray = file.listFiles(new FilenameFilter() {
			@Override
			public boolean accept(File dir, String name) {
				//return false;
				//业务:
				/**
				 * "所有的以".jpg"结尾的文件!"
 *  					dir表示是否文件
 *  					name是否"以.jpg结尾"
				 */
				/*
				 File file = new File(dir,name) ;
				boolean flag1 = file.isFile() ; //true:是文件
				boolean flag2 = name.endsWith(".jpg") ;//true:文件名称是以.jpg结尾
				//System.out.println(name);
				return flag1 && flag2 ;
				*/
				//一步走:
				return new File(dir,name).isFile() && name.endsWith(".jpg") ;
			}
		}) ;
		
		//遍历File数组
		if(fileArray!=null) {
			for(File f:fileArray) {
				System.out.println(f.getName());
			}
		}

IO流

IO流:
  	在设备之间进行数据传输的操作!
  	
          按流的方向划分:
                输入流
                输出流

          按流的类型划分
                字节流

                        字节输入流:InputStream
                        字节输出流:OutputStream
                字符流
                        字符输入流:Reader
                        字符输出流:Writer

          字符流是在字节输入流之后出现的,解决了中文乱码问题!  
          一般情况:针对某个文本文件进行读写复制操作: 优先采用字符流 (使用记事本打开并且能读懂!)


          两个抽象类,不能直接实例化,提供了一些具体的子类
                    XXXInputStream
                    XXXOutputStream
            都是字节输入流和字节输出流的子类

字节输出\输入流

文件字节输出流:FileOutputStream
 
 	构造方法:
          public FileOutputStream(String name,  boolean append):
          创建输出流对象,并指向文件,将文件内容写入到末尾:第二个参数为:true:写入末尾
 	
 	 FileOuputStream:针对文件操作:文件输出流(文件字节输出流)
          public FileOutputStream(String name):
          public FileOutputStream(File file)
         推荐使用第一种:直接跟当前的具体路径!
      
     字节输出流写数据的功能:
          void write(byte[] b) :给指定的文件写入字节数组 
          void write(byte[] b, int off, int len) :写入字节数组的一部分
          abstract   void write(int b) :写入一个字节 

 
	 异常的处理方式
            throws
            try...catch..finally:开发汇中,使用这种格式
     		IO流中:字节输出流中加入异常操作

          windows操作系统:
                换行符号:\r\n

  	使用步骤:
            1)创建OutputStream字节输出流对象,同时指向某个文件路径
            2)写数据:给文件中写入内容
            3)关闭相关的系统资源

	例:需求:需要在当前项目下输出文件:fos.txt文件,并同时输出内容:"hello,OutputStream"
		//创建输出流对象---->调用系统资源:在本地的项目下创建具体文件fos.txt
		//流对象---指向文件地址
		FileOutputStream fos = new FileOutputStream("fos.txt") ;
		//2)写入内容
		//通过流对象给文件写入内容(写入的字节数组)
		fos.write("hello,outputStream".getBytes());
		//3)释放资源
		//将输出流对象的系统资源释放掉!
		fos.close();
	

	
 
 
 
 
 
文件字节输入流:FileInputStream
  
    构造方法:
          public FileInputStream(String name)throws FileNotFoundException
    读数据:
                public abstract int read():一次读取一个字节
                public int read(byte[] b) throws IOException:一次读取一个字节数组

         使用步骤
            1)创建FileInputStream对象:指向哪个文件
            2)读数据 :public abstract int read():读取一个字节
                展示结果
            3)关闭资源

        
  
  例:
  	方式1:一次读取一个字节
             //创建FileInputStream对象
            FileInputStream fis = new FileInputStream("DiGuiTest.java") ;
            //定义一个字节
            int by = 0 ;
            while((by=fis.read())!=-1) {
                //数据没有读取完毕
                System.out.print((char)by);  //强制转换:造成中文乱码:中文存储的问题
                //一个中文:gbk格式:一个中文两个字节,而且第一个字节是负数!
            }
            //关闭资源
            fis.close();
		
  	方式2:一次读取一个字节数组
             //创建一个字节文件输入流对象
            FileInputStream fis = new FileInputStream("DiGuiTest.java") ;
  			//长度:是1024或者1024的整数倍
            byte[] bytes = new byte[1024] ;
            //定义一个实际读取的字节数
            int len = 0 ;
            while((len=fis.read(bytes))!=-1) {
            //没有读完,继续读取
            //	System.out.println(new String(bytes));
                //public String(byte bytes[], int offset, int length)
                System.out.println(new String(bytes, 0, len)); 
                //每次从0开始,读取实际字节数
            }
            //关闭资源
            fis.close();
  
 
 读写复制操作
  
      在d盘下有一个FileInputStreamDemo.java文件的内容
      复制到当前项目路径下:Copy.java文件中

      分析:
        1)封装d盘的文件FileInputStreamDemo.java ---源文件
            使用输入流读取FileInputStreamDemo.java文件的内容

        2)封装目标文件:当前项目下:Copy.java 
            使用文件字节输出流写数据,将上面的内容复制进来!

        3)两种方式
                要么1)一次读取一个字节
                要么2)一次读取一个字节数组
  		复制图片文件/视频文件...:
  		//封装d盘的文件FileInputStreamDemo.java ---源文件
		//创建字节文件输入流对象
		FileInputStream fis = new FileInputStream("d:\\FileInputStreamDemo.java") ;
		//封装目标文件:当前项目下:Copy.java 
		FileOutputStream fos = new FileOutputStream("Copy.java") ;
		/*
		//读写复制操作
		//方式1):1次读取一个字节
		int by = 0 ;
		while((by=fis.read())!=-1) {
			//读一个字节,写一个字节到fos流对象中
			fos.write(by);
		}
		*/
		//方式2:一次读取一个字节数组
		//定义一个数组
		byte[] bytes = new byte[1024] ;
		int len = 0 ;
		while((len=fis.read(bytes))!=-1) {
			//写一个字节数组:从0开始,写入实际字节数
			fos.write(bytes, 0, len);
		}
		
		//释放资源
		fos.close();
		fis.close();
  		
  		

字节缓冲输出\输入流

BufferedOutputStream extends OutputStream:字节缓冲输出流
      构造方法
        public BufferedOutputStream(OutputStream out)
      创建一个缓冲输出流对象,默认缓冲区大小

      目前:当前缓冲流只是在流中提供了byte[] 缓冲区,默认足够大,一般通过带一个参的构造方法创建!
      只是提供缓冲区,具体文件读写复制操作还是需要用底层流(InputStream/OutputStream):
 		//创建一个BufferedOutputStream流对象
 		BufferedOutputStream bos =
				new BufferedOutputStream(new FileOutputStream("bos.txt")) ;
 		//写数据
		bos.write("hello,bufferedOutputStream!".getBytes());
		//释放资源
		bos.close();
 
 
 BufferedInputStream extends InputStream:字节缓冲输入流
      构造方法
        BufferedInputStream(InputStream in):
        //创建一个BufferedInputStream流对象
        BufferedInputStream bis = 
                    new BufferedInputStream(new FileInputStream("bos.txt"))  ;
        //一次读取一个字节
            /*
            int by = 0 ;
            while((by=bis.read())!=-1) {
                //展示在控制台上
                System.out.print((char)by);
            }
            */
            //一次读取一个字节数组
            byte[] bytes = new byte[1024] ;
            int len = 0 ;
            while((len=bis.read(bytes))!=-1) {
                System.out.println(new String(bytes,0,len));
            }
            //释放资源
            bis.close();
            
            
 四种方式对文件进行读写复制操作
     
        FileInputStream/FileOutputStream:一次读取一个字节  共耗时44毫秒
        FileInputStream/FileOutputStream:一次读取一个字节数组 
     高效的字节流
        BufferedInputStrea/BufferedOutputStream:一次读取一个字节
        BufferedInputStrea/BufferedOutputStream:一次读取一个字节数组
 

字符输出\输入流

OutputStreamWriter:字符输出流(字符流通向字节流的桥梁):转换流
      构造方法
        public OutputStreamWriter(OutputStream out):gbk格式 使用默认字符集进行编码的字符输出流
        public OutputStreamWriter(OutputStream out, Charset cs)
        使用指定的字符集构造出一个字符输出流

      成员方法
            public void write(int c):写入单个字符
            public void write(char[] cbuf):写入字符数组
            public abstract void write(char[] cbuf,int off,int len) 写入字符数组的一部分
            public void write(String str):写入字符串内容
            public void write(String str,int off,int len):写入字符串一部分


      flush()close()
      一个刷新流:将缓冲的数据刷新出来(中文:默认gbk格式:一个中文对两个字节),流刷新之后还可以
      继续写入数据;
      close()方法:将跟该流相关的系统资源释放掉,
      不再指向当前操作的文件,关闭之后不能再写入数据否则出现IOException
      
        例:
            //创建一个OutputStreamWrite流对象
            OutputStreamWriter osw = new OutputStreamWriter
                    (new FileOutputStream("osw.txt"));
            //写数据
            osw.write("今天老地方见");
            //关闭之前:先去刷新流
            osw.flush();
            //释放资源
            osw.close();

 
 
 
 
InputStreamReader:字符输入流 (字符流通向字节流的桥梁)字符转换输入流

          构造方法:
            public InputStreamReader(InputStream in):使用默认字符集进行解码(gbk格式)
          public InputStreamReader(InputStream in, String charsetName)
            使用指定的字符集进行解码

          成员方法:
          读的功能
          public int read():读单个字符
          public int read(char[] cbuf):读字符数据
          public int read(char[] cbuf,int offset,int len)读字符数组的一部分
 
 	例:
		//创建字符转换输入流对象
		
		InputStreamReader isr = new InputStreamReader(
				new FileInputStream("osw.txt")) ;//默认gbk格式
            //一次读取一个字符
            /*
            int ch = 0 ; 
            while((ch=isr.read())!=-1) {
                //展示在控制台上
                System.out.print((char)ch);
            }
            */
            //一次读取一个字符数组
            char[] chs = new char[1024] ;
            int len = 0 ;//实际字符数
            while((len=isr.read(chs))!=-1) {
                System.out.println(new String(chs,0,len));
            }
            //关闭资源
            isr.close();
 
 

读写操作
    将当前项目OutputStreamWriterDemo.java文件---复制到D盘下Copy.java .txt/.java..... 
    使用记事本打开并能读懂,通常使用的字符流

 分析:
  	1)封装源文件---->InputStreamReader
  	2)封装目的地文件---->D盘下 Copy.java  OutputStreamWriter
  	3)读写操作
  			一次读取一个字符
        	一次读取一个字符数组
 
        
        例:
            //1)封装源文件---->InputStreamReader
            InputStreamReader isr = new InputStreamReader
                    (new FileInputStream("OutputStreamWriterDemo.java")) ;

            //	2)封装目的地文件---->D盘下 Copy.java  OutputStreamWriter
            OutputStreamWriter osw = new OutputStreamWriter(
                    new FileOutputStream("D:\\Copy.java")) ;
            //一次读取一个字符
            int ch = 0 ;
            while((ch=isr.read())!=-1) {
                //写
                osw.write(ch);
                //刷新
                osw.flush();
            }

            //一次读取一个字符数组(自己测试)

            //关闭资源
            osw.close();
            isr.close();

编码和解码

编码和解码
  
          编码:就将能够看懂的内容-----转换 "看不懂的内容"
                String						byte[]

          解码: 将看不懂的内容----------转换 "能看懂的内容"
                byte[]						String

          举例:
                "今天老地方"			----- > 字节数组 :编码

          编码格式:
                big-5:大五码 (繁写字体)
                gbk:中国的中文编码表:一个中文对应两个字节
                gbk-2312:中国的中文编码表:一个中文对应两个字节:对上面 的编码扩展
                iso-8859-1:拉丁文码表 
               utf-8:一个中文对应三个字节码
              JS:日本中的编码格式

              utf-8/gbk

              编码和解码的过程必须保证格式统一:否则出现乱码!:
  	//创建一个字符串
		String s = "你好" ;
		//String---->Byte[]   getBytes():里面空参:平台默认编码集:gbk
		//getBytes("utf-8");编码格式:utf-8
		//byte[] bytes = s.getBytes() ;//默认gbk:一个中文对应两个字节

		byte[] bytes = s.getBytes("utf-8") ;
		//使用Arrays将数组---字符串
		System.out.println(Arrays.toString(bytes));
		//[-60, -29, -70, -61]
		//[-28, -67, -96, -27, -91, -67]:utf-8:一个中文对应三个字节数
		System.out.println("-----------------------------");
		
		//解码
		//byte[]---String :构造方法
		//String(byte[] bytes):默认平台字符集解码
		//String(byte[] bytes,Charset c):使用指定的字符集进行解码
		String str = new String(bytes) ; //默认gbk解码     浣犲ソ(编码utf-8)
		//String str = new String(bytes,"utf-8") ;//???乱码
		System.out.println(str);//你好

简化字符流读写复制操作FileReader/FileWriter

为了简化字符流读写复制操作:
  
  提供了字符转换输入流和字符转换输出流的便捷类
  FileReader/FileWriter		---继承自InputStreamReader/OutputStreamWriter
  FileReader(String pathname)
  FileWriter(String pathname):
  	  	//封装源文件:OutputStreamWriterDemo.java
		FileReader fr = new FileReader("OutputStreamWriterDemo.java") ;
		//封装目的文件:当前项目下:Demo.javas
		FileWriter fw = new FileWriter("Demo.java") ;
		
		//一次读取一个字符数组
		char[] chs = new char[1024] ;
		int len = 0 ;
		while((len=fr.read(chs))!=-1) {
			//写
			fw.write(chs, 0, len);
			//刷新
			fw.flush();
		}
		//释放资源
		fw.close();
		fr.close();

读写复制操作:文本文件复制BufferedReader/BufferedWriter

使用BufferedReader/BufferedWriter:读写复制操作:文本文件复制
  利用特有功能(一种新的方式)
  
  项目下的Demo.java---复制到D盘下:a.java文件中
  使用BufferedReader:字符缓冲输入流的readLine():一次读取一行
 使用BufferedWriter:newLine()可以实现换行
  
  总结针对文本文件的复制操作:
  		InputStreamReader/OutputStreamWriter:一次读取一个字符
  		InputStreamReader/OutputStreamWriter:一次读取一个字符数组
   (同上)
  		FileReader/FileWriter一次读取一个字符
  		FileReader/FileWriter一次读取一个字符数组
 
  		BufferdReader/BufferedWriter:一次读取一个字符
  		BufferdReader/BufferedWriter:一次读取一个字符数组
  		BufferedReader/BufferedWriter:一次读取一行
  		
  		
  		
  	例:
  		//封装源文件
		BufferedReader br = new BufferedReader(new FileReader("Demo.java")) ;
		//封装目标文件
		BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\a.java")) ;
		//读写
		String line = null ;
		while((line=br.readLine())!=null) {
			//读一行,bw写一行
			bw.write(line);
			bw.newLine();
			bw.flush();
		}
		//释放资源
		bw.close();
		br.close();
  

字符缓冲输出\输入流

 BufferedReader:字符缓冲输入流
    构造方法
          BufferedReader(Reader r):构造一个字符缓冲输入流提供默认缓冲区大小

     特有功能:
            public String readLine():一次读取一行内容,当读取到\n(换行了),就终止!:
            //创建字符缓冲输入流对象
            BufferedReader br = new BufferedReader(
                new FileReader("OutputStreamWriterDemo.java")) ;
            //读取数据
            //优化:while循环
            String line = null ;
            while((line=br.readLine())!=null) {
                //没有读完毕
                System.out.println(line);
            }
            //释放资源
            br.close();

	作为键盘录入:(只能录入字符串)
			Scanner(InputStream in)
         	BufferedReader(Reader r):可以作为键盘录入(使用流的方式)
                
		//使用BufferedReader(Reader r):可以作为键盘录入
		/*
		//分步走
		InputStream in = System.in ;
		
		//创建Reader流对象
		Reader r = new InputStreamReader(in) ; //字符转换流:通向字节流的桥梁
		
		//创建BufferedReader流对象
		BufferedReader br = new BufferedReader(r) ;
		*/
		
		//一步走
		BufferedReader br = new BufferedReader(
				new InputStreamReader(System.in)) ;
		
		System.out.println("请您输入一个数据:"); //"100" 数字字符串
		//利用BufferedReader:的readLine()读取一行数据
		String line = br.readLine() ; 	//"100"
		//String---int: Integer.parseInt(String str)
		int num = Integer.parseInt(line) ;
		System.out.println("您录入的字符串是:"+num);




 
 BufferedWriter:字符缓冲输出流
        将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入
      public BufferedWriter(Writer out):构造一个缓冲输出流,默认缓冲区大小

      成员方法
        特有功能
            public void newLine():写入行的分隔符(换行):
    	//创建一个缓冲输出流对象
		BufferedWriter bw = new BufferedWriter(new FileWriter("bw.txt")) ;
		//写数据:
		bw.write("hello");
		//特有换行功能
		bw.newLine();
		bw.write("world");
		bw.newLine();
		bw.write("Java");
		bw.newLine();
		//刷新
		bw.flush();
		//关闭资源
		bw.close();
            
            
 

文本文件和图片文件传输选择

文本文件的复制----优先采用BufferedReader/BufferedWriter
图片文件/音频文件/视频文件----采用BufferdInputStrea/BufferedOutputStream
  
  文本文件的复制
  当前项目下:BufferedInputStreamDemo.java
  复制当前项目下:Test.java
  
  封装源文件:BufferedReader 
  封装目标文件:PrintWriter
      
      例:
			//封装源文件
		BufferedReader br = new BufferedReader
				(new FileReader("BufferedInputStreamDemo.java")) ;
		//封装目的地文件
		//public PrintWriter(Writer out, boolean autoFlush) 
		PrintWriter pw = new PrintWriter(new FileWriter("Test.java"),true) ;//启动自动刷新
		//复制
		String line = null ;
		while((line=br.readLine())!=null) {
			//打印数据
			pw.println(line);
		}
		//释放资源
		pw.close();
		br.close();
		

合并流

SequenceInputStream extends InputStream:字节输入流
  合并流:将两个或者两个以上的流对象合并到一个流中
  
         构造方法
         将两个基本输入流合并到当前SequenceInputStream流中
          public SequenceInputStream(InputStream s1,InputStream s2)
          
    两个文件的复制:
    	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();
      
    两个以上的文件复制:
    	//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();

内存操作流ByteArrayOutputStream

内存操作流:操作临时数据
          ByteArrayOutputStream:内存操作输出流
          构造方法:
            public ByteArrayOutputStream(){}:构造一个默认的缓冲大小的输出流对象
            成员方法
           public byte[] toByteArray():将内存操作输出流中流对象---数组格式

          ByteArrayInputStream:内存操作输入流
          构造方法:
                public ByteArrayInputStream(byte[] buf):使用指定的字节数组作为缓冲区,构造
          内存操作输入流

  例:
  	//公共定义
  	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);
		}	
	}
	//创建内存操作输出流,写入临时数据
	private static void write(ByteArrayOutputStream baos) throws IOException {	
		
		//创建ByteArrayOutputStream
		//写入数据
		for(int x = 0 ; x < 10 ;  x ++) {
			baos.write(("hello"+x).getBytes());
			//字节流换行
			//写入\r\n
			baos.write("\r\n".getBytes());
		}
		//System.out.println(baos);
		//关闭资源
//		baos.close();临时变量---随着方法完毕就消失了

PrintWriter:字符打印流和PrintStream:字节打印流

PrintWriter:字符打印流
PrintStream:字节打印流
  
  能够操作直接操作文件地址:String pathname的流有哪些?
  			最基本的字节流
  			FileInputStream
  			FileOutputStream
  			
  			FileReader
  			FileWriter
  
  			PrintWriter:能够操作文件(目标文件)  -- 字符输出流一种
  
          构造方法:
          public PrintWriter(Writer out,boolean autoFlush):
          第二个参数为true:表示开启自动刷新功能
          public PrintWriter(String fileName):可以操作具体文件路径
          成员方法:
          public void println(XXX x):可以换行
          
      例:
      		//创建字符打印流对象
		PrintWriter pw = new PrintWriter("pw.txt") ;
		
		//打印数据并可以换行
		pw.println("hello");
		pw.println("world");
		pw.println("java");
		//刷新
		pw.flush();
		//关闭资源
		pw.close();

序列化与反序列化

 序列化接口-----没有字段,连成员方法都没有----标记接口 
 序列化的类----内存中进行编码:内容包含:---类产生的字节码文件Person.class 类签名:序列化版本ID 
  									类的成员:
  									  字段(属性)值
  
  
         改动了当前类的一个成员:
         直接进行反序列化就出现了一个异常:
      java.io.InvalidClassException: com.qianfeng_other_stream_05.Person; 
     local class incompatible: stream classdesc serialVersionUID = 	6374026048563988155, 
         local class serialVersionUID = 7013884605889541932

          类似于:每一个类在内存中进行序列化的时候,会产生xxx.class文件产生一个
          serialVersionUID:序列化版本ID			=	100

          反序列化的时候:将类的成员信息改动了----产生一个新的serialVersionUID = 200
          前后类的签名不一致,就会出现异常!
            当前某个成员:transient:不会参与序列化和反序列化

          让当前这个类在序列化和反序列化的时候:产生的版本ID是一个固定值
          在类上有黄色警告线---点击--- 产生一个固定的版本Id值即可!


ObjectOutputStream
          public ObjectOutputStream(OutputStream out)
          序列化:需要将网络中的数据/一些对象转成 "流数据"
          成员方法:
            public final void writeObject(Object obj):将指定的对象写入到序列化流中
 
  ObjectInputStream
         public ObjectInputStream(InputStream in)
          反序列化:将流数据----还原成Java对象/网络数据
         public final Object readObject():将流数据---还原成对象
         
  例:
  	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();
	}
         

类属性集Properites

Properites属性集合类的特有功能
      public Object setProperty(String key, String value):添加键和值
      public Set<String> stringPropertyNames():获取属性列表中的所有的键的集合
      public String getProperty(String key):通过键获取值
  
  例:
  		//创建属性集合类对象
		Properties prop = new Properties() ;
		//public Object setProperty(String key, String value):添加键和值
		prop.setProperty("杨玉环", "27") ;
		prop.setProperty("西施", "25") ;
		prop.setProperty("王昭君", "22") ;
		prop.setProperty("貂蝉", "20") ;
		System.out.println(prop);
		//获取所有的键的集合
		//public Set<String> stringPropertyNames()
		Set<String> set = prop.stringPropertyNames() ;
		for(String key:set) {
			//public String getProperty(String key)
			Object value = prop.get(key) ;
			System.out.println(key+"---"+value);
		}
  
  
  
 public void load(Reader reader):将一些配置文件中的数据加载到属性集合类中
 public void store(Writer writer, String comments)将属性集合类中数据保存到指定的文件中
  Map集合的遍历:
  通用的方式
  			keySet()---->Set<K>
            get(K key)---->V value
            
  需求:
  	在当前项目下user.txt文件  ,如果当前文件中lisi这个键,将它的值改为
 	 78,然后重新将值写入到user.txt文件(既要用到load(Reader r),
  			还要用到store(Writer w,String comments)):
		//将某个文件中的内容加载到属性集合列表中
		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);
	}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值