java基础第19天IO流

扩展:
1. 对象序列化和反序列化生成一个
2. 流的种类:
io包下
扩展nio包下

  1. IO分类:
    输入流 输出流
    字节流 InputStream(抽象类) OutputStream(抽象类)
    字符流 Reader (抽象类) Writer(抽象类)

2.字节流:(重点)
使用场景:
1.字节流处理除了文本、文字相关所有的流问题,如,png/jpg/avi/map4/mp3/exe
2.字符流只处理文本、文字相关(编码乱码问题)

	1.输入流	abstract class InputStream:这个抽象类是表示输入字节流的所有类的超类。
							
						FileInputStream 子类:文件字节输入流
							1. 构造方法
									FileInputStream(String name) 	name:表示(绝对路径、相对路径)文件名
									FileInputStream(File file) 

							2. 普通方法:
								//1. int read(byte[] b) 从输入流读取一些字节数,并将它们存储到缓冲区 b 。  最常用
								//2. int read() 从输入流读取数据的下一个字节。  
								//3. int read(byte[] b, int off, int len) 	从输入流读取最多 len字节的数据到一个字节数组。	
								
								
	2.输出流	abstract class OutputStream:这个抽象类是表示输出字节流的所有类的超类。
							
						FileOutputStream 子类:文件字节输出流
							1. 构造方法
									FileOutputStream(String name) 		name:表示(绝对路径、相对路径)文件名
									FileOutputStream(String name, boolean append) 
									append:表示是否在该文件末尾追加数据,如果为true,表示追加,false,表示从头开始覆盖
									FileOutputStream(File file) 
									FileOutputStream(File file, boolean append) 
							
							2. 普通方法:
								//1. void write(byte[] b, int off, int len) 	将 len字节从位于偏移量 off的指定字节数组写入此文件输出流。  最常用
								//2. void write(byte[] b)将 b.length个字节从指定的字节数组写入此文件输出流。  
								//3. void write(int b) 将指定的字节写入此文件输出流。  
	 3. 注意事项:
		1. 必须要关闭IO流,节约资源开销
		2. 关闭IO流原则,先开后关
  1. IO流工具类的抽取,将所有的关流(字节流和字符流)方法抽取出来,优化代码

  2. 字符流:(重点)
    使用场景:使用于处理文本相关的文件

    Reader 抽象类:
    		子类
    	InputStreamReader(转换流)
    		子类
    	FileReader:适用于读取字符相关的文件
    		1. 构造方法:
    				1.FileReader(File file) 
    				2.FileReader(String fileName)	fileName:文件名(相对路径/绝对路径)
    
    		2. 读取方法:
    				3. int read(char[] c)读取字符到char数组中	最常用
    				2. int read()读取一个字符
    				3. int read(char[] c,int start,int length)读取制定长度的字符到char数组中
    		
    Writer 抽象类:
    		子类
    	OutputStreamWriter(转换流)
    		子类
    	FileWriter:适用于写出字符相关的文件
    		1. 构造方法:
    		 		1.FileWriter(File file) 	默认是false
    				2.FileWriter(File file, boolean append)  
    					append:表示是在文件末尾追加还是从头覆盖,如果true追加,false覆盖,默认是false
    				3.FileWriter(String fileName) 	默认是false
    				4.FileWriter(String fileName, boolean append)  
    					fileName:文件名(相对路径/绝对路径)
    		2. 写出方法:
    				1. public Writer append(CharSequence csq,int start,int end)
    				2. public Writer append(char c)
    				3. public Writer append(CharSequence csq)
    				4. public void write(char[] c)
    				5. public void write(String str)
    				6. public void write(String str,int start,int end)
    
  3. 乱码问题:(掌握)

     GBK:
     	中文2个字节
     	英文、数字:1字节
     UTF-8:	
     	中文3~6个字节
     	英文、数字:1字节
     
     	编码:将字符串转换为字节
      		1. byte[] getBytes()  根据默认字符集将当前字符串转换为字节数组
      		2. byte[] getBytes(String charsetName) 	UTF-8/GBK
      			按照指定的字符集将将当前字符串转换为字节数组
      
      解码:将字节转换为字符
      		1.String(byte[] bytes, int offset, int length) 
      			根据默认字符集将字节数组中从指定下标开始到指定长度结束的数据转换为字符串
      			
      		2.String(byte[] bytes, int offset, int length, String charsetName)
      			根据指定字符集将字节数组中从指定下标开始到指定长度结束的数据转换为字符串
      			charsetName:字符集名	例如 : "GBK"、"UTF-8" 、"ISO-8859-1" 
      		
      		不常用
      		3.String(byte[] bytes) 	根据默认字符集将字节数组转换为字符串
      		4.String(byte[] bytes, String charsetName) 
      			根据默认字符集将字节数组转换为字符串
      
      这里会有乱码问题:
      	产生的原因:
      		1、因为字符集不统一,即编码和解码new String(b,0,read,"gbk")字符集不一致
      		2、因为字节流读取汉字的时候,字节数组长度不够,将一个汉字拆开了
      解决:
      	1. 用字符流用统一的字符集(最常用)
      		
      		浏览器	:	 UTF-8 
      		前台:
      			HTML	:UTF-8
      			CSS		:UTF-8
      			JS、JSP	:UTF-8
      
      		后台:
      			java	:UTF-8
      
      		数据库:
      			mysql、oracle、DB2	:UTF-8
      
      		开发工具:UTF-8
      
     	2. 文本文件用统一的字符集 且用字符流读取和写出文本相关文件(最常用)
      	3. 用一个大的字节数组(一般不用)		
    
  4. 转换流:(重点) 目前唯一一个可以设置字符集的流

     (简单的理解为包装流,就是将字节流包装以下,方便操作文本相关的文件)
     使用场景:
     	别人给提供了字节流,而需要处理文本文件,这时候,就需要用转换流转换一下,更方便处理文本文件
    
     作用:就是一字符流的方式读取或写出文本相关的数据
     
     InputStreamReader:将字节输入流包装一下,让其更适合读取文本文件
     	构造方法:
     	1.InputStreamReader(InputStream in) 创建一个使用默认字符集的InputStreamReader。
     	2.InputStreamReader(InputStream in, String charsetName) 
     				创建一个使用指定字符集的InputStreamReader。  
     	普通方法:
     		public int read(char[] cbuf)
     		int read(char[] cbuf, int offset, int length)  
    
     OutputStreamWriter:将字节输出流包装一下,让其更适合写出文本文件
     	构造方法:
     	1. OutputStreamWriter(OutputStream out) 创建一个使用默认字符编码的OutputStreamWriter。 
     	2. OutputStreamWriter(OutputStream out, String charsetName) 
     			创建一个使用指定字符集的OutputStreamWriter。  
     	普通方法:
     		void write(char[] cbuf, int off, int len)  
     		append(CharSequence csq,int start,int end)
     		
     只有转换流可以设置字符集	
    
  5. jdk7关流的新方式:
    用新结构可以自动关流
    前提:该流必须是实现了一个接口 AutoCloseable
    语法:

     try(
     	//只能写创建流的操作,不能写其他业务操作
     ){
     	//可能有异常的代码
     }catch(异常类型1 e){
     
     	 }...不需要finally关流了
    
  6. 缓冲流:(重点)包装流
    1.概念: 提高读取和写出效率的流
    2.作用: 提高效率
    3.使用场景:以后一律都要使用,以提高效率 建议以后都是用字节或者字符数组的方式复制文件,这样效率最高

     4. BufferedInputStream
     		字节输入缓冲流构造方法:
      		1.BufferedInputStream(InputStream in) 创建一个默认缓冲区大小的缓冲流
     		2.BufferedInputStream(InputStream in, int size)创建一个指定缓冲区大小的缓冲流 BufferedOutputStream
     		字节输出缓冲流构造方法:
     		1.BufferedOutputStream(OutputStream out) 
     		2.BufferedOutputStream(OutputStream out, int size) 
     		
     	BufferedReader
     		 字符输入缓冲流构造方法:
      		1.BufferedReader(Reader in) 创建一个默认缓冲区大小的缓冲流
     		2.BufferedReader(Reader in, int size) 创建一个指定缓冲区大小的缓冲流
     		
     		特殊的读取方法,其他读取方法跟字符流一样:
     			String readLine()读取一行字符串
    
     	BufferedWriter
     		字符输出缓冲流构造方法:
     		1.BufferedWriter(Writer out) 
     		2.BufferedWriter(Writer out, int size) 
     	
     		特殊的写出方法,其他写出方法跟字符流一样:
     			writer(String str)
     			newLine()写出一个换行符
    
  7. 随机访问文件类RandomAccessFile:

    1. 概念:支持随机访问文件内容和随机读取文件内容

    2. 作用:
      1.断点续传
      2.判断空间是否充足,占用空间

    3. 使用:

      1. 构造方法:
        1.RandomAccessFile(String name, String mode)
        创建随机访问文件流,以从中指定名称的文件读取,并可选择写入文件。

         mode - 访问模式:"r"只读 ,"rw"读写 	"rws",或 "rwd" 
        

        2.RandomAccessFile(File file, String mode)
        创建一个随机访问文件流从File参数指定的文件中读取,并可选地写入文件。

      2. 常用方法:

        1. long getFilePointer() 返回此文件中的当前文件的指针位置,不管是读取或写出,指针都会移动位置
          配合seek方法,做断点续传功能

        2. void seek(long pos)
          设置文件指针位置,从该文件的开头测量,发生下一次读取或写入。
          配合getFilePointer方法,做断点续传功能

        3. long length() 返回此文件的大小。

        4. void setLength(long newLength)设置此文件的大小。
          通常用来设置临时文件的大小,以便占用空间

        5. int read(byte[] b) 从该文件读取最多 len个字节的数据到字节数组。

        6. String readLine() 从此文件中读取下一行文本。

        7. void write(byte[] b, int off, int len)
          从指定的字节数组写入 len个字节,从偏移量 off开始写入此文件。

        8. void writeBytes(String s)
          将字符串作为字节序列写入文件。

    4. 注意事项:
      1. 在输出的时候,没有设置文件指针,会从头开始写数据,之前有的数据会被覆盖
      (不会覆盖所有的,而是新数据所占据的位置)

       2. 每次启动程序,默认的指针在文件的开头
      
发布了30 篇原创文章 · 获赞 1 · 访问量 867

猜你喜欢

转载自blog.csdn.net/weixin_45061669/article/details/104849291