学习java—第九天学习笔记

122 阅读5分钟

2019.7.25 NIIT第九天

自言自语:种一棵树最好的时间是十年前,或者现在

一、对象数组

  • 基本类型:int[] arr={1,2,3,}
  • 对象数组:Student[] sr=new Student[3];

存储引用类型

  • 把对象放入数组中,这个对象和数组中的对象指向同一个地址,
  • 改变这个对象的值,数组中的值也会改变,改变数组中的值,对象的值也会改变

二、集合概述

对象数组用来管理相同类型数据,但是数组是定长的

用数组管理动态变化的数据(定长)不合适

一般情况下,不使用数组来管理数据

可以使用集合类中的ArrayList(列表)来管理数据

列表不定长并且具有跟数组类似的功能

三、ArrayList集合

ArrayList()初始容量为10(可指定)

add()方法增加元素

size()方法返回集合中元素的个数

get()方法获取集合中的元素;

set()方法设置集合元素;

remove()方法移除集合中的元素(只移找到的第一个)参数可以写元素内容,也可以写元素下标

四、学生管理系统

//System.exit(0);非0表示系统异常终止
package StudentContral;
import java.util.ArrayList;
import java.util.Scanner;
public class StudentManagerTest {
	static ArrayList<Student> list=new ArrayList();
		public static void showMainUI() {
		    while(true) {
			System.out.println("----------------欢迎来到学生管理系统---------------");
			System.out.println("1、查看所有学生");
	    	System.out.println("2、添加学生");
			System.out.println("3、删除学生");
			System.out.println("4、修改学生");
			System.out.println("5、推出");					
			Scanner s=new Scanner(System.in);
			System.out.println("请输入你的选择");
			int cls=s.nextInt();
			switch(cls) {
			case 1:
				printLisr();
				break;
			case 2:
				addStudent();
				break;
			case 3:
				deleteStudent();
				break;
			case 4:
				updateStudent();
				break;
			case 5:
				System.exit(0);
			default:
				System.out.println("输入错误,请重新输入");break;
			}
    	}
	}
		
	private static void deleteStudent() {
		//输入学生编号
		Scanner s=new Scanner(System.in);
		System.out.println("输入学号:");
		String id=s.nextLine();
		boolean studentIsExist= isstudentIsExist(id);
		//判断学生存在
		if(studentIsExist) {
		//删除学生
			Student ss1=getStudent(id);
			list.remove(ss1);
		}else {
		    System.out.println("该学生不存在");
		}
	}
	private static void updateStudent() {
		Scanner s=new Scanner(System.in);
		System.out.println("输入学号:");
		String id=s.nextLine();
		boolean studentIsExist= isstudentIsExist(id);
		Student ss1=null;
		//判断学生存在
		if(studentIsExist) {
			ss1 = getStudent(id);
			System.out.println("输入姓名:");
			String name=s.nextLine();
			System.out.println("输入年龄:");
			String age=s.nextLine();
			System.out.println("输入地址:");
			String address=s.nextLine();
			ss1.setName(name);
			ss1.setAddress(address);
			ss1.setAge(age);
		}else {
			System.out.println("该学生不存在");
		}
	}
		
	public static Student getStudent(String id) {
		Student ss1=null;
		for (Student student : list) {
			if(student.getId().equals(id)) {
				ss1=student;
			}
		}
		return ss1;
	}
		
	public static boolean isstudentIsExist(String id){
		//判断学号是否存在
		//定义一个标记,判断学号是否存在
		boolean studentIsExist=false;//默认不存在
		for (Student student : list) {
			if(student.getId().equals(id)){
				studentIsExist=true;
			}
		}
		return studentIsExist;
	}
	//添加学生
	public static void addStudent() {
		//1键入一个学生信息
		//创建学生对象并赋值
		//把学生对象放入列表
		Scanner s=new Scanner(System.in);
		System.out.println("输入学号:");
		String id=s.nextLine();
		if(isstudentIsExist(id)) {
			System.out.println("学号已经存在请重新输入");
		}else {
			System.out.println("输入姓名:");
			String name=s.nextLine();
			System.out.println("输入年龄:");
			String age=s.nextLine();
			System.out.println("输入地址:");
			String address=s.nextLine();
			list.add(new Student(id,name,age,address));
		}
	} 

	public static void printLisr() {
		for (Student student : list) {
			System.out.println(student.toString());
		}
	}
	public static void main(String[] args) {
		//显示主界面
		Student s1=new Student("11","22","33","44");
		Student s2=new Student("12","22","33","44");
		Student s3=new Student("13","22","33","44");
		list.add(s1);
		list.add(s2);
		list.add(s3);
		showMainUI();
		//创建一个学生类
		//利用集合完成学生的增删改查,把集合变成成员变量,供所有方法使用
	}

	//student类
	package StudentContral;
	public class Student {
		private String id;
		private String name;
		private String age;
		private String address;
		@Override
		public String toString() {
			return "Student [id=" + id + ", name=" + name + ", age=" + age +
			", address=" + address + "]";
		}
		public Student() {
			super();
		}
		
		public Student(String id, String name, String age, String address) {
			super();
			this.id = id;
		this.name = name;
			this.age = age;
			this.address = address;
		}
		
		public String getId() {
			return id;
		}
		
		public void setId(String id) {
			this.id = id;
		}
		
		public String getName() {
			return name;
		}
		
		public void setName(String name) {
			this.name = name;
		}
		
		public String getAge() {
			return age;
		}
		
		public void setAge(String age) {
			this.age = age;
		}
		
		public String getAddress() {
			return address;
		}
		
		public void setAddress(String address) {
			this.address = address;
		}
	}
}

五、IO流的概念

定义:输入输出流

ps:以内存为参照物

  • I:input;输入 输入内存-> 读入
  • O:output;输出 从内存输出-> 写出

程序运行在内存里->数据写入硬盘

jdk中提供了两个类来操作文件信息的输入和输出

  1. FileWriter 输出到硬盘
  2. FileReader 输入到内存

数据从内存写到硬盘的时候,数据是暂时存放在内存

如果要把数据刷到硬盘上,我们去调用一个flush()方法刷新到硬盘上

	import java.io.FileWriter;
	import java.io.IOException;
	public class IOTest{
		//创建FileWriter
		public static void main(String[] args) throws IOException {
			FileWriter out=new FileWriter("d:\\test.txt");
			out.write("人没有梦想,和咸鱼有什么区别");
			//缓存在内存调用flush()方法,数据才从内存到硬盘
			out.flush();
		}
	}

每次运行程序输出到文件,都会覆盖原来的内容,可以 通过特定方法直接追加

六、flush和close的区别

flush

  • 把内存数据刷到硬盘上 close
  • 把内存数据刷到硬盘上
  • 把输出流给关闭不能再使用FileWriter对象
  • 强行使用时,运行会报错!

在做输入输出操作时,输出流关联到文件后,需要消耗资源(文件正在被使用)

(如果使用flush,一直关联到资源,如果使用close,不再关联资源,释放资源,提升效率)

七、相对路径和绝对路径

FileWriter out=new FileWriter("d:\test.txt");带盘符的路径叫做绝对路径

不带盘符的路径叫相对路径

八、FileWriter的其他写法

  • 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):写一个字符数组的一部分数据

九、FileWriter写入换行以及向文本末尾追加

各系统的换行转义字符:

  •  windows:\r\n
    
  •  linux:\n
    
  •  mac:\r
    

正确的换行: 判断操作系统,然后加转义字符.......

如何实现数据的追加 FileWriter(String fileName, boolean append)

append为true不会覆盖原先内容,默认false覆盖

十、FileReader

构造方法:

  • FileReader(String fileName) 传入一个文件的路径

方法

  • int read() 读取单个字符,可以通过强制类型转换成字符型
	//判断文件是否读完
	int len=0;
	while((len=in.read())!=-1){
		System.out.println((char)len);
	}
  • int read(char[] cbuf) 读取字符,并将字符读入数组
  • 返回的是读到的字符个数!
  • 读到的字符存放在字符数组中!可以一次读取多个字符(可控)

十一、利用FileReader和FileWriter完成文件复制

  • 一个字符一个字符的读写
  • 一批字符一批字符的读写