Java基础班学习笔记(13)IO流

知识要点:
1:异常(理解)
 (1)程序出现的不正常的情况。
 (2)异常的体系
  Throwable
   |--Error 严重问题,我们不处理。
   |--Exception
    |--RuntimeException 运行期异常,我们需要修正代码
    |--非RuntimeException 编译期异常,必须处理的,否则程序编译不通过
 (3)异常的处理:
  A:JVM的默认处理
   把异常的名称,原因,位置等信息输出在控制台,但是呢程序不能继续执行了。
  B:自己处理
   a:try...catch...finally
    自己编写处理代码,后面的程序可以继续执行
   b:throws
    把自己处理不了的,在方法上声明,告诉调用者,这里有问题
 (4)面试题
  A:编译期异常和运行期异常的区别?
   编译期异常 必须要处理的,否则编译不通过
   运行期异常 可以不处理,也可以处理
  B:throw和throws是的区别
   throw:
    在方法体中,后面跟的是异常对象名,并且只能是一个
    throw抛出的是一个异常对象,说明这里肯定有一个异常产生了
   throws:
    在方法声明上,后面跟的是异常的类名,可以是多个
    throws是声明方法有异常,是一种可能性,这个异常并不一定会产生
 (5)finally关键字及其面试题
  A:finally用于释放资源,它的代码永远会执行。特殊情况:在执行到finally之前jvm退出了
  B:面试题
   a:final,finally,finalize的区别?
   b:如果在catch里面有return,请问finally还执行吗?如果执行,在return前还是后
    会,前。
   
    实际上在中间。这个上课我们讲过
  C:异常处理的变形
   try...catch...finally
   try...catch...
   try...catch...catch...
   try...catch...catch...fianlly
   try...finally
 (6)自定义异常
  继承自Exception或者RuntimeException,只需要提供无参构造和一个带参构造即可
 (7)异常的注意实现
  A:父的方法有异常抛出,子的重写方法在抛出异常的时候必须要小于等于父的异常
  B:父的方法没有异常抛出,子的重写方法不能有异常抛出
  C:父的方法抛出多个异常,子的重写方法必须比父少或者小
 
2:File(掌握)
 (1)IO流操作中大部分都是对文件的操作,所以Java就提供了File类供我们来操作文件
 (2)构造方法
  A:File file = new File("e:\\demo\\a.txt");
  B:File file = new File("e:\\demo","a.txt");
  C:File file = new File("e:\\demo");
    File file2 = new File(file,"a.txt");
 (3)File类的功能(自己补齐)
  A:创建功能
  B:删除功能
  C:重命名功能
  D:判断功能
  E:获取功能
  F:高级获取功能
  G:过滤器功能
 (4)案例:
  A:输出指定目录下指定后缀名的文件名称
   a:先获取所有的,在遍历的时候判断,再输出
   b:先判断,再获取,最后直接遍历输出即可
  B:批量修改文件名称

 ==============================================================

知识要点:
1:递归(理解)
 (1)方法定义中调用方法本身的现象
  举例:老和尚给小和尚讲故事,我们学编程
 (2)递归的注意事项;
  A:要有出口,否则就是死递归
  B:次数不能过多,否则内存溢出
  C:构造方法不能递归使用
 (3)递归的案例:
  A:递归求阶乘
  B:兔子问题
  C:递归输出指定目录下所有指定后缀名的文件绝对路径
  D:递归删除带内容的目录(小心使用)
 
2:IO流(掌握)
 (1)IO用于在设备间进行数据传输的操作
 (2)分类:
  A:流向
   输入流 读取数据
   输出流 写出数据
  B:数据类型
   字节流
     字节输入流
     字节输出流
   字符流
     字符输入流
     字符输出流
  注意:
   a:如果我们没有明确说明按照什么分,默认按照数据类型分。
   b:除非文件用windows自带的记事本打开我们能够读懂,才采用字符流,否则建议使用字节流。
 (3)FileOutputStream写出数据
  A:操作步骤
   a:创建字节输出流对象
   b:调用write()方法
   c:释放资源
   
  B:代码体现:
   FileOutputStream fos = new FileOutputStream("fos.txt");
   
   fos.write("hello".getBytes());
   
   fos.close();
   
  C:要注意的问题?
   a:创建字节输出流对象做了几件事情?
   b:为什么要close()?
   c:如何实现数据的换行?
   d:如何实现数据的追加写入?
 (4)FileInputStream读取数据
  A:操作步骤
   a:创建字节输入流对象
   b:调用read()方法
   c:释放资源
   
  B:代码体现:
   FileInputStream fis = new FileInputStream("fos.txt");
   
   //方式1
   int by = 0;
   while((by=fis.read())!=-1) {
    System.out.print((char)by);
   }
   
   //方式2
   byte[] bys = new byte[1024];
   int len = 0;
   while((len=fis.read(bys))!=-1) {
    System.out.print(new String(bys,0,len));
   }
   
   fis.close();
 (5)案例:2种实现
  A:复制文本文件
  B:复制图片
  C:复制视频
 (6)字节缓冲区流
  A:BufferedOutputStream
  B:BufferedInputStream
 (7)案例:4种实现
  A:复制文本文件
  B:复制图片
  C:复制视频
 
3:自学字符流
 IO流分类
  字节流:
   InputStream
    FileInputStream
    BufferedInputStream
   OutputStream
    FileOutputStream
    BufferedOutputStream
 
  字符流:
   Reader
    FileReader
    BufferedReader
   Writer
    FileWriter
    BufferedWriter
================================================
知识要点:
 
1:字符流(掌握)
 (1)字节流操作中文数据不是特别的方便,所以就出现了转换流。
    转换流的作用就是把字节流转换字符流来使用。
 (2)转换流其实是一个字符流
  字符流 = 字节流 + 编码表
 (3)编码表
  A:就是由字符和对应的数值组成的一张表
  B:常见的编码表
   ASCII
   ISO-8859-1
   GB2312
   GBK
   GB18030
   UTF-8
  C:字符串中的编码问题
   编码
    String -- byte[]
   解码
    byte[] -- String
 (4)IO流中的编码问题
  A:OutputStreamWriter
   OutputStreamWriter(OutputStream os):默认编码,GBK
   OutputStreamWriter(OutputStream os,String charsetName):指定编码。
  B:InputStreamReader
   InputStreamReader(InputStream is):默认编码,GBK
   InputStreamReader(InputStream is,String charsetName):指定编码
  C:编码问题其实很简单
   编码只要一致即可
 (5)字符流
  Reader
   |--InputStreamReader
    |--FileReader
   |--BufferedReader
  Writer
   |--OutputStreamWriter
    |--FileWriter
   |--BufferedWriter
 (6)复制文本文件(5种方式)
 
2:IO流小结(掌握)
 IO流
  |--字节流
   |--字节输入流
    InputStream
     int read():一次读取一个字节
     int read(byte[] bys):一次读取一个字节数组
   
     |--FileInputStream
     |--BufferedInputStream
   |--字节输出流
    OutputStream
     void write(int by):一次写一个字节
     void write(byte[] bys,int index,int len):一次写一个字节数组的一部分
     
     |--FileOutputStream
     |--BufferedOutputStream
  |--字符流
   |--字符输入流
    Reader
     int read():一次读取一个字符
     int read(char[] chs):一次读取一个字符数组
     
     |--InputStreamReader
      |--FileReader
     |--BufferedReader
      String readLine():一次读取一个字符串
   |--字符输出流
    Writer
     void write(int ch):一次写一个字符
     void write(char[] chs,int index,int len):一次写一个字符数组的一部分
     
     |--OutputStreamWriter
      |--FileWriter
     |--BufferedWriter
      void newLine():写一个换行符
     
      void write(String line):一次写一个字符串
 
3:案例(理解 练习一遍)
 A:复制文本文件 5种方式(掌握)
 B:复制图片(二进制流数据) 4种方式(掌握)
 C:把集合中的数据存储到文本文件
 D:把文本文件中的数据读取到集合并遍历集合
 E:复制单级文件夹
 F:复制单级文件夹中指定的文件并修改名称
  回顾一下批量修改名称
 G:复制多级文件夹
 H:键盘录入学生信息按照总分从高到低存储到文本文件
 I:把某个文件中的字符串排序后输出到另一个文本文件中
 J:用Reader模拟BufferedReader的特有功能
 K:模拟LineNumberReader的特有功能
=======================================================
 
1:登录注册IO版本案例(掌握)
 要求,对着写一遍。
   
 cn.itcast.pojo User
 cn.itcast.dao UserDao
 cn.itcast.dao.impl UserDaoImpl(实现我不管)
 cn.itcast.game GuessNumber
 cn.itcast.test UserTest
 
2:数据操作流(操作基本类型数据的流)(理解)
 (1)可以操作基本类型的数据
 (2)流对象名称
  DataInputStream
  DataOutputStream
 
3:内存操作流(理解)
 (1)有些时候我们操作完毕后,未必需要产生一个文件,就可以使用内存操作流。
 (2)三种
  A:ByteArrayInputStream,ByteArrayOutputStream
  B:CharArrayReader,CharArrayWriter
  C:StringReader,StringWriter
 
4:打印流(掌握)
 (1)字节打印流,字符打印流
 (2)特点:
  A:只操作目的地,不操作数据源
  B:可以操作任意类型的数据
  C:如果启用了自动刷新,在调用println()方法的时候,能够换行并刷新
  D:可以直接操作文件
   问题:哪些流可以直接操作文件呢?
   看API,如果其构造方法能够同时接收File和String类型的参数,一般都是可以直接操作文件的
 (3)复制文本文件
  BufferedReader br = new BufferedReader(new FileReader("a.txt"));
  PrintWriter pw = new PrintWriter(new FileWriter("b.txt"),true);
 
  String line = null;
  while((line=br.readLine())!=null) {
   pw.println(line);
  }
 
  pw.close();
  br.close();
   
5:标准输入输出流(理解)
 (1)System类下面有这样的两个字段
  in 标准输入流
  out 标准输出流
 (2)三种键盘录入方式
  A:main方法的args接收参数
  B:System.in通过BufferedReader进行包装
   BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
  C:Scanner
   Scanner sc = new Scanner(System.in);
 (3)输出语句的原理和如何使用字符流输出数据
  A:原理
   System.out.println("helloworld");
   
   PrintStream ps = System.out;
   ps.println("helloworld");
  B:把System.out用字符缓冲流包装一下使用
   BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
 
6:随机访问流(理解)
 (1)可以按照文件指针的位置写数据和读数据。
 (2)案例:
  A:写数据
  B:读数据
  C:获取和改变文件指针的位置
 
7:合并流(理解)
 (1)把多个输入流的数据写到一个输出流中。
 (2)构造方法:
  A:SequenceInputStream(InputStream s1, InputStream s2)
  B:SequenceInputStream(Enumeration<? extends InputStream> e)
 
8:序列化流(理解)
 (1)可以把对象写入文本文件或者在网络中传输
 (2)如何实现序列化呢?
  让被序列化的对象所属类实现序列化接口。
  该接口是一个标记接口。没有功能需要实现。
 (3)注意问题:
  把数据写到文件后,在去修改类会产生一个问题。
  如何解决该问题呢?
   在类文件中,给出一个固定的序列化id值。
   而且,这样也可以解决黄色警告线问题
 (4)面试题:
  什么时候序列化?
  如何实现序列化?
  什么是反序列化?
 
9:Properties(理解)
 (1)是一个集合类,Hashtable的子类
 (2)特有功能
  A:public Object setProperty(String key,String value)
  B:public String getProperty(String key)
  C:public Set<String> stringPropertyNames()
 (3)和IO流结合的方法
  把键值对形式的文本文件内容加载到集合中
  public void load(Reader reader)
  public void load(InputStream inStream)
 
  把集合中的数据存储到文本文件中
  public void store(Writer writer,String comments)
  public void store(OutputStream out,String comments)
 (4)案例:
  A:根据给定的文件判断是否有键为"lisi"的,如果有就修改其值为100
  B:写一个程序实现控制猜数字小游戏程序不能玩超过5次
 
10:NIO(了解)
 (1)JDK4出现的NIO,对以前的IO操作进行了优化,提供了效率。但是大部分我们看到的还是以前的IO
 (2)JDK7的NIO的使用
  Path:路径
  Paths:通过静态方法返回一个路径
  Files:提供了常见的功能
   复制文本文件
   把集合中的数据写到文本文件
posted @ 2015-06-15 00:15  苏坡漫  阅读(132)  评论(0编辑  收藏  举报