疯狂Java学习笔记(021)

--------------------------------------------------------------

练习:

题1:有一个文本文件如下,数字之间空格分隔

  将其中的数字实现倒序排列并保存到另一个文本文件中,一个数字一行

  9 5 2 7

  6 5 2

结果文件:

9

7

6

5

5

2

2

public static void main(String[] args) throws Exception { //读取数据 BufferedReader br = new BufferedReader(new FileReader("a.txt")); // TreeSet<String> set = new TreeSet<>(new Comparator<String>() { @Override public int compare(String o1, String o2) { return o2.compareTo(o1); } }); int x = 0; // String line = null; while((line = br.readLine()) != null){ String[] split = line.split(" "); //放到集合中时,不能只放数字,需要让它唯一. //数字_数字 for (String n : split) { set.add(n+"_"+x++);//9_0 9_1  } } //  br.close(); //创建输出流 FileWriter fw = new FileWriter("b.txt"); //变量集合,将元素中的数字写出到文件中 for(String n : set){ fw.write(n.split("_")[0]); //换行 fw.write("\r\n"); } //  fw.close(); }

题2:一个文本文件的内容如下:

001 toms 10

002 Tyson 20

003 Jerry 12

其中的内容一行表示的是一个学生对象的基本信息,信息用空格分隔

尝试将其中的文本信息解析成学生对象,并保存在一个学生集合中

public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new FileReader("stu.txt")); // ArrayList<Student> list = new ArrayList<Student>(); String line = null; while((line = br.readLine()) != null){ String[] info = line.split(" "); String id = info[0]; String name = info[1]; int age = Integer.parseInt(info[2]); // Student s = new Student(id, name, age); list.add(s); } br.close(); // for (Student stu : list) { System.out.println(stu); } }

练习题:

1.将集合中的元素保存到文件中
重点:
    集合的遍历,输出流的选择:由于一般都是文本文件,并且一个元素占用一行,所以最好选择缓冲字符流,可以方便实现换行.
    
2.将文件中的数据读取到集合中
重点:
    集合的选择!由于文件中的内容有可能是重复的,在选择集合的时候,就不能选择元素是唯一的集合,那样,将导致文件内容的丢失!

3.将两个路径的文件进行汇总!
重点:
    汇总的文件输出流必须在所有的文件都合并完之后再关闭,不能提前关闭!

4.随机获取文本文件的一行
重点:
    文本文件中的内容只能是顺序读取,而集合中的元素是可以随机的获取的,所以需要将文件中的行转换成集合中的元素.

5.复制单级文件夹下的文件 重点: 流的选择:由于文件的类型多种,并不固定是文本文件,所以在流的选择上,应该使用万能的字节流. 6.复制多级文件夹下的所有文件 重点: 递归的方法调用! java第二API:commons-io. https://mvnrepository.com/ -> 互联网上jar包的仓库!!!配合maven使用! 7.复制指定类型文件并改名 重点: 指定类型的文件判断:对文件名必须转换成统一的大小写再使用endsWith方法判断! 改名:使用renameTo方法需要注意必须在同一个文件夹下才是改名!

8.录入名字字符串并排序至文件

重点:

由于有排序,考虑使用TreeSet,但是注意重复字符串的处理!

以下是课上的代码,并没有考虑到这个点!

/*
 * 需求:
    从键盘录入5个人的姓名,对其排序后存入文本文件
 */
public class SortNameDemo { public static void main(String[] args) throws Exception { Scanner sc = new Scanner(System.in); //创建集合,用于对名字排序 TreeSet<String> set = new TreeSet<>(); //遍历输入元素 for(int i = 1;i<=5;i++){ System.out.println("输入第 " + i + " 个人的姓名: "); set.add(sc.nextLine()); } BufferedWriter bw = new BufferedWriter(new FileWriter("name.txt")); //遍历集合,将元素存入文件 for (String name : set) { bw.write(name); bw.newLine(); } //  bw.close(); } }
9.将无序字符排序后保存至文件


10.修改文本文件的内容
重点:
    对同一个文件先开输入流,再开输出流.不要交叉!!!

11.统计各个字符的个数
使用IO模拟学生管理系统:
/*
 * 题意:
使用文件保存多个学生信息,在程序中提供查询,添加,删除功能
 */

重点:随时使用流,随时就能写出来!并且准确的判断使用字符流还是字节流方便!
public class StudentManageDemo {

    // 将扫描器提升到成员位置
    static Scanner sc = new Scanner(System.in); public static void main(String[] args) throws Exception { while (true) { System.out.println("1.查询\t2.添加\t3.删除\t4.修改\t5.退出"); int op = sc.nextInt(); if (op == 1) { search(); } else if (op == 2) { add(); } else if (op == 3) { delete(); } else if (op == 4) { modify(); } else { System.out.println("ByeBye"); break; } } } // 按学号查询 private static void search() throws Exception { // System.out.println("输入要查询的学号:"); String id = sc.next(); if (check(id)) { // 读取文件,将对应学号的信息显示: BufferedReader br = new BufferedReader(new FileReader("info.txt")); String line = null; while ((line = br.readLine()) != null) { if (line.startsWith(id)) { String[] split = line.split("_"); String num = split[0]; String name = split[1]; String mark = split[2]; System.out.println("学号:\t姓名:\t成绩:"); System.out.println(num + "\t" + name + "\t" + mark); break; } } br.close(); } else { System.out.println("此学号不存在!"); } } // 删除学生信息 private static void delete() throws Exception { System.out.println("输入要删除的学号:"); String id = sc.next(); if (check(id)) { BufferedReader br = new BufferedReader(new FileReader("info.txt")); ArrayList<String> list = new ArrayList<String>(); String line = null; while ((line = br.readLine()) != null) { list.add(line); } //  br.close(); BufferedWriter bw = new BufferedWriter(new FileWriter("info.txt")); // 遍历集合,找到指定的学号对应的信息,不写回源文件.其余的都写回源文件 for (String info : list) { if (!info.startsWith(id)) { bw.write(info); bw.newLine(); } } bw.close(); System.out.println("学号 : " + id + " 删除成功"); } else { System.out.println("你输入的学号不存在!!!"); } } // 修改指定学号的信息 private static void modify() throws Exception { System.out.println("输入学号:"); String id = sc.next(); // 查询此学号是否可用 if (check(id)) { System.out.println("输入新姓名:"); String name = sc.next(); System.out.println("输入新成绩:"); int mark = sc.nextInt(); // 打开文件,写入新数据 BufferedReader br = new BufferedReader(new FileReader("info.txt")); ArrayList<String> list = new ArrayList<String>(); String line = null; while ((line = br.readLine()) != null) { list.add(line); } //  br.close(); // 遍历集合,将指定的学号对应的数据进行修改,再写回 BufferedWriter bw = new BufferedWriter(new FileWriter("info.txt")); for (String info : list) { if (info.startsWith(id)) { bw.write(id + "_" + name + "_" + mark); bw.newLine(); } else { bw.write(info); bw.newLine(); } } //  bw.close(); System.out.println("修改成功!!!"); } else { System.out.println("学号不存在!"); } } private static void add() throws Exception { System.out.println("输入学号:"); String id = sc.next(); // 查询此学号是否可用 if (!check(id)) { System.out.println("输入姓名:"); String name = sc.next(); System.out.println("输入成绩:"); int mark = sc.nextInt(); // 打开文件,写入新数据,追加模式!!! FileWriter fw = new FileWriter("info.txt", true); fw.write(id + "_" + name + "_" + mark); fw.write("\r\n"); fw.close(); } else { System.out.println("学号已经存在!"); } } // 查询学号是否可用 // true : 说明已经存在 // false : 说明不存在,可用! private static boolean check(String id) throws Exception { // 读取文件,拿到所有的学号,比对, BufferedReader br = new BufferedReader(new FileReader("info.txt")); String line = null; while ((line = br.readLine()) != null) { if (line.split("_")[0].equals(id)) { return true; } } br.close(); return false; } }

猜你喜欢

转载自www.cnblogs.com/akinodoo/p/10048573.html
今日推荐