黑马程序员技术交流社区

标题: 【石家庄黑马JavaEE基础06期】分享基础班9~11天笔记 [打印本页]

作者: 阿里云    时间: 2017-12-8 14:09
标题: 【石家庄黑马JavaEE基础06期】分享基础班9~11天笔记
本帖最后由 阿里云 于 2017-12-8 14:30 编辑

基础班day09
  • 快速生成类代码方法(功能列表在"右键=>Source"中)
    • 设置成员变量(变量很多时,可使用alt+shirt+a批量编辑,协助完成更迅速)
    • 空参构造方法:alt+shirt+s => c => 回车
    • 有参构造方法:alt+shirt+s => o => 回车
    • get/set方法:alt+shirt+s => r (=>按空格勾选,上下选择)=> 回车
    • toString方法:alt+shirt+s => s => 回车
    • 格式化:alt+shirt+s => f => 回车
    • 其他成员方法:直接打方法名 (=> alt+/) => 回车
      • 总结:alt+shirt+s => c/o/r(s)

  • 对象数组
    • 对象名称[] 数组名 = new 对象名称[数组长度];//创建对象数组,对象数组的缺点是长度不可变!
  • 集合类(为了方便对多个对象进行编辑,一个容器类变量)

    • 以前学过的StringBuilder、数组是容器类数组,但不是集合类,ArrayList是常用的集合类
    • 集合类特点
      • 【长度可变!】
      • 【元素为引用数据类型,不能为常量!】(在使用方法时,如果不用new的话形参会影响实参)
    • ArrayList
      • 构造方法:ArrayList()
        • ArrayList 集合名称=new ArrayList();//:泛型,目前E是数据类型,new后面的可以写成<>。
          例如:ArrayList array=new ArrayList<>();//创建集合对象
      • 【直接输出ArrayList名称】时显示:[元素1,元素2...]
      • 添加元素
        • public boolean add(E e);//添加元素,上面创建的是String所以e应该是个String
        • public void add(int index,E element);//在指定的索引处添加一个元素
      • 获取元素
        • public E get(int index);//返回指定索引处的元素
      • 获取长度
        • public int size();//返回集合中元素个数,【size()与for循环、get()配合使用遍历集合】
      • 删除元素
        • public boolean remove(Object o);//删除指定的元素,返回删除是否成功,【如果集合中没有要删除的元素,则返回false】
        • public E remove(int index);//删除指定索引处的元素【返回被删除的元素,例如:删除0索引,会返回0索引处的元素】
      • 修改元素
        • public E set(int index,E element);//修改指定索引处的元素,【返回被修改的元素,也就是指定索引处被修改之前的元素】


  • 获取长度方式

    • 字符串: .length()
    • 数组: .length
    • 集合: .size()
  • 获取元素方式
    • 字符串: .charAt(i)
    • 数组:
    • 集合: .get(i)
  • 替换元素
    • 字符串 .replace(目标字符串,替换后的字符串)
    • 数组 =...
    • 集合: .set(i,E)
  • 在遍历并且删除集合元素时,会受到元素移动影响,所以要倒序遍历或者i--,防止遍历出现问题.
  • 学生管理系统
    • 增加学生类:Student
    • 创建主界面文件:StudentManagerTest
    • 增删改查功能定义在主程序文件的方法中:addStudent、deleteStudent、updateStudent、findAllStudent
    • 解决学号重复等问题,完善程序。
  • 退出系统:System.exit(0);
day10
  • IO流(In/Out stream)
    • 用来处理设备之间的数据传输,可以把数据存储到文件,也可以从文件中读取
    • 实现功能:文件复制,上传文件和下载文件
    • 分类:
      • 按传输方向分:相对于Java程序
        • 输出流(FileWriter):写数据
        • 输入流(FileReader):读数据
      • 按操作数据的方式分
        • 字符流:文本等(今日所讲)
        • 字节流:图片等所有文件

    • 常见应用
      • 文件复制U盘拷贝内容
      • 上传文件(微信图片、QQ空间图片)
      • 下载文件(迅雷)

  • 输出流写数据
    • 步骤
      • 创建输出流对象
        • FileWrite fw=new FileWriter("d:\a.txt");//创建输出流对象。导包;【显示错误之后(或者ctrl+1),选择"Add throws declaration"增加抛出异常】;本条语句做了以下事情:
          • 调用系统资源创建了一个文件,【如果有重名的文件,那么覆盖重名文件!但是不能创建文件夹!】
          • 创建输出流对象
          • 把输出流对象指向文件

      • 调用写数据方法(写数据和刷新)
        • fw.write("IO流你好");//数据写到缓存区,没有写到文件
        • fw.flush();//刷新,这时数据写入了文件;【如果下个语句是close、写入比较少,则此句可以省略,让close实现刷新;如果下个语句是write,则此句不能省略】
        • ...
      • 释放资源【创建流对象时就把关流语句写出来,千万别忘了把close()忘了!】
        • fw.close();//关流,【先检测是否刷新,如果没有的话就会刷新;然后通知系统释放和文件相关的资源;这样其他程序就可以对文件进行删除、编辑等操作了;流释放之后,创建的流对象不能再使用了】

    • 路径
      • 相对路径:与项目的根目录相对,例如:没有写盘符使用相对路径,例如:"a.txt"。根目录指的是项目名称文件夹下,例如:"src\com\itheima\Test01.java"。
      • 绝对路径:以盘符开始的路径,例如:"d:\a.txt",【注意:写两个\是因为\为转义符,两个代表一个】
    • 写数据的5种方法
      • void write(String str);//写一个字符串数据
      • void write(String str,int index,int len);//写一个字符串的一部分数据
      • void write(int ch);//写一个字符数据,这里写int类型的好处是既可以写char类型的数据,也可以写char对应的int类型的值.'a'或97
      • void write(char[] chs);//写一个字符组数据
      • void write(char[] chs,int index,int len);//写一个字符组的一部分数据,【参数为开始索引和长度!】
    • 测试时刷新(项目右键=>Refresh或者F5)项目后,在文件中查看(有时不用手动刷新),显示新文件需要手动刷新。
    • 写数据常见问题
      • \n可以换行,但是window记事本等识别的是\r\n(windows:\r\n; linux:\n; mac:\r),window换行是两个字符\r\n
      • 如何追加写入?在创建对象时:FileWrite fw=new FileWriter("d:\a.txt",true);//【true追加,false不追加!!!!!!!!!】

  • 输入流读数据
    • 步骤
      • 创建输入流对象
        • FileReader fw=new FileReader("d:\a.txt");//读取的文件必须存在,否则报错;读取的文件后缀可以是.java等
      • 调用读数据方法
        int ch;
        String str="";//文件内容
        while((ch=fr.read())!=-1){ str += (char)ch;//System.out.print((char)ch)可以输出,注意输出不要有“ln”换行}//【fr.read()表示一次读取一个字符,返回字符int数据...当读取不到数据时返回-1】
      • 释放资源
        • fr.close();


  • 复制文件
    • 数据源文件=>读数据=>写数据=>目的地文件
    • 步骤
      • 创建输入流和输出流对象
        FileReader fr = new FileReader("a.txt");
        FileWrite fw = new FileWriter("b.txt");
      • 读写数据
        int ch;//注意这里是int类型
        while((ch = fr.read())!= -1){fw.write(ch);}
      • 释放所有资源
        fw.close();
        fr.close();

  • 第二种读取文件方法:一次读一个字符数组数据,相对于之前方法效率更高
    ...//创建对象
    char[] chs = new char[1024];//这里可以是1024的整数倍;
    int len;
    while((len=fr.read(chs))!=-1){System.out.print(new String(chs,0,len));}
    ...//释放资源
  • 第二种复制文件方法:一次读写一个字符数组数据,相对于之前方法效率更高
    ...//创建对象
    char[] chs= new char[1024];
    int len;
    while((len = fr.read())!= -1){  fw.write(chs,0,len);}
    ...//释放所有资源
  • 缓冲流:相对于上面的基本流更高效,所以一般我们使用缓冲流!【重点,以后读取和写入文件选择此方法!】
    • BufferedWriter:高效写入
      • 创建输出流缓冲对象
        • BufferedWriter bw =new BufferedWriter(new FileWriter("bw.txt"));//【构造参数为Writer对象!】
      • 调用写入数据方法 => 【缓冲流与基本流对象用法相同】
      • 释放资源 =>【缓冲流与基本流对象用法相同】
    • BufferedReader:高效读取
      • 创建输入流缓冲对象
        • BufferedReader br =new BufferedReader(new FileReader("br.txt"));//【构造参数为Reader对象!】
      • 调用读取数据方法 => 【缓冲流与基本流对象用法相同】
      • 释放资源 =>【缓冲流与基本流对象用法相同】

  • 缓冲流的特殊功能【必须熟练掌握】
    • BufferedWriter:写入换行符
      • void newLine():写一个换行符,这个换行符由系统决定,实现跨平台
        • bw.write("\r\n"); => bw.newLine();//以后添加换行符用此语句代替

    • BufferedReader:读取文件
      • String readLine():一次读取一行数据,但是不读取换行符
        • 输出一个文件所有数据的标准代码
          • String line;
            while((line=br.readLine())!=null){System.out.println(line);}


    • 利用缓冲流特殊功能复制文本文件【重点,以后复制文件选择此方法!】
      • //创建输入缓冲流对象
        BufferedReader br = new BufferedReader(new FileReader("FileWriterDemo.java"));
        //创建输出缓冲流对象
        BufferedWriter bw = new BufferedWriter(new FileWriter("Copy.java"));
        //一次读写一个字符数组
        char[] chs = new char[1024];
        int len;
        while((len=br.read(chs))!=-1) {bw.write(chs,0,len);}
        //释放资源
        bw.close();
        br.close();

  • 把集合中的数据写入到文本文件

    • //创建集合对象
      ArrayList array = new ArrayList();
      //往集合中添加字符串元素
      array.add("hello");
      array.add("world");
      array.add("java");
      //创建输出缓冲流对象
      BufferedWriter bw = new BufferedWriter(new FileWriter("array.txt"));
      //遍历集合,得到每一个字符串元素,然后把该字符串元素作为数据写到文本文件
      for(int x=0; x<array.size(); x++) {
      String s = array.get(x);bw.write(s);bw.newLine();bw.flush();//这里增加了刷新
      }
      //释放资源
      bw.close();

  • 把文本文件中的数据读取到集合

    • //创建输入缓冲流对象
      BufferedReader br = new BufferedReader(new FileReader("array.txt"));
      //创建集合对象
      ArrayList array = new ArrayList();
      //读取数据,每次读取一行数据,把该行数据作为一个元素存储到集合中
      String line;
      while((line=br.readLine())!=null) {
      array.add(line);
      }
      //释放资源
      br.close();
      //遍历集合
      for(int x=0; x<array.size(); x++) {
      String s = array.get(x);System.out.println(s);
      }

  • 下面是正确的语句,如果文件名相同,创建对象能写在一块,但是记得FileWriter后面的true,【如果没有true,就会出现问题,文件被清空!】   BufferedReader br = new BufferedReader(new FileReader("FileWriterDemo.java"));   BufferedWriter bw = new BufferedWriter(new FileWriter("FileWriterDemo.java",true));
  • 使用【项目名称右键--new--file】新建一个文件等操作。
day11
  • 在原有的学生管理系统中加入两个方法,实现从文件中读取和写入学生信息,代码如下:
    //从文件中读数据到集合
    public static void readData(String fileName,ArrayList array) throws IOException {
    //创建输入缓冲流对象
    BufferedReader br = new BufferedReader(new FileReader(fileName));
    String line;
    while((line=br.readLine())!=null) {
      String[] datas = line.split(",");  Student s = new Student();  s.setId(datas[0]);  s.setName(datas[1]);  s.setAge(datas[2]);  s.setAddress(datas[3]);  array.add(s);
    }
    br.close();
    }
    //把集合中的数据写入文件
    public static void writeData(String fileName,ArrayList array) throws IOException {
    //创建输出缓冲流对象
    BufferedWriter bw = new BufferedWriter(new FileWriter(fileName));
    for(int x=0; x<array.size(); x++) {
      Student s = array.get(x);  StringBuilder sb = new StringBuilder();  sb.append(s.getId()).append(",").append(s.getName()).append(",").append(s.getAge()).append(",").append(s.getAddress());  bw.write(sb.toString());  bw.newLine();  bw.flush();
    }
    bw.close();
    }

    • 去掉main方法中创建的集合,然后创建一个字符串保存文件路径
    • 修改增、删、改、查方法
      • 1 方法的参数修改为文件路径
      • 2 方法中创建新集合,读取文件到新集合
      • 3 修改之后把集合信息写回到文件中
    • 修正main方法中调用方法的参数





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2