初学Java总结(三)

File

import java.io.File;
import java.io.IOException;

public class FileDemo1 {
	
	public static void main(String[] args) throws IOException {
		//创建File类对象
		//在创建对象过程中不会去检测真实的路径
		//只是在根据给定的路径创建对象
		File file=new File("D:\\a.txt");//此时未在该目录下创建真实的文件
		//重命名---剪切(路径不一样)
		file.renameTo(new File("D:\\javase\\2.txt"));//文件存储的路径
		//创建文件---空文件
		//boolean b=file.createNewFile();
		//创建文件夹---目录
		//不仅可以创建文件夹或者目录还可以创建多级目录
		//boolean b=file.mkdirs();
		//可以删除文件(有无内容),删除空目录
		//直接删除---不会放在回收中
		boolean b=file.delete();
		System.out.println(b);//删除成功返回true
		//返回目录或者文件的名称
		System.out.println(file.getName());
		//返回所在目录路径
		System.out.println(file.getParent());
		//返回所在位置的路径以及名称
		System.out.println(file.getPath());
	}
}
  • 获取当前目录下的所有文件以及文件夹
public class FileDemo2 {
	
	public static void main(String[] args) {
		//创建文件类对象
		File file=new File("D:\\");
		//获取当前目录下的所有文件以及文件夹的信息
		File[] fs=file.listFiles();
		//遍历数组
		for (File f : fs) {
			System.out.println(f);
		}	
		//判断是否是文件
		System.out.println(file.isFile());
		//判断是否是文件夹---目录
		System.out.println(file.isDirectory());
	}
}
  • 删除文件
public class FileText1 {
	public static void main(String[] args) {
		//获取文件类对象
		File file=new File("D:\\a");
		//调用方法
		deleFile(file);
	}
	
	//删除文件
	public static void deleFile(File file){
		//判断是否是文件夹
		if(file.isDirectory()){
			//获取当前文件夹下所有的信息
			File[] fs=file.listFiles();
			//遍历数组
			for (File f : fs) {
				//把数组里的每一个文件类对象再次传入到本方法中
				deleFile(f);
			}
		}
		//删除文件---删除空目录
		file.delete();
	}
}

IO流

  • 四大基本流
    在这里插入图片描述
  • FileWriter fw=new FileWriter(“D:\1.txt”);
    fw.write(“hahahaahhaha”);//开发时需要处理异常
    fw.flush();//冲刷缓冲区
    fw.close();
    //强制对象值为null
    //把对象置为无用对象,在某个时间进行垃圾回收
    fw=null;
  • FileReader reader=new FileReader(“D:\2.txt”);
    //读取数据
    //返回的是读取到字符的编码值
    //读取结束的标志就是返回-1
    System.out.println((char)reader.read());
    int len=-1;//提供变量供给读取数据覆盖
    while((len=reader.read())!=-1){//避免读取两次情况
    System.out.println(len);
    }
    //关流—输入流没有缓冲区
    reader.close();
  • 自建缓冲区
char[] cs=new char[3];
		int len=-1;
		//reader.read(字符数组)--返回值就是每次读取到的字符个数
		while((len=reader.read(cs))!=-1){//读取到的内容存放到数组
			System.out.println(new String(cs,0,len));
		}		
  • 利用文件流进行文件复制
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		long start=System.currentTimeMillis();
		FileReader reader=new FileReader("D:\\b.txt");//文件不存在会报错
		FileWriter writer=new FileWriter("D:\\a.txt");//文件不存在会新建
		char[] c=new char[1024*64];//自建缓冲区
		int count=-1;
		while((count=reader.read(c))!=-1){
			writer.write(c);
			writer.flush();
		}
		reader.close();
		writer.close();
		reader=null;
		writer=null;
		long end=System.currentTimeMillis();
		System.out.println(end-start);
	}
}
  • 字节流
//创建字节输出流对象---没有缓冲区  true表明文件可追加,即不删除原有信息
		FileOutputStream os=new FileOutputStream("D:\\c.txt",true);
		//写出数据
		os.write("中".getBytes());//获取字节数组
FileInputStream fis=new FileInputStream("D:\\1.txt");
		//读取数据  结束标志是-1
		//System.out.println(is.read());
		//自建缓冲区
		byte[] bs=new byte[10];
		int len=-1;
		while((len=fis.read(bs))!=-1){
			System.out.println(new String(bs,0,len));
		}
  • BufferedReader
BufferedReader br=new BufferedReader(new FileReader("D:\\a123.txt"));
		//读取一行---结束标志null
		String str="";
		while((str=br.readLine())!=null){
			System.out.println(str);
		}
BufferedWriter bw=new BufferedWriter(new FileWriter("D:\\b.txt"));
		//写出数据
		bw.write("abc");
		bw.newLine();//换行---不管具体什么的操作系统
		bw.write("123");

合并流

public class SequenceInputStreamDemo {
	
	public static void main(String[] args) throws IOException {
		//提供输入流---提供待合并的数据
		FileInputStream in1=new FileInputStream("D:\\a1.txt");
		FileInputStream in2=new FileInputStream("D:\\a2.txt");
		FileInputStream in3=new FileInputStream("D:\\a3.txt");
		
		//创建Vector集合对象
		Vector<FileInputStream> v=new Vector<>();
		//把输入流对象添加到集合中
		v.add(in1);
		v.add(in2);
		v.add(in3);
		
		//获取到Enumeration---把集合中的所有输入流对象存放到e对象中
		Enumeration<FileInputStream> e=v.elements();
		
		//创建合并流对象---把含有输入流对象的e放到合并流对象中
		SequenceInputStream sis=new SequenceInputStream(e);
		
		//文件字节输出流
		FileOutputStream os=new FileOutputStream("D:\\a2.txt");
		//通过合并流对象进行统一读取数据---合并
		byte[] bs=new byte[1024*1024*10];
		int len=-1;
		while((len=sis.read(bs))!=-1){
			//写出合并之后的数据
			os.write(bs, 0, len);
		}
		//关流
		sis.close();
		os.close();	
	}
}
  • 序列化
public class ObjectOutputStreamDemo {
	public static void main(String[] args) throws IOException {
		//创建对象
		Person p=new Person();
		//给对象属性赋值
		p.setName("lili");
		p.setAge(10);
		//开始进行序列化---创建序列化类的对象
		ObjectOutputStream oos=new ObjectOutputStream
				(new FileOutputStream("p.data"));
		//写出对象
		oos.writeObject(p);//把对象进行序列化
		//关流
		oos.close();
	}
}
  • 反序列化
public class ObjectInputStreamDemo {
	public static void main(String[] args) throws IOException, ClassNotFoundException {
		//创建反序列化对象
		ObjectInputStream ois=new ObjectInputStream
				(new FileInputStream("p.data"));
		//读取对象---保证获取的是传入的对象
		Person p=(Person)ois.readObject();
		//关流
		ois.close();
		//获取对象属性
		System.out.println(p.getName()+","+p.getAge());
	}
}

-可变参数

可变参数—表示可以接收多个这样类型的参数
可变参数底层就是一个数组,参数的值依次存放到数组元素中
可变参数一定在最右边而且只有一个

	public static int m(int m,int... n){//n[]

-创建配置文件

public class PropertiesDemo1 {
	
	public static void main(String[] args) throws IOException {
		//创建对象
		Properties p=new Properties();
		//添加元素---键和值---字符串
		p.setProperty("name", "lili");
		p.setProperty("gender", "女");
		p.setProperty("age", "10");
		//把要存储的内容传输到配置文件中---配置文件后缀必须是.properties
		//第二个参数---文件的内容解释
	p.store(newFileOutputStream("p.properties"),"");		
	}
}




public class PropertiesDemo2 {
	
	public static void main(String[] args) throws IOException, IOException {
		//创建对象
		Properties p=new Properties();
		//加载指定配置文件
		p.load(new FileInputStream("p.properties"));
		
		//获取配置文件的内容
		//根据键获取值
		System.out.println(p.getProperty("name"));
		//根据键获取值
		System.out.println(p.getProperty("name", "tom"));
		
		//列出配置文件信息
		p.list(System.out);
	}

}
  • 枚举
    enum代表一个枚举类
    枚举类所有的枚举常量必须放到首行,默认被public final static 修饰
    枚举类里可以定义属性和方法
    构造方法一定要私有化
    可以定义抽象方法
    switch-case表达式支持枚举类型
  • 定义:
enum Season{
	spring,summer,autumn,winter;//	public final static Season spring=new Season();
	int i=0;	
}

线程

  • 计算机在执行过程中,在同一时间只能让cpu的核执行一个进程,进程
    有多个线程来执行,在同一时刻cpu只能处理一个线程
  • 创建多线程的方式(三种)
  • 1、继承Thread类,重写run方法(线程代码逻辑),调用start方法
    用于开启线程
public class ThreadDemo1 {
	
	public static void main(String[] args) {
		//让线程执行---执行线程代码逻辑所在的类
		Demo d=new Demo();
		//开始线程---Thread类里的方法
		d.start();
		//主逻辑代码
		for (int i = 10; i >0; i--) {
			System.out.println("main:"+i);
		}
	}
}
//线程任务执行的代码逻辑
class Demo extends Thread{
	//重写方法---线程的代码逻辑
	@Override
	public void run() {
		// TODO Auto-generated method stub
		for(int i=0;i<=10;i++){
			System.out.println("i:"+i);
		}
	}
}
  • 2、实现Runnable接口,重写run方法(线程代码逻辑),通过Runnable接口的实现类对象构建Thread类对象,调用start方法开启线程
public class ThreadDemo2 {
	
	public static void main(String[] args) {
		//通过Runnable实现类对象构建Thread类对象
		Thread t=new Thread(new TDemo());
		//开启线程
		t.start();
		for(int i=10;i>=0;i--){
			System.out.println("main:"+i);
		}
	}
}
//线程代码逻辑所在类--实现Runnable接口
class TDemo implements Runnable{
	//重写run方法---线程代码逻辑
	@Override
	public void run() {
		// TODO Auto-generated method stub
		for(int i=0;i<10;i++){
			System.out.println(i);
		}
	}
}
  • 3、实现Callable接口,重写call方法(现阶段了解即可)
public class ThreadDemo3 {
	
	public static void main(String[] args) throws InterruptedException, ExecutionException {
		//创建线程类对象
		DTDemo1 dt=new DTDemo1();
		//获取执行服务器
		ExecutorService e=Executors.newCachedThreadPool();
		Future<Integer> f=e.submit(dt);
		System.out.println(f.get());
	}
}
//Integer---返回值类型
class DTDemo1 implements Callable<Integer>{
	//重写方法---线程代码逻辑
	@Override
	public Integer call() throws Exception {
		// TODO Auto-generated method stub
		return 20;
	}
}

消费生产模型

//生产消费模型
public class WaitNotifyText {
	public static void main(String[] args) {
		//商品对象
		Product p=new Product();
		//开启线程
		new Thread(new Productor(p)).start();
		new Thread(new Productor(p)).start();
		new Thread(new Consumer(p)).start();
		new Thread(new Consumer(p)).start();	
	}
}
//模拟生产过程---线程逻辑代码
class Productor implements Runnable{
	//引入商品类
	Product p;
	public Productor(Product p){
		this.p=p;
	}
	//重写
	@Override
	public void run() {
		while (true) {
			synchronized (p) {
				while(p.flag==true)//加上while保证线程一定会进行判断
					try {
						p.wait();
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				// TODO Auto-generated method stub
				// 此时生产的最大值
				int max = 1000 - p.getNum();// 减去上次剩余
				// 随机生产的商品数量
				int count = (int) (Math.random() * (max + 1));
				// 设置新的商品数量
				p.setNum(p.getNum() + count);
				// 输出
				System.out.println("此次生产了" + count + "个商品,还剩余" + p.getNum() + "个商品...");
				//唤醒
				//p.notify();//随机唤醒一个
				p.notifyAll();
				p.flag=true;
			}
		}
	}
}
//模拟消费过程
class Consumer implements Runnable{
	// 引入商品类
	Product p;
	public Consumer(Product p){
			this.p=p;
		}
	@Override
	public void run() {
		// TODO Auto-generated method stub
		while (true) {
			synchronized (p) {
				while(p.flag==false)
					try {
						p.wait();
					} catch (InterruptedException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}
				// 此次消费最大值
				int max = p.getNum();
				// 此次消费的随机商品数量
				int count = (int) (Math.random() * (max + 1));
				// 设置新的商品数量
				p.setNum(p.getNum() - count);
				// 输出
				System.out.println("此次消费了" + count + "个商品,还剩余" + p.getNum() + "个商品...");
				//唤醒
				//p.notify();
				p.notifyAll();
				p.flag=false;
			}
		}
	}
}
//商品类
class Product{
	//商品数量
	private int num;
	boolean flag=true;
	public int getNum() {
		return num;
	}
	public void setNum(int num) {
		this.num = num;
	}	
}

网络编程

  • 发送端
    1.创建套接字对象
    2.创建数据包,指定数据发送的IP地址、长度、以及端口号
    3.发送数据包
    4.关流
    -接收端
    1.创建套接字对象,绑定具体的端口号
    2.创建数据包,指定真实接收数据的长度
    3.接收数据包
    4.关流
    5.解析数据包
  • UDP发送端
public class UDPSenderDemo {
       
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		DatagramSocket ds=new DatagramSocket();
		//创建待传输数据包
		//第一个参数要传输的数据的字节数组
		//第二个参数真正要发送数据的长度(最大和数组长度一致)
		//第三个参数指明要传输的IP地址和端口号
		DatagramPacket dp=new DatagramPacket
				("好久不见!!!".getBytes(),"好久不见!!!".getBytes().length, 
						new InetSocketAddress("127.0.0.1",8099));
		ds.send(dp);
		ds.close();
	}
}
  • UDP接收端
public class UDPReceiverDemo {

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub
		while (true) {
			DatagramSocket ds = new DatagramSocket(8099);
			//创建数据包用于接收数据---第二个参数代表实际接收数据的长度
			DatagramPacket dp = new DatagramPacket(new byte[1024], 1024);
			ds.receive(dp);//接收数据包
			ds.close();
			//解析数据包
		    //dp.getData()---获取数据--字节数组
			System.out.println(new String(dp.getData(), 0, dp.getLength()));
			System.out.println(dp.getAddress());
			System.out.println(dp.getSocketAddress());
		}
	}
}
  • UDP聊天室
public class UDPChatDemo {
	public static void main(String[] args) {
		//开启线程
		new Thread(new Sender()).start();
		new Thread(new Receiver()).start();
	}
}
//发送端---线程
class Sender implements Runnable{
	//声明对象
	DatagramSocket ds;
	DatagramPacket dp;
	Scanner sc;
	@Override
	public void run() {
		// TODO Auto-generated method stub
		//对象初始化
		try {
			ds=new DatagramSocket();
			sc=new Scanner(System.in);
			while(true){//保证一致写数据---发送数据
				//录入数据
				byte[] bs=sc.nextLine().getBytes();
				//创建发送的数据包
				 dp=new DatagramPacket(bs, bs.length,
								new InetSocketAddress("127.0.0.1",8090));
			     //发送数据包
				ds.send(dp);
			}
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}		
	}
}
//接收端
class Receiver implements Runnable{
	//声明对象
	DatagramSocket ds;
	DatagramPacket dp;
	@Override
	public void run() {
		// TODO Auto-generated method stub
		//对象初始化
		try {
			ds=new DatagramSocket(8090);
			dp=new DatagramPacket(new byte[1024],1024);
		} catch (SocketException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		while(true){
			//接收数据包
			try {
				ds.receive(dp);
				//解析数据包
				System.out.println(new String(dp.getData(),0,dp.getLength()));
				System.out.println(dp.getAddress());
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}	
}

TCP

  • 客户端
    1、创建TCP客户端对象
    2、发起链接(指明要发送的IP和端口)
    3、获取自带的字节输出流
    4、根据自带的字节流往服务器端写出数据
    5、通知服务器已经写完、关流

  • 服务器端
    1、创建TCP服务器端对象,绑定端口
    2、接收链接
    3、获取自带字节流
    4、通过自带的字节流进行数据读取
    5、通知客户端已经读取完成、关流

  • TCP客户端

public class TCPClientDemo {
	
	public static void main(String[] args) throws IOException {
		//创建TCP的套接字对象
		Socket s=new Socket();
		//发起链接---指定链接的IP和端口
		s.connect(new InetSocketAddress("127.0.0.1", 8010));
		//获取自带的字节输出流
		OutputStream os=s.getOutputStream();
		//写出的数据默认往服务器端写
		//通过自带的字节输出流写数据
		os.write("服务器你好...".getBytes());
		//通知服务端数据已写完
		s.shutdownOutput();


		//获取自带字节输入流,默认接收从服务器端发送过来的数据
		InputStream in=s.getInputStream();
		//读取数据
		byte[] bs=new byte[1024];
		int len=-1;
		while((len=in.read(bs))!=-1){
			System.out.println(new String(bs,0,len));
		}
		//通知服务器端已读取完成
		s.shutdownInput();
		//关流
		os.close();
		in.close();
	}
}
  • TCP服务器端
public class TCPServerDemo {
	public static void main(String[] args) throws IOException {
		//创建TCP服务器端对象---绑定端口
		ServerSocket ss=new ServerSocket(8010);
		//接收链接
		Socket s=ss.accept();
		//获取自带的输入流
		InputStream in=s.getInputStream();
		//自建缓冲区
		byte[] bs=new byte[1024];
		int len=-1;
		//读取传过来的数据
		while((len=in.read(bs))!=-1){//读取有阻塞
			System.out.println(new String(bs,0,len));
		}
		//通知客户端数据已读完
		s.shutdownInput();
		
		
		//获取自带的字节输出流
		OutputStream os=s.getOutputStream();
		//往客户端写出数据
		os.write("你也好...".getBytes());
		//通知客户端数据已写完
		s.shutdownOutput();
		//关流
		in.close();
		os.close();
	}
}

反射

  1. 获取字节码对象

  2. 获取构造方法

  3. 传参——构建实例对象

  4. Class—代表类的类—代表.class的类
    Field—代表属性的类
    Method–代表方法的类
    Construct—代表构造方法的类
    Annotation—代表注解的类
    Package—代表包的类

import java.lang.reflect.Constructor;
import java.lang.reflect.InvocationTargetException;

public class ClassDemo2 {
	public static void main(String[] args) throws InstantiationException, IllegalAccessException, NoSuchMethodException, SecurityException, IllegalArgumentException, InvocationTargetException, ClassNotFoundException {
		//先获取String的字节码对象
		Class<String> clz=String.class;
		//获取实例对象
		//newInstance()---默认在调用类的无参构造
		//String str=clz.newInstance();
		
		//通过字节码对象调用到String类的有参构造
		Constructor c=clz.getConstructor(char[].class);//传入构造方法参数类型的字节码对象
		//获取到的有参构造调用newInstance()传入实际参数构造实例对象
		String str=(String) c.newInstance
				(new char[]{'1','4','a'});
		
		//获取构造方法 
		Constructor c1=clz.getConstructor(String.class);
		//暴力破解---可以操作特殊的构造方法(若私有化)
		//c1.setAccessible(true);
		//传参--构建实例对象
		String str1=(String) c1.newInstance("abc");
		//获取指定的方法
		Method m=clz.getDeclaredMethod
				("charAt", int.class);
		//调用方法
		char c=(char) m.invoke(str, 3);
		//获取指定的属性---hash
		Field f=clz.getDeclaredField("hash");
		//暴力破解
		f.setAccessible(true);
		//通过Integer的全路径名获取Integer的实例对象并赋值
		//通过Class.forName()获取字节码对象
		Class<Integer> clz1=(Class<Integer>) 
				Class.forName("java.lang.Integer");
		//获取有参构造方法 new Integer(int )
		Constructor c2=clz1.getConstructor(int.class);
		//传参--构建实例对象
		Integer in=(Integer) c2.newInstance(123);
		System.out.println(in);
	}
}

注解

给计算机看的注释
注解属性默认被public static final共同修饰
支持的属性类型—基本数据类型、String、Class、Annotation、枚举以及对应形式的一维数组表现形式

  • 元注解
    用于控制、限制注解的使用情况(给注解的注解)
    @Target—控制注解可以在什么位置使用
    @Retention—控制注解的级别
    @Documented—可以让注解随着类一起文档化出去
    @Inherited—可以让子类依然具有注解
@First()
	public class AnnoDemo1 {
		@First()
		int i=1;
		@First()
		public static void main(@First() String[] args) {
			@First()
			int j=10;
		}
	}
	//自定义注解
	//@Target({ElementType.TYPE,ElementType.METHOD})
	//@Retention(RetentionPolicy.SOURCE)
	@Inherited
	@interface First{
		/*//默认被public static final共同修饰
		public static final int i=10;
		double d();//声明属性没有赋值
		//Object类型不在支持范围之内
		//Object od();
		int[] arr();//一维数组
	*/}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值