1、
import java.util.ArrayList;
public class ArrayListDemo01 {
public static void main(String[] args) {
ArrayList array = new ArrayList<>();
System.out.println(array.add("hello"));
array.add(1,"java");
System.out.println("array:" +array);
}
}
2、
-public Boolean remove(Object o):删除指定的元素,返回删除是否成功
import java.util.ArrayList;
public class ArrayListDemo01 {
public static void main(String[] args) {
ArrayList array = new ArrayList<>();
array.add("hello");
array.add("world");
array.add("java");
// array.add(1,"java");
System.out.println(array.set(2,"javaee"));
System.out.println(array.remove("world"));
System.out.println(array.get(1));
System.out.println(array.size());
System.out.println("array"+array);
}
}
输出结果:
java
true
javaee
2
array[hello, javaee]
3、遍历
import java.util.ArrayList;
public class ArrayListDemo02 {
public static void main(String[] args) {
ArrayList array = new ArrayList<>();
array.add("hello");
array.add("world");
array.add("java");
/* System.out.println(array.get(0));
System.out.println(array.get(1));
System.out.println(array.get(2));*/
for (int i=0;i
4、ArrayList 存储学生对象并遍历
import java.util.ArrayList;
public class ArrayListDemo3 {
public static void main(String[] args) {
//创建集合对象
ArrayList array = new ArrayList<>();
//创建学生对象
Student stu1 = new Student("weblv",30);
Student stu2 = new Student("ljx",23);
//添加学生对象到集合中
array.add(stu1);
array.add(stu2);
//遍历集合,采用通用遍历格式实现
for(int i=0;i
5、ArrayList 存储学生对象并遍历(升级)
import java.util.ArrayList;
import java.util.Scanner;
public class ArrayListDemo04 {
public static void main(String[] args) {
ArrayList array =new ArrayList();
//调用方法
AddStu(array);
AddStu(array);
AddStu(array);
//输出对象
for (int i=0;i array){
//键盘录入学生对象所需的数据
Scanner sc = new Scanner(System.in);
System.out.println("请输入学生姓名:");
String name = sc.nextLine();
System.out.println("请输入学生年龄");
String age = sc.nextLine();
//创建学生对象,把键盘录入的数据赋值给学生对象的成员变量
Student s = new Student();
s.setName(name);
s.setAge(age);
//集合中添加学生对象
array.add(s);
}
}
请输入学生姓名:
hah
请输入学生年龄
13
请输入学生姓名:
xkx
请输入学生年龄
14
请输入学生姓名:
adq
请输入学生年龄
12
hah,13
xkx,14
adq,12
6、
Alt+Ins 根据自己需要构造方法
好处
弊端
在子类方法中访问一个变量
public class Zi extends Fu {
public int age = 20;
public void show(){
int age = 30;
System.out.println(age);
//访问本类的成员变量age
System.out.println(this.age);
//访问父类的成员变量age
System.out.println(super.age);
}
}
子类中所有的构造方法默认都会访问父类中无参的构造方法
如果父类中没有无参构造方法,只有带参构造方法,怎么办?
通过子类对象访问一个方法、
概述:
方法重写的应用:
@Override :帮助我们检查方法重写声明的正确性
1、私有方法不能被重写(父类的私有成员子类是不能继承的)
==子类访问权限不能更低(public > 默认(就是直接void ,没有修饰符) > 私有) ==
public class Person {
public String name;
public String age;
//无参构造
public Person() {
}
//带参构造
public Person(String name,String age){
this.name = name;
this.age = age;
}
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 class Students extends Person{
public Students(){
}
public Students(String name,String age){
super(name,age); // 继承父类中的带参方法
}
public void Study(){
System.out.println("我是学生,我爱学习!");
}
}
1、概述:就是文件夹,对类进行分类管理
2、定义格式 : package 包名.(多级包用.分开)
使用不同包下的类时,简化带包的操作,使用import将其他包导入,并使用其他包下的类
final(最终态):可修饰成员方法,成员变量,类
特点:
1、修饰方法:表明该方法是最终方法,不能被重写
2、修饰变量:表明该变量是常量,不能被再次赋值
3、修饰类:表明该类是最终类,不能被继承
变量是基本类型:final修饰指的是基本类型数据值不能发生改变
变量是引用类型:final修饰指的是引用类型的地址值不能发生改变,但是地址值里面的内容是可以发生改变的
static(静态):可修饰成员方法,成员变量
特点:
1、被类的所有对象共享(这也是我们判断是否使用静态变量关键字的条件)
2、可用通过类名调用,也能使用对象名进行调用(推荐使用类名调用)
public class Student01 {
public String name;
public int age ;
public static String university; //
public void show(){
System.out.println(name + "," + age + "," + university);
}
}
public class staticDemo {
public static void main(String[] args) {
Student01.university = "厦门大学";//直接用类中的参数进行赋值,直接通过类名访问,使得默认值为厦门大学
Student01 s1 = new Student01();
s1.name="lwb";
s1.age=10;
//s1.university="厦门大学";
s1.show();
Student01 s2 =new Student01();
s2.name = "ljx";
s2.age = 11;
s2.show();
}
}
输出
lwb,10,厦门大学
ljx,11,厦门大学
非静态的成员方法:
静态的成员方法:
静态成员只能访问静态成员
猫 cat = new 猫();
也可以 动物 Animal = new 猫();
多态的前提和体现:
package Test01;
public class Animal {
public int age = 40;
public void eat(){
System.out.println("动物吃东西");
}
}
package Test01;
public class Cat extends Animal {
public int age = 20;
public int weight = 10;
@Override
public void eat() {
System.out.println("猫吃鱼");
}
public void playgame(){
System.out.println("猫捉迷藏");
}
}
package Test01;
public class AnimalDemo {
public static void main(String[] args) {
Animal a = new Cat();
System.out.println(a.age);
a.eat();
//a.playgame(); 会报错,因为Animal中没有该方法
}
}
输出
40
猫吃鱼
因为成员方法有重写,而成员变量没有
具体体现:定义方法时,使用父类作为参数,将来在使用的时候,使用具体子类参与操作(多态只能访问共有的功能)
package Test01;
public class AnimalDemo {
public static void main(String[] args) {
//多态
Animal a = new Cat(); //向上转型
a.eat();
((Cat) a).playgame();//向下转型
}
}
输出
猫吃鱼
猫捉迷藏
一个没有方法体的方法应该定义为抽象方法,而类中如果有抽象方法,该类必须定义为抽象类
package Test_Abstract;
public abstract class Animal {//定义抽象类
public abstract void eat();//定义抽象方法
}
public **abstract** clss 类名{}
public **abstract** void 方法名();
抽象类中不一定有抽象方法,有抽象方法的类一定是抽象类
抽象类不能直接实例化
++可以参照多态的方式,通过子类对象实例化,这叫抽象类多态++
抽象类的子类
要么重写抽象类中的所有抽象方法
要么是抽象类
public interface 接口名{}
public class 类名 implements 接口名{}
要么重写接口中的所有抽象方法
要么是抽象类
继承关系,只能单继承,但是可以多层继承
实现关系,可以单实现,也可以多实现,还可以继承一个类的同时实现多个接口
继承关系,可以单继承,也可以多继承
/*
门与报警器
*/
public abstract interface Jumpping {
public abstract void Jump();
}
public interface Alram{
void alarm;
}
public abstract class Door(){
public abstract void open();
public abstract void close();
}
public class AkarnDoor extends Door implements Alarm{
public void open(){//重写方法
//...
}
public void close(){//重写方法
//...
}
public void alram(){//重写方法
//...
}
}
public class 类名{
修饰符 class 类名{
}
}
按照内部类在类中定义的位置不同,可以分为一下两种形式
package InnerOutter;
public class Outer {
private int num = 10;
public class Inner{
private void show(){
System.out.println(num);
}
}
public void method(){//通过外部类调用内部类方法来实现
Inner i = new Inner();
i.show();
}
}
-----------------------------
package InnerOutter;
public class OuterTest {
public static void main(String[] args) {
/* Outer.Inner oi = new Outer().new Inner();
oi.show();*/
Outer o = new Outer();
o.method();
}
}
输出
10
局部内部类是在方法中定义的类,所以外界是无法直接访问的,需要在方法内部创建对象并使用该类可以直接访问外部类的成员,也可以访问方法内的局部变量
package InnerOutter;
public class Outer {
private int num = 10;
public void method(){//通过外部类调用内部类方法来实现
int num2 = 20;
class Inner{
public void show(){
System.out.println(num);
System.out.println(num2);
}
}
Inner i = new Inner();
i.show();
}
}
------------------------------------
package InnerOutter;
public class OuterTest {
public static void main(String[] args) {
/* Outer.Inner oi = new Outer().new Inner();
oi.show();*/
Outer o = new Outer();
o.method();
}
}
输出
10
20
new 类名或接口名(){
重写方法;
}
本质:是一个继承该类或者实现该接口的子类匿名对象
public interface Inter {
void show();
}
-------------------------------
public class Outer {
public void method(){//
Inter i= new Inter(){
@Override
public void show() {
System.out.println("匿名内部类");
}
};
i.show(); // 调用show方法
}
}
-------------------- ---------
package InnerOutter;
public class OuterTest {
public static void main(String[] args) {
/* Outer.Inner oi = new Outer().new Inner();
oi.show();*/
Outer o = new Outer();
o.method();
}
}
输出
匿名内部类
package Inner;
public class Cat implements Jumpping {
@Override
public void junp() {
System.out.println("我会跳高");
}
}
----------------------------------
package Inner;
public interface Jumpping {
void junp();
}
====================================
package Inner;
public class JumppingOperator {
public void method(Jumpping j){
j.junp();
}
}
--------------------------------
package Inner;
public class TestDemo {
public static void main(String[] args) {
Jumpping j = new Cat();
j.junp();
JumppingOperator jo = new JumppingOperator();
jo.method(j);
jo.method(new Jumpping() {//直接通过接口实例化对象调用匿名对象类,不用每次都新建一个类
@Override
public void junp() {
System.out.println("我也会跳高了");
}
});
}
}
输出
我会跳高
我会跳高
我也会跳高了
查看文档
package Math;
public class Math {
public static void main(String[] args) {
System.out.println("开始");
System.exit(0);//中止当前Java虚拟机,非零表示异常
System.out.println("结束");
System.out.println(System.currentTimeMillis());//返回当前时间
}
}
看方法,选中方法,按下crtl+B
通过Alt+Ins中的toString()重写自动生成
通过Alt+Ins中的equals()重写自动生成,把hashmap()方法删除即可
package Inter;
public class InterDeno {
public static void main(String[] args) {
Integer i = Integer.valueOf(100);
System.out.println(i);
Integer i1 = Integer.valueOf("100");
System.out.println(i1);
}
}
输出
100
100
public static String valueOf(int i) 静态方法(String中的方法)
public static int parseInt(String s)静态方法(Integer类中的方法)
package Inter;
/*
int和String的转换
*/
public class InterDeno {
public static void main(String[] args) {
//Int----->String
//方式1
int number = 100;
String s1 = ""+number;
System.out.println(s1);
//方式2 public static String valueOf(int i) 静态方法
String s2 = String.valueOf(number);
System.out.println(s2);
System.out.println("-----------------");
//String------->Int
String s3 ="100";
//方式一 String----->Integer----->int
Integer i = Integer.valueOf(s3);
//public int intValue()
int x = i.intValue();
System.out.println(x);
//方式2
//public static int parseInt(String s)静态方法
int y = Integer.parseInt(s3);
}
}
package Inter;
import java.util.Arrays;
public class IntegerTest {
public static void main(String[] args) {
//定义一个字符串
String s = "91 27 46 38 50";
//用空格获取每一个元素放在数组中
String[] strArray = s.split(" ");
/* for (int i= 0;i
Integer i= Integer.valueOf(100);//手动装箱
Integer ii = 100;//自动装箱
ii = ii.valueOf()+200;//手动装箱
ii += 200;//自动装箱 和上面语句一样结果
//i = i+200;i+200自动拆箱;i = i+200;自动装箱
在使用包装类类型的时候,如果做操作,最好先判断是否为null,只要是对象,在使用前就必须进行不为null的判断
public final String format(Date date):将日期格式化成日期/时间字符串
public Date parse(String source):从给定字符串的开始解析文本以生成日期
package Date;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateDemo {
public static void main(String[] args) throws ParseException {
Date d1 = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH时mm分ss秒");
String s = sdf.format(d1);
System.out.println(s);
String s1 = "2020-03-16 11:11:11";
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date p = sdf1.parse(s1);
System.out.println(p);
}
}
输出
2020年03月16日 16时16分33秒
Mon Mar 16 11:11:11 CST 2020
package Date;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DateUtils {
public DateUtils() {
}
public static String dateToString(Date date, String format){
SimpleDateFormat sdf = new SimpleDateFormat(format);//按照传入格式创建对象
String s = sdf.format(date); // 把传入的日期转化成指定格式的字符串
return s;
}
public static Date stringToDater(String s, String format) throws ParseException {
SimpleDateFormat sdf = new SimpleDateFormat(format);
Date p = sdf.parse(s); //Artl+Enter创建抛出异常
return p;
}
}
//测试类
package Date;
import java.text.ParseException;
import java.util.Date;
public class DateDemo {
public static void main(String[] args) throws ParseException {
Date d1 = new Date();
String s1 =DateUtils.dateToString(d1,"yyyy年MM月dd日 HH:mm:ss");
System.out.println(s1);
String s2= DateUtils.dateToString(d1, "yyyy年MM月dd日");
System.out.println(s2);
System.out.println("--------------");
String s = "2012-01-01 12:12:12";
Date date = DateUtils.stringToDater(s, "yyyy-MM-dd HH:mm:ss");
System.out.println(date);
}
}
输出
2020年03月16日 16:40:00
2020年03月16日
--------------
Sun Jan 01 12:12:12 CST 2012
==Calendar rightNow = Calendar.getlnstance();==getlnstance()获取Calendar对象,其日历字段已使用当前日期和时间初始化
package Calendar;
import java.util.Calendar;
public class CalendarDemo {
public static void main(String[] args) {
Calendar c = Calendar.getInstance();
int i = c.get(Calendar.YEAR);
int i1 = c.get(Calendar.MONTH) + 1;
int i2 = c.get(Calendar.DATE);
System.out.println(i+"年"+i1+"月");
}
}
输出
2020年3月16日
package Calendar;
import java.util.Calendar;
public class CalendarDemo {
public static void main(String[] args) {
Calendar c = Calendar.getInstance();
int i = c.get(Calendar.YEAR);
int i1 = c.get(Calendar.MONTH) + 1;
int i2 = c.get(Calendar.DATE);
System.out.println(i+"年"+i1+"月"+i2+"日");
System.out.println("-------------");
c.add(Calendar.YEAR,-3);// .add(int field,int amount)将指定的时间量加上或减去给定的日历字段
int k = c.get(Calendar.YEAR);
int k1 = c.get(Calendar.MONTH) + 1;
int k2 = c.get(Calendar.DATE);
System.out.println(k+"年"+k1+"月"+k2+"日");
System.out.println("-------------");
c.set(2058,11,11);// .set(int year,int month,int day)设置当前的年日月
int l = c.get(Calendar.YEAR);
int l1 = c.get(Calendar.MONTH) + 1; //月是从0开始算起的
int l2 = c.get(Calendar.DATE);
System.out.println(l+"年"+l1+"月"+l2+"日");
}
}
输出
2020年3月16日
-------------
2017年3月16日
-------------
2058年12月11日
package Calendar;
import java.util.Calendar;
import java.util.Scanner;
public class Cal {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入你要查询的年份:");
int year = sc.nextInt();
Calendar c = Calendar.getInstance();
c.set(year,2,1);
c.add(Calendar.DATE,-1);
int date = c.get(Calendar.DATE);
System.out.println(year+"年的二月份有"+date+"天");
}
}
输出
请输入你要查询的年份:
2048
2048年的二月份有29天
-try…catch…
//格式
try {
可能出现异常的代码;
}catch (异常类名 变量名){
异常的处理代码;
}
执行流程:
程序从try里面的代码开始执行,出现异常,会自动生成一个异常类对象,该异常对象将被提交给Java运行时系统,当Java运行时系统接收到异常对象时,会到catch中找匹配的异常类,找到后进行异常处理,执行完毕后,程序还可以继续往下执行。
package Exception;
public class Exception {
public static void main(String[] args) {
System.out.println("开始");
method();
System.out.println("结束");
}
public static void method(){
try {
int[] arr = {1,2,3};
System.out.println(arr[3]); //new了一个异常
}catch (ArrayIndexOutOfBoundsException e){//匹配异常输出
//System.out.println("访问索引越界了");
e.printStackTrace();//返回异常信息
}
}
}
方法名 | 说明 |
---|---|
public String getMessage() | 返回此throwable的详细信息字符串 |
public String toString() | 返回此可抛出的简短描述 |
public void printStackTrace() | 把异常信息输出到控制台 |
throws 异常类名;//这个格式是跟在方法的括号后面的
package Exception;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Exception {
public static void main(String[] args) {
System.out.println("开始");
try { //用Artl+Enter添加异常方法
method2();
} catch (ParseException e) {
e.printStackTrace();
}
System.out.println("结束");
}
/* //运行时异常
public static void method() throws ArrayIndexOutOfBoundsException{
int[] arr = {1,2,3};
System.out.println(arr[3]); //new了一个异常
}*/
//编译异常
public static void method2() throws ParseException { //依然需要try....catch进行异常处理,仅仅是将异常抛出
String s = "2020=03-18";
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date d = sdf.parse(s);
System.out.println(d);
}
}
输出
开始
结束
java.text.ParseException: Unparseable date: "2020=03-18"
at java.text.DateFormat.parse(DateFormat.java:366)
at Exception.Exception.method2(Exception.java:28)
at Exception.Exception.main(Exception.java:11)
public class 异常类名 extends Exception{
无参构造
带参构造
}
package Exception;
public class ScoreException extends Exception {
public ScoreException() {
}
public ScoreException(String message) {
super(message);
}
}
package Exception;
import java.lang.*;
public class Teacher {
public void checkScore(int score) throws ScoreException{
if (score < 0 || score >100){
throw new ScoreException("你输入的分数应该在0~100之间"); //自定义抛出异常
}else {
System.out.println("分数正常");
}
}
}
package Exception;
import java.util.Scanner;
public class TeacherTest {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("请输入分数:");
int score = sc.nextInt();
Teacher t = new Teacher();
try {
t.checkScore(score);
} catch (ScoreException e) {
e.printStackTrace();
}
}
}
输出
请输入分数:
199
Exception.ScoreException: 宁输入的分数应该在0~100之间
at Exception.Teacher.checkScore(Teacher.java:7)
at Exception.TeacherTest.main(TeacherTest.java:13)
throw和throws的区别
throw | throws |
---|---|
在方法声明后面,跟的时异常类名 | 用在方法体内,跟的是异常对象名 |
表示出现异常的一种可能性,并不一定会发生这种异常 | 执行throw一定抛出某种移异常 |
表示抛出异常,由该方法的调用者来处理 | 表示抛出异常,由方法体内的语句处理 |
概述
创建Collection集合的对象
package Collection;
import java.util.ArrayList;
import java.util.Collection;
public class Collection01 {
public static void main(String[] args) {
Collection c = new ArrayList<>();
c.add("hello");
c.add("world");
System.out.println(c);
}
}
输出
[hello, world]
Alt+7可以打开看类的窗口
Iterator:迭代器,集合的专用遍历方式
常用方法
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class Collection01 {
public static void main(String[] args) {
Collection c = new ArrayList<>();
c.add("hello");
c.add("world");
c.add("java");
Iterator it = c.iterator();
while (it.hasNext()){
String s = it.next();
System.out.println(s);
}
}
}
输出
hello
world
java
package Collection;
public class Student {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
package Collection;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;
public class CollectionStudent {
public static void main(String[] args) {
Collection sc = new ArrayList();
Student s1 = new Student("张三",19);
Student s2 = new Student("李四",20);
Student s3 = new Student("陈伍",22);
sc.add(s1);
sc.add(s2);
sc.add(s3);
Iterator it = sc.iterator();
while (it.hasNext()){
Student s = it.next();
System.out.println(s.getName() +","+ s.getAge());
}
}
}
输出
张三,19
李四,20
陈伍,22
概述
集合特点
并发修改异常
产生原因
解决方案
boolean hasNext() | 如果此列表迭代器在向前方向遍历列表时具有更多元素,则返回 true 。 |
---|---|
boolean hasPrevious() | 如果此列表迭代器在相反方向遍历列表时具有更多元素,则返回 true 。 |
E next() | 返回列表中的下一个元素,并且前进光标位置。 |
int nextIndex() | 返回由后续调用返回的元素的索引 next() 。 |
E previous() | 返回列表中的上一个元素,并向后移动光标位置。 |
//格式
for(元素数据类型 变量名:数组或者Collection集合){
//在此处使用变量即可,该变量就是元素
}
范例:
int[] arr ={1,2,3,4};
for(int i : arr){
System.out.println(i);
}
package ForDemo;
import java.util.ArrayList;
import java.util.List;
public class For01 {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 5, 4};
for (int i : arr) {
System.out.println(i);
}
System.out.println("------------");
String[] strArr = {"hello", "java"};
for (String s : strArr) {
System.out.println(s);
}
System.out.println("----------");
List lis = new ArrayList();
lis.add("hello");
lis.add("world");
for (String s : lis) {
System.out.println(s);
}
System.out.println("----------");
//内部是个Iterator迭代器,如果抛出并发修改异常,则为迭代器
for (String s : lis) {
if (s.equals("world")) {
lis.add("java");
}
}
}
}
输出
1
2
3
5
4
------------
hello
java
----------
hello
world
----------
Exception in thread "main" java.util.ConcurrentModificationException
at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:909)
at java.util.ArrayList$Itr.next(ArrayList.java:859)
at ForDemo.For01.main(For01.java:30)
void addFirst(E e) | 在该列表开头插入指定的元素。 |
---|---|
void addLast(E e) | 将指定的元素追加到此列表的末尾。 |
getFirst() | 返回此列表中的第一个元素。 |
E getLast() | 返回此列表中的最后一个元素。 |
removeFirst() | 从此列表中删除并返回第一个元素。 |
removeLast() | 从此列表中删除并返回最后一个元素。 |
Set
package List;
import java.util.HashSet;
import java.util.Set;
public class SetDemo {
public static void main(String[] args) {
Set set = new HashSet();
set.add("hello");
set.add("hello");
set.add("hello");
for (String s :set){
System.out.println(s);
}
}
}
输出
hello
特点
public class HashDemo {
public static void main(String[] args) {
Student s1 = new Student("刘德华",45);
//同一个对象多次调用hashCode()方法返回的哈希值是相同的
System.out.println(s1.hashCode());
System.out.println(s1.hashCode());
//默认情况下不同对象的哈希值是不同的
//通过方法重写,可以实现不同对象的哈希值是相同的
Student s2 = new Student("刘德华",45);
System.out.println(s2.hashCode());
}
}
输出
356573597
356573597
1735600054
特点
TreeSet():根据其元素的自然顺序进行排序
TreeSet(Comparator comparator):根据指定的比较器进行排序
package Set;
import java.util.TreeSet;
public class TreeSetDemo {
public static void main(String[] args) {
//这里不能用int,要用包装类型Integer
TreeSet tr = new TreeSet();
tr.add(15);
tr.add(40);
tr.add(30);
tr.add(35);
tr.add(30);
for (Integer i:tr){//自然排序,且不包含重复元素
System.out.println(i);
}
}
}
输出
15
30
35
40
package Set;
public class Student implements Comparable {
private String name;
private int age;
public Student() {
}
public Student(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public int compareTo(Student s) {//按照年龄从小到大排序
//return 1;且为升序
//return 0;认为是重复元素,不会再添加,只能输出一个
//return -1;用降序存储
int num = this.age-s.age;//升序排列,判断大于还是小于或是等于0
int num2 = num==0?this.compareTo(s.name):num;//年龄相同时,按照姓名的字母排序
return num2;
}
}
package Set;
import java.util.TreeSet;
public class TreeSetDemo {
public static void main(String[] args) {
//这里不能用int,要用包装类型Integer
TreeSet tr = new TreeSet();
Student s1 = new Student("西施",24);
Student s2 = new Student("貂蝉",27);
Student s3 = new Student("杨玉环",23);
Student s4 = new Student("王昭君",30);
Student s5 = new Student("林东",30);
tr.add(s1);
tr.add(s2);
tr.add(s3);
tr.add(s4);
for (Student s : tr){
System.out.println(s.getName()+","+s.getAge());
}
}
}
输出
杨玉环,23
西施,24
貂蝉,27
林东,30
王昭君,30
package Set;
import java.util.Comparator;
import java.util.TreeSet;
public class TreeSetDemo {
public static void main(String[] args) {
/* //这里不能用int,要用包装类型Integer
TreeSet tr = new TreeSet();
Student s1 = new Student("西施",24);
Student s2 = new Student("貂蝉",27);
Student s3 = new Student("杨玉环",23);
Student s4 = new Student("王昭君",30);
Student s5 = new Student("林东",30);
tr.add(s1);
tr.add(s2);
tr.add(s3);
tr.add(s4);
for (Student s : tr){
System.out.println(s.getName()+","+s.getAge());
}*/
TreeSet ts = new TreeSet(new Comparator() {//带参构造
@Override
public int compare(Student s1, Student s2) {
int num = s1.getAge()-s2.getAge(); //因为在Student中变量被private修饰
int num2 = num==0?s1.getName().compareTo(s2.getName()):num;
return num2;
}
});
Student s1 = new Student("西施",24);
Student s2 = new Student("貂蝉",27);
Student s3 = new Student("杨玉环",23);
Student s4 = new Student("王昭君",30);
Student s5 = new Student("林东",30);
ts.add(s1);
ts.add(s2);
ts.add(s3);
ts.add(s4);
ts.add(s5);
for (Student s : ts){
System.out.println(s.getName()+","+s.getAge());
}
}
}
输出
杨玉环,23
西施,24
貂蝉,27
林东,30
王昭君,30
需求:用TreeSet集合存储多个学生信息(姓名,语文成绩,数学成绩),并遍历该集合,要求:按照总分从高到低排序
package SetDemo;
import java.util.Comparator;
import java.util.TreeSet;
public class SetTest {
public static void main(String[] args) {
//使用比较器排序进行排序
TreeSet ts = new TreeSet(new Comparator() {
@Override
public int compare(Student s1, Student s2) {
//int num = (s2.getCnScore()+s2.getMathScore())-(s1.getCnScore()+s1.getMathScore());
//主要条件
int num = s2.getSum() - s1.getSum();
//次要条件,保证学生都能存入集合中
int num2 = num == 0 ? s1.getCnScore() - s2.getCnScore() : num;//总分不同各科不同也要存入
int num3 = num2 == 0 ? s1.getName().compareTo(s2.getName()) : num2;//总分,各科相同,人名不同也能存入集合
return num3;
}
});
Student s1 = new Student("张三", 95, 99);
Student s2 = new Student("李四", 96, 90);
Student s3 = new Student("王五", 91, 94);
Student s4 = new Student("陈六", 93, 97);
ts.add(s1);
ts.add(s2);
ts.add(s3);
ts.add(s4);
for (Student s : ts) {
System.out.println(s.getName() + ",总分为" + (s.getSum()));
}
}
}
输出
张三,总分为194
陈六,总分为190
李四,总分为186
王五,总分为185
package SetDemo;
import java.util.HashSet;
import java.util.Random;
import java.util.Set;
public class Setdemo {
public static void main(String[] args) {
Set ts = new HashSet();
Random r = new Random();
while(ts.size()<=10){
ts.add(r.nextInt(20)+1);
}
for (Integer i:ts){
System.out.println(i);
}
}
}
输出
18
2
4
5
7
8
9
10
11
12
15
定义格式
//通过一个类就可以生成很多不同类型的对象
package Gen;
public class Generic {
private T t;
public T getT() {
return t;
}
public void setT(T t) {
this.t = t;
}
}
package Gen;
public class GenericDemo {
public static void main(String[] args) {
Generic g1 = new Generic();
g1.setT("刘德华");
System.out.println(g1.getT());
System.out.println("-----------");
Generic g2 = new Generic();
g2.setT(30);
System.out.println(g2.getT());
}
}
输出
刘德华
-----------
30
定义格式:
package Gen;
/*//泛型类改进
public class Generic{
public void show(T t){
System.out.println(t);
}
}*/
//泛型方法改进
public class Generic{
public void show(T t){
System.out.println(t);
}
}
package Gen;
public class GenericDemo {
public static void main(String[] args) {
Generic g = new Generic();
g.show("林东");
g.show(45);
g.show(true);
g.show(13.45);
}
}
输出
林东
45
true
13.45
定义格式
package Gen;
public class Generic implements Generic01{
@Override
public void show(T t) {
System.out.println(t);
}
}
package Gen;
public interface Generic01 {
void show(T t);
}
package Gen;
public class GenericDemo {
public static void main(String[] args) {
Generic g = new Generic();
g.show("zhang");
Generic g2 = new Generic();
g2.show(45);
}
}
输出
zhang
45
package Gen;
import java.util.ArrayList;
import java.util.List;
public class GenericDemo {
public static void main(String[] args) {
List> l1 = new ArrayList
(可变参数又称参数个数可变,用作方法的形参出现,那么方法参数个数就是可变的了)
1.可变参数注意事项
package Gen;
public class GenericDemo {
public static void main(String[] args) {
System.out.println(sum(10,20,30));
System.out.println(sum(10,20,30,60,70));
System.out.println(sum(10,20,30,40,50,70,80));
System.out.println(sum(10,20,30,40,60,90,100,1000));
}
public static int sum(int b,int... a) {
int sum = 0;
for (int i : a) {
sum = i + sum;
}
return sum;
}
}
输出
60
190
300
1350
2.可变参数的使用
Arrays工具类中有一个静态方法:
List接口中有一个静态方法:
Set接口中有一个静态方法:
方法 | 说明 |
---|---|
V put(K key, V value) | 将指定的值与该映射中的指定键相关联(可选操作)。 |
V put(K key, V value) | 将指定的值与该映射中的指定键相关联(可选操作)。 |
int size() | 返回此地图中键值映射的数量。 |
boolean isEmpty() | 如果此映射不包含键值映射,则返回 true 。 |
void clear() | 从该地图中删除所有的映射(可选操作)。 |
boolean containsKey(Object key) | 如果此映射包含指定键的映射,则返回 true 。 |
boolean containsValue(Object value) | 如果此映射将一个或多个键映射到指定的值,则返回 true 。 |
方法 | 说明 |
---|---|
V get(Object key) | 根据键获取值 |
Set keySet() | 获取所有键的集合 |
Collection values() | 获取所有值的集合 |
Set |
获取所有键值对对象的集合 |
package Map;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MapDemo1 {
public static void main(String[] args) {
Map map = new HashMap();
map.put("刘德华",45);
map.put("chen",45);
map.put("zhasng",45);
System.out.println(map);
System.out.println("------");
System.out.println(map.get("chen"));
System.out.println("------");
Set keySet = map.keySet();
for (String s : keySet){
System.out.println(s);
}
System.out.println("------");
Collection values = map.values();
for (Integer k:values){
System.out.println(k);
}
}
}
输出
{chen=45, 刘德华=45, zhasng=45}
------
45
------
chen
刘德华
zhasng
------
45
45
45
package Map;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;
public class MapDemo1 {
public static void main(String[] args) {
Map map = new HashMap();
map.put("刘德华",45);
map.put("chen",45);
map.put("zhasng",45);
Set> entrySet = map.entrySet();
for (Map.Entry s:entrySet){
//根据键值对对象获取键和值
System.out.println(s.getKey()+","+s.getValue());
}
}
}
package Map;
import javax.lang.model.element.NestingKind;
import java.util.*;
public class MapDemo1 {
public static void main(String[] args) {
Map map = new HashMap();
Student s1 = new Student("Jude", "15");
Student s2 = new Student("Timi", "19");
Student s3 = new Student("Meimei", "17");
Student s4 = new Student("xiaoxiao", "16");
map.put("001", s1);
map.put("002", s2);
map.put("003", s3);
map.put("004", s4);
//1、键找值
Set ms = map.keySet();//获取键的集合
for (String key:ms){
Student value = map.get(key);
System.out.println(key+","+value.getName()+","+ value.getAge());
}
System.out.println("----------");
//2、键值对对象找键和值
Set> set = map.entrySet();
for (Map.Entry s : set) {
String key = s.getKey();
Student value = s.getValue();
//注意value是对象,要用get方法获取名字和年龄
System.out.println(key + "," + value.getName()+","+value.getAge());
}
}
}
输出
001,Jude,15
002,Timi,19
003,Meimei,17
004,xiaoxiao,16
----------
001,Jude,15
002,Timi,19
003,Meimei,17
004,xiaoxiao,16
package Map;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Set;
public class ArrayList01 {
public static void main(String[] args) {
HashMap> hm=new HashMap>();
ArrayList array1 = new ArrayList();
array1.add("赵云");
array1.add("诸葛亮");
ArrayList array2 = new ArrayList();
array2.add("唐僧");
array2.add("孙悟空");
ArrayList array3 = new ArrayList();
array3.add("武松");
array3.add("鲁智深");
hm.put("三国演义",array1);
hm.put("西游记",array2);
hm.put("水浒传",array3);
Set keySet = hm.keySet();//先获得键集合
for (String key :keySet){//遍历键集合获得值
System.out.println(key);
ArrayList value = hm.get(key);
for (String t :value){遍历值输出
System.out.println("\t"+t);
}
}
}
}
输出
水浒传
武松
鲁智深
三国演义
赵云
诸葛亮
西游记
唐僧
孙悟空
package DouDizhu;
import java.util.ArrayList;
import java.util.Collections;
public class PokerDemo {
public static void main(String[] args) {
ArrayList array = new ArrayList();
//定义花色
String[] colors = {"♦", "♣", "♠", "♥"};
//定义数子
String[] numbers = {"2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"};
for (String color : colors) {
for (String number : numbers) {
//装入牌盒
array.add(color + number);
}
}
array.add("小王");
array.add("大王");
//洗牌
Collections.shuffle(array);
ArrayList xiaoArray = new ArrayList();
ArrayList daArray = new ArrayList();
ArrayList changArray = new ArrayList();
ArrayList dpArray = new ArrayList();
for (int i = 0; i < array.size(); i++) {//f发牌
String poker = array.get(i);
if (i >= array.size() - 3) {
dpArray.add(poker);
} else if (i % 3 == 0) {//有多少人就对多少人取余
xiaoArray.add(poker);
} else if (i % 3 == 1) {
daArray.add(poker);
} else if (i % 3 == 2) {
changArray.add(poker);
}
}
//看牌
lookPoker("张飞", xiaoArray);
lookPoker("关羽", daArray);
lookPoker("刘备", changArray);
lookPoker("底牌", dpArray);
}
public static void lookPoker(String name, ArrayList array) {
System.out.print(name + "的牌是:");
for (String poker : array) {
System.out.print(poker + " ");
}
System.out.println();
}
}
输出
张飞的牌是:♠Q ♥A ♣5 ♦9 ♣6 ♥6 大王 ♣4 ♦2 ♦3 ♣10 ♦Q ♠4 ♦J ♣K ♥Q ♦A
关羽的牌是:♦4 ♦5 ♣Q ♠6 ♥8 ♣J ♠A ♦6 ♠2 ♥J ♥7 ♥2 ♦K ♥5 ♦7 ♥10 ♣7
刘备的牌是:♥K ♣3 ♥4 ♠7 ♦8 ♣9 ♦10 小王 ♣8 ♥9 ♠10 ♣2 ♠5 ♠J ♠K ♥3 ♣A
底牌的牌是:♠9 ♠3 ♠8
package DouDizhu;
import java.util.*;
public class PokerDemo {
public static void main(String[] args) {
HashMap hm = new HashMap();
ArrayList array = new ArrayList();
//定义花色
String[] colors = {"♦", "♣", "♠", "♥"};
//定义数子
String[] numbers = {"2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q", "K", "A"};
int index = 0;
for (String number : numbers) {//注意这里不能先花色再数字,不然会排序错误
for (String color : colors) {
hm.put(index, color + number);
array.add(index);//
index++;
}
}
hm.put(index, "大王");
array.add(index);
index++;
hm.put(index, "小王");
array.add(index);
//洗牌
Collections.shuffle(array);
TreeSet xiaoset = new TreeSet();
TreeSet daset = new TreeSet();
TreeSet changset = new TreeSet();
TreeSet dpset = new TreeSet();
for (int i = 0; i < array.size(); i++) {//f发牌
int x = array.get(i);
if (i >= array.size() - 3) {
dpset.add(x);
} else if (i % 3 == 0) {//有多少人就对多少人取余
daset.add(x);
} else if (i % 3 == 1) {
changset.add(x);
} else if (i % 3 == 2) {
xiaoset.add(x);
}
}
//看牌
lookPoker("张飞", xiaoset, hm);
lookPoker("关羽", daset, hm);
lookPoker("刘备", changset, hm);
lookPoker("底牌", dpset, hm);
}
//定义看牌方法,遍历TreeSet集合,获取编号,到HashMap集合找对应的牌
public static void lookPoker(String name, TreeSet ts, HashMap hm) {
System.out.print(name + "的牌是:");
for (Integer key : ts) {
String poker = hm.get(key);
System.out.print(poker + " ");
}
System.out.println();
}
}
输出
张飞的牌是:♦2 ♣2 ♣5 ♥5 ♠7 ♦8 ♣9 ♠9 ♠10 ♠J ♥J ♣Q ♠Q ♣K ♣A ♠A ♥A
关羽的牌是:♠4 ♦5 ♠6 ♥6 ♥7 ♣8 ♠8 ♦9 ♥9 ♦10 ♦J ♣J ♦Q ♥Q ♠K ♥K 大王
刘备的牌是:♠2 ♥2 ♦3 ♣3 ♠3 ♥3 ♦4 ♣4 ♥4 ♦6 ♦7 ♥8 ♣10 ♥10 ♦K ♦A 小王
底牌的牌是:♠5 ♣6 ♣7
1.文件和目录路径名的抽象表示。
方法名 | 说明 |
---|---|
File(File parent, String child) | 从父抽象路径名和子路径名字符串创建新的 File实例。 |
File(String pathname) | 通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。 |
File(String parent, String child) | 从父路径名字符串和子路径名字符串创建新的 File实例。 |
package IOStream;
import java.io.File;
public class IODemo01 {
public static void main(String[] args) {
File f1 = new File("C:\\Users\\hello驴先森\\Desktop\\Java学习笔记\\java.txt");//抽象路径,java实际不存在
System.out.println(f1);
File f2 = new File("C:\\Users\\hello驴先森\\Desktop\\Java学习笔记","java.txt");
System.out.println(f2);
File f3 = new File("C:\\Users\\hello驴先森\\Desktop\\Java学习笔记");
File f4 = new File(f3,"java.txt");
}
}
输出
C:\Users\hello驴先森\Desktop\Java学习笔记\java.txt
C:\Users\hello驴先森\Desktop\Java学习笔记\java.txt
C:\Users\hello驴先森\Desktop\Java学习笔记\java.txt
方法名 | 说明 |
---|---|
boolean createNewFile() | 当且仅当具有该名称的文件尚不存在时,原子地创建一个由该抽象路径名命名的新的空文件。 |
boolean mkdir() | 创建由此抽象路径名命名的目录。 |
boolean mkdirs() | 创建由此抽象路径名命名的目录,包括任何必需但不存在的父目录。 |
package IOStream;
import java.io.File;
import java.io.IOException;
public class IODemo02 {
public static void main(String[] args) throws IOException {
//如果文件不存在,就创建文件,并返回true,如果文件存在,就不创建文件,并返回false
File f1 = new File("C:\\Users\\hello驴先森\\Desktop\\Java学习笔记\\IOStream\\java.text");
System.out.println(f1.createNewFile());
System.out.println("----------");
//如果目录不存在,就创建目录,并返回true,如果目录存在,就不创建目录,并返回false
File f2 = new File("C:\\Users\\hello驴先森\\Desktop\\Java学习笔记\\IOStream\\Javaee");
System.out.println(f2.mkdir());
System.out.println("----------");
//如果目录不存在,就创建文件,并返回true,如果目录存在,就不创建目录,并返回false
File f3 = new File("C:\\Users\\hello驴先森\\Desktop\\Java学习笔记\\IOStream\\Javaweb\\HTML");
System.out.println(f3.mkdirs());
System.out.println("----------");
}
}
输出
true
----------
true
----------
true
----------
方法名 | 说明 |
---|---|
String[] list() | 返回一个字符串数组,命名由此抽象路径名表示的目录中的文件和目录。 |
File[] listFiles() | 返回一个抽象路径名数组,表示由该抽象路径名表示的目录中的文件。 |
boolean isDirectory() | 测试此抽象路径名表示的文件是否为目录。 |
boolean isFile() | 测试此抽象路径名表示的文件是否为普通文件。 |
String getPath() | 将此抽象路径名转换为路径名字符串。 |
String getName() | 返回由此抽象路径名表示的文件或目录的名称。 |
String getAbsolutePath() | 返回此抽象路径名的绝对路径名字符串。 |
boolean exists() | 测试此抽象路径名表示的文件或目录是否存在。 |
绝对路径和相对路径
删除目录时的注意事项:
package IOStream;
import java.io.File;
需求:给定一个路径,通过递归完成遍历该目录下的所有内容,并把所有文件的绝对路径输出在控制台
public class IOSream03 {
public static void main(String[] args) {
File srcFile = new File("C:\\Users\\hello驴先森\\Desktop\\Java学习笔记\\IOStream");
getALL(srcFile);
}
public static void getALL(File srcFile){
File[] fileArray = srcFile.listFiles();
if (fileArray != null){
for (File file:fileArray){
if (file.isDirectory()){
getALL(file);
}else {
System.out.println(file.getAbsolutePath());
}
}
}
}
}
输出
C:\Users\hello驴先森\Desktop\Java学习笔记\IOStream\3.txt
C:\Users\hello驴先森\Desktop\Java学习笔记\IOStream\java.text
C:\Users\hello驴先森\Desktop\Java学习笔记\IOStream\Javaee\1.txt
C:\Users\hello驴先森\Desktop\Java学习笔记\IOStream\Javaee\2.txt
C:\Users\hello驴先森\Desktop\Java学习笔记\IOStream\Javaweb\HTML\4.txt
IO流分类:(按照数据类型来分的)
方法名 | 说明 |
---|---|
void write(byte[] b) | 将 b.length字节从指定的字节数组写入此文件输出流。 |
void write(byte[] b, int off, int len) | 将 len字节从指定的字节数组开始,从偏移量 off开始写入此文件输出流。 |
void write(int b) | 将指定的字节写入此文件输出流。 |
public class IOStream04 {
public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream("C:\\Users\\hello驴先森\\Desktop\\Java学习笔记\\IOStream\\Javaweb\\HTML\\fos.txt");
/* byte[] bys = {97,98,99,100};
fos.write(bys);*/
//byte[] getBytes();返回字符串对应的字节数组
byte[] bytes = "abcdef".getBytes();
fos.write(bytes);
fos.close();
}
}
1.字节流写数据如何实现换行呢?
window:\r\n
linux:\n
mac:\r
2.字节流写数据如何实现追加写入呢?
public FileOutputStream(String name,boolean append)
创建文件输出流以指定的名称写入文件。 如果第二个参数为true ,则字节将写入文件的末尾而不是开头。
package IOStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class IOStream04 {
public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream("C:\\Users\\hello驴先森\\Desktop\\Java学习笔记\\IOStream\\Javaweb\\HTML\\fos.txt",true);
/* byte[] bys = {97,98,99,100};
fos.write(bys);*/
//byte[] getBytes();返回字符串对应的字节数组
byte[] bytes = "abcdef".getBytes();
fos.write(bytes);
}
}
finally:在异常处理时提供finally块来执行所有清除操作。比如说IO流中的释放资源
try{
可能出现异常的代码;
}catch(异常类名 变量名){
异常的处理代码
}finally{
执行所有清楚操作;
}
package IOStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class IOStream04 {
public static void main(String[] args) throws IOException {
FileOutputStream fos = null;//先定义
try {
fos = new FileOutputStream("C:\\Users\\hello驴先森\\Desktop\\Java学习笔记\\IOStream\\Javaweb\\HTML\\fos.txt"); //先定义再初始化对象
fos.write("abcde".getBytes());
}catch (IOException e){
e.printStackTrace();
}finally {
if (fos !=null){ //!!!要先判断是否为空
try {
fos.close();
}catch (IOException e){
e.printStackTrace();
}
}
}
}
}
package IOStream;
import java.io.FileInputStream;
import java.io.IOException;
public class IOStream05 {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("C:\\Users\\hello驴先森\\Desktop\\Java学习笔记\\IOStream\\Javaweb\\HTML\\fos.txt");
/* int by = (fis.read());
while(by!=-1) {
System.out.print((char) by);
by = fis.read();
}*/
//对上面进行优化
int by;
while ((by=fis.read())!=-1){
System.out.print((char) by);
}
fis.close();
}
}
输出
abcde
package IOStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class IOStream {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("C:\\Users\\hello驴先森\\Desktop\\Java学习笔记\\IOStream\\Javaweb\\HTML\\fos.txt");
FileOutputStream fos = new FileOutputStream("C:\\Users\\hello驴先森\\Desktop\\Java学习笔记\\IOStream\\Javaweb\\HTML\\4.txt");
if (fis!=null){
int by;
while ((by=fis.read())!=-1){
fos.write(by);
}
}
fis.close();
fos.close();
}
}
package IOStream;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class IOStream06 {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("C:\\Users\\hello驴先森\\Desktop\\Java学习笔记\\IOStream\\Javaweb\\HTML\\4.txt");
byte[] by = new byte[1024];//1024及其整数倍
int len;
while ((len = fis.read(by))!=-1){
//String(byte[] bytes, int offset, int length) 通过使用平台的默认字符集解码指定的字节子阵列来构造新的 String 。
System.out.println(new String(by,0,len));
}
fis.close();
}
}
输出
abcde
package IOStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
public class IOStream07 {
public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream("C:\\Users\\hello驴先森\\Desktop\\Java学习笔记\\IOStream\\Javaweb\\java\\证件照lv.JPG");
FileInputStream fis = new FileInputStream("C:\\Users\\hello驴先森\\Desktop\\Java学习笔记\\IOStream\\Javaweb\\HTML\\证件照lv.JPG");
byte[] bys = new byte[2048];
if (fis != null) {
int len;
while ((len = fis.read()) != -1) {
fos.write(bys,0,len);//void write(byte[] b, int off, int len) 将 len字节从指定的字节数组开始,从偏移量 off开始写入此文件输出流。
}
}
fis.close();
fos.close();
}
}
构造方法
为什么构造方法需要的是字节流,而不是具体的问价或者路径呢
为什么会出现字符流
编码
package IOStream;
import java.io.UnsupportedEncodingException;
import java.util.Arrays;
public class IOStream08 {
public static void main(String[] args) throws UnsupportedEncodingException {
String s = "中国";
byte[] by = s.getBytes();
/*System.out.println(Arrays.toString(by));//[-28, -72, -83, -27, -101, -67]
*/
/* byte[] bt = s.getBytes("UTF-8");
System.out.println(Arrays.toString(by));//[-28, -72, -83, -27, -101, -67]
*/
// byte[] bt = s.getBytes("GBK");
System.out.println(Arrays.toString(by));//[-42, -48, -71, -6]
/* String ss = new String(by);
System.out.println(ss);//中国*/
/* String ss = new String(by,"UTF-8");
System.out.println(ss);//中国*/
String ss = new String(by,"GBK");
System.out.println(ss);//涓浗
}
}
方法 | 说明 |
---|---|
OutputStreamWriter(OutputStream out) | 创建一个使用默认字符编码的OutputStreamWriter。 |
OutputStreamWriter(OutputStream out, String charsetName) | 创建一个使用命名字符集的OutputStreamWriter。 |
InputStreamReader(InputStream in) | 创建一个使用默认字符集的InputStreamReader。 |
InputStreamReader(InputStream in, String charsetName) | 创建一个使用命名字符集的InputStreamReader。 |
方法名 | 说明 |
---|---|
void write(int c) | 写一个字符 |
void write(char[] cbuf) | 写入一个字符数组 |
void write(char[] cbuf,int off,int len) | 写入字符数组的一部分 |
void write(String str) | 写入一个字符串 |
void write(String str,int off,int len) | 写入一个字符串的一部分 |
方法名 | 说明 |
---|---|
int write() | 一次读一个字符 |
int write(char[] cbuf) | 一次读一个字符数组 |
方法名 | 说明 |
---|---|
BufferedWriter(Writer out) | 创建使用默认大小的输出缓冲区的缓冲字符输出流。 |
BufferedWriter(Writer out, int sz) | 创建一个新的缓冲字符输出流,使用给定大小的输出缓冲区。 |
方法名 | 说明 |
---|---|
BufferedReader(Reader in) | 创建使用默认大小的输入缓冲区的缓冲字符输入流。 |
BufferedReader(Reader in, int sz) | 创建使用指定大小的输入缓冲区的缓冲字符输入流。 |
package IOStream;
import java.io.*;
public class IOStream10 {
public static void main(String[] args) throws IOException {
/* BufferedWriter bw = new BufferedWriter(new FileWriter("C:\\Users\\hello驴先森\\Desktop\\新建文件夹\\bw.txt"));
bw.write("hello\r\n");
bw.write("hello\r\n");
bw.close();*/
BufferedReader br = new BufferedReader(new FileReader("C:\\\\Users\\\\hello驴先森\\\\Desktop\\\\新建文件夹\\\\bw.txt"));
/* int len;
while ((len = br.read()) != -1) {
System.out.print((char) len);
}*/
char[] ch = new char[1024];
int len;
while ((len=br.read(ch))!=-1){
System.out.println(new String(ch,0,len));
}
}
br.close();
}
输出
hello
hello
BufferedWriter:
-void newLine():写一行行分隔符,行分隔符字符串由系统属性定义
BufferedReader
读写数据复制文件的标准过程
String line;
while((line=br.readline()!=-1){
bw.write(line);
bw.newLine();
bw.flush();
}
需求:把ArrayList集合中的字符串数据写入到文本文件中,要求:每一个字符串元素作为文件中的一行数据
package IOStream;
import java.io.*;
import java.util.ArrayList;
public class IOStream10 {
public static void main(String[] args) throws IOException {
ArrayList array = new ArrayList();
array.add("hello");
array.add("world");
array.add("java");
BufferedWriter bw = new BufferedWriter(new FileWriter("C:\\Users\\hello驴先森\\Desktop\\新建文件夹\\java.txt"));
for (String s:array){
bw.write(s);
bw.newLine();
bw.flush();
}
bw.close();
}
}
try…catch…finally
try{
可能出现异常的代码;
}catch(异常名 变量名){
异常的处理代码;
}finally{
执行所有清楚操作;
}
JDK7改进方案
try(定义流对象){
可能出现异常的代码;
}catch(异常名 变量名){
异常的处理代码;
}
//自动释放资源
JDK9改进方案
定义输入流对象;
定义输出流对象;
try(输入流对象:输出流对象){
可能出现异常的代码;
}catch(异常名 变量名){
异常的处理代码;
}
//自动释放资源
System类中有两个静态的成员变量
public static final InputStream in“标准”输入流。 该流已经打开,准备提供输入数据。 通常,该流对应于键盘输入或由主机环境或用户指定的另一个输入源。
public static final PrintStream out“标准”输出流。 此流已经打开并准备好接受输出数据。 通常,此流对应于显示输出或由主机环境或用户指定的另一个输出目标
如何把字节流转换为字符流?用转换流
使用字符流能不能够实现一次读取一行数据呢?可以
但是,一次读取一行数据的方法是字符缓冲流的特有方法
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String line = br.readLine();
System.out.print(line);
打印流分类:
方法名 | 说明 |
---|---|
PrintWriter(String fileName) | 使用指定的文件名创建一个新的PrintWriter,而不需要自动执行行刷新。 |
PrintWriter(Writer out, boolean autoFlush) | 创建一个新的PrintWriter。 |
对象反序列化流
构造方法
方法
package IOStream;
import java.io.*;
import java.util.Properties;
public class IOStream12 {
public static void main(String[] args) throws IOException {
// myStore();
myLoad();
}
private static void myLoad() throws IOException {
Properties prop = new Properties();
FileReader fr = new FileReader("C:\\Users\\hello驴先森\\Desktop\\Java学习笔记\\fw.txt");
prop.load(fr);
fr.close();
System.out.println(prop);
}
private static void myStore() throws IOException {
Properties prop = new Properties();
prop.put("001","zhangsan");
prop.put("002","lisai");
prop.put("003","ahsfsha");
FileWriter fw = new FileWriter("C:\\Users\\hello驴先森\\Desktop\\Java学习笔记\\fw.txt");
prop.store(fw,null);
fw.close();
}
}
输出
{003=ahsfsha, 002=lisai, 001=zhangsan}