1.单例模式
单例模式:始终在内存中创建一个实例;
分为两种:
饿汉式:永远不会出现问题的单例模式;
懒汉式:可能出现问题的一种单例模式;
饿汉式:
1)构造方法私有:保证外界不能直接创建当前类对象;
2)在当前类的成员位置创建当前类实例;
3)提供一个静态的功能,返回值就是当前类本身(需要当前类的实例)
懒汉式:
1)构造方法私有化;
2)在当前成员变量的位置声明变量:数据类型就是当前类(私有的,静态的);
3)提供静态功能,返回值是当前类本身
判断如果当前没有给当前类型变量为null,直接new当前类的实例;如果不为null,就返回当前类的变量
可能出现延时加载或懒加载---出现安全问题
Runtime:当前获取的当前本地运行环境的实例;
public int availableProcessors():获取本地计算机的处理器数量
public Process exec(String command):开启某个软件的进程(参数为字符串命令)
public class RuntimeDemo {
public static void main(String[] args) throws IOException {
Runtime runtime = Runtime.getRuntime();
System.out.println(runtime.availableProcessors());
Process notepad = runtime.exec("notepad");
System.out.println(runtime.exec("QQ"));
System.out.println(runtime.exec("shutdown -s -t 300"));
System.out.println(runtime.exec("shutdown -a"));
}
}
2.File类
File文件和目录(文件夹)路径名的抽象表示
构造方法:
File(String pathname) : 参数就是指定的路径/如果没有指定路径(默认是在当前项目下)
通过将给定的路径名字符串转换为抽象路径来创建新的FIle实例
File(File parent , String child):从父抽象路径名和子路径名字符串创建新的File实例;
File(String parent, String child): 参数1:父目录地址 参数2; 具体的子文件地址;
成员方法:
public boolean createNewFile() throws IOExcepption:表示创建文件:如果不存在则创建;
public boolean mkdir():创建文件夹,如果不存在,则创建;否则就返回false;
public boolean mkdirs():创建多个文件,如果父目录不存在,则创建;
public boolean delete():删除文件或者文件夹(如果删除文件夹,文件夹必须为空目录);
public boolean renameTo(File dest):重命名,参数传递的修改的File对象;
判断方法:
public boolean canRead()是否可读;
public boolean canWrite()是否可写;
public boolean exists():是否存在;
public boolean isFile():是否是文件;
public boolean isDirectory():是否是文件夹;
public boolean isHidden():是否隐藏;
高级获取功能:
public long length();
public String getName():获取抽象路径 名所表示的文件或者目录的名称;
public File[] listFiles():获取某个目录下的所有的文件以及文件夹的File数组;
public String[] list():获取某个抽象路径名所表示的文件以及目录的字符串数组;
获取D盘下的所有文件夹及文件的名称
public class FileDemo2 {
public static void main(String[] args) {
File file = new File("aaa.txt") ;
System.out.println(file.canRead());
System.out.println(file.canWrite());
System.out.println(file.exists());
System.out.println(file.isDirectory());
System.out.println(file.isFile());
System.out.println(file.isHidden());
System.out.println(file.length());
System.out.println(file.getName());
System.out.println("------------------------");
File file2 = new File("d://") ;
File[] fileArray = file2.listFiles();
if(fileArray!=null){
for(File f :fileArray){
System.out.println(f.getName());
}
}
System.out.println("----------------------------------");
String[] strArray = file2.list();
if(strArray!=null){
for(String s:strArray){
System.out.println(s);
}
}
}
}
public class FileDemo {
public static void main(String[] args) throws IOException {
File file = new File("D:\\EE_2106\\day25\\code\\a.txt");
File file2 = new File("aaa.txt");
File file3 = new File("D:\\EE_2106\\day25\\code\\demo") ;
File file4 = new File("aaa\\bbb\\ccc\\ddd") ;
System.out.println(file.createNewFile());
System.out.println(file2.createNewFile());
System.out.println(file3.mkdir());
System.out.println(file4.mkdirs());
System.out.println(file3.delete());
System.out.println(file.delete());
File srcFile = new File("D:\\EE_2106\\day25\\code\\mv.jpg") ;
File destFile = new File("高圆圆.jpg") ;
System.out.println(srcFile.renameTo(destFile)) ;
}
}
获取D盘下所有的以.jpg结尾的文件
public class FileTest {
public static void main(String[] args) {
File file = new File("D://") ;
File[] fileArray = file.listFiles();
if(fileArray!=null){
for(File f:fileArray){
if(f.isFile()){
if(f.getName().endsWith(".jpg")){
System.out.println(f.getName());
}
}
}
}
System.out.println("----------------------------------------------");
File srcFile = new File("D://") ;
File[] files = srcFile.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
File file = new File(dir, name);
return file.isFile() && file.getName().endsWith(".jpg");
}
});
if(files!=null){
for(File f :files){
System.out.println(f.getName());
}
}
}
}
3.递归
方法递归:方法调用方法本身的一种现象,并非是方法嵌套方法;
前提条件:
1)必须有一个成员方法;
2)必须有方法递归的出口条件(结束条件),如果没有出口条件,就是死递归;
3)还存在一定规律
注意事项:构造方法不存在递归
public class DiGuiTest {
public static void main(String[] args) {
File srcFloder = new File("d://demo") ;
deleteFloder(srcFloder) ;
}
public static void deleteFloder(File srcFloder) {
File[] fileArray = srcFloder.listFiles();
if(fileArray!=null){
for(File file:fileArray){
if(file.isDirectory()){
deleteFloder(file) ;
}else{
if(file.getName().endsWith(".java")){
System.out.println(file.getName()+"------------"+file.delete());
}
}
}
System.out.println(srcFloder.getName()+"----"+srcFloder.delete());
}
}
}
4.IO流
IO流的分类
按流的方向:
输入流和输出流;
按类型分:
字节流和字符流:字节流先出现,后面才有字符流;
再按流的方向划分:
字节输入流:InputStream:表示输入字节流的所有类的超类;
字节输出流:OutputStream:表示字节输出流的所有类的超类
字符输入流:Reader:表示输入字符流的抽象类;
字符输出流:Writer:表示输出字符流的抽象类;
字节输出流:OutputStream抽象类子类进行实例化FileOutputStream:将指定的内容写到文件中
实现步骤:
1)创建文件输出流对象:FileOutputStream(String name):可以指定参数地址,FileOutputStream(File file);
2)写数据:
public void write(int b) throws IOException 写一个字节;
public void write(byte[] bytes) throws IOException 写一个字节数组;
public void write(byte[] bytes,int off,int len) throws IOException:写一部分字节数组;
3)关闭资源;
public class FileOutputStreamDemo {
public static void main(String[] args) throws IOException {
FileOutputStream fos = new FileOutputStream("my.txt") ;
for(int x = 0 ; x < 10 ; x ++){
fos.write(("hello"+x).getBytes());
fos.write("\r\n".getBytes());
}
fos.close();
}
}
在字节输出流中加入异常处理(捕获异常)
public class FileOutputStreamDemo2 {
public static void main(String[] args) {
method2() ;
}
private static void method2() {
FileOutputStream fos = null ;
try {
fos = new FileOutputStream("fos2.txt") ;
fos.write("hello,我来了".getBytes());
} catch (IOException e) {
e.printStackTrace();
}finally {
if(fos!=null){
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
字节输入流:InputStream
子类:FileInputStream
需要读取当前项目下的fis.txt文件
实现步骤:
1)创建文件字节输入流对象,指向fish.txt
2)读内容
3)释放资源
public class FileInputStreamDemo {
public static void main(String[] args) {
FileInputStream fis = null ;
try {
fis = new FileInputStream("DiGuiTest.java") ;
int by = 0 ;
while((by=fis.read())!=-1) {
System.out.print((char)by);
}
} catch (IOException e) {
e.printStackTrace();
}finally {
if(fis!=null){
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
public class FileInputStreamDemo2 {
public static void main(String[] args) {
FileInputStream fis = null ;
try {
fis = new FileInputStream("fis.txt") ;
byte[] buffer = new byte[1024] ;
int len = 0 ;
while((len=fis.read(buffer))!=-1){
System.out.println(new String(buffer,0,len)) ;
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
读写复制操作
一次读取一个字节的方式
一次读取一个字节数组
需求:将当前项目下的DiGuiTest.java 的内容 复制到D盘下的Copy.java文件中
public class CopyFileDemo {
public static void main(String[] args) {
long start = System.currentTimeMillis() ;
method2("DiGuiTest.java","D://Copy.java") ;
long end = System.currentTimeMillis() ;
System.out.println("共耗时:"+(end-start)+"毫秒");
}
private static void method2(String srcFile, String destFile) {
FileInputStream fis = null ;
FileOutputStream fos = null ;
try {
fis = new FileInputStream(srcFile) ;
fos = new FileOutputStream(destFile) ;
byte[] bytes = new byte[1024] ;
int len = 0 ;
while((len=fis.read(bytes))!=-1){
fos.write(bytes,0,len);
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
fos.close();
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
private static void method(String srcFile, String destFile) {
FileInputStream fis = null ;
FileOutputStream fos = null ;
try {
fis = new FileInputStream(srcFile) ;
fos = new FileOutputStream(destFile) ;
int by = 0 ;
while((by=fis.read())!=-1){
fos.write(by);
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
fos.close();
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
缓冲流BufferedInputStream
缓冲流的特点:提供缓冲区大小:1024的8倍,通过底层流提高读速度(FileInputStream);
BufferedOutputStream(OutputStream out):默认缓冲区大小,足够大;
BufferedOutputStream(OutputStream out, int size):创建一个新的缓冲输出流,以将数据写入指定的底层输出流。
public class BufferedOutputStreamDemo {
public static void main(String[] args) throws IOException {
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("bos.txt")) ;
bos.write("hello.bufferedOutputStream".getBytes());
bos.close();
}
}
public class BufferedInputStreamDemo {
public static void main(String[] args) throws IOException {
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("bos.txt")) ;
byte[] bytes = new byte[1024] ;
int len = 0 ;
while((len=bis.read(bytes))!=-1){
System.out.println(new String(bytes,0,len));
}
}
}
读取一个MP4文件,并将文件内容复制到当前项目下的copy.mp4中
1)缓冲流一次读取一个字节数组
public class CopyMp4 {
public static void main(String[] args) {
long start = System.currentTimeMillis() ;
copyMp4("D://a.mp4","copy.mp4") ;
long end = System.currentTimeMillis() ;
System.out.println("共耗时"+(end-start)+"毫秒");
}
private static void copyMp4_4(String srcFile, String destFile) {
BufferedInputStream bis = null ;
BufferedOutputStream bos = null ;
try {
bis = new BufferedInputStream(new FileInputStream(srcFile)) ;
bos = new BufferedOutputStream(new FileOutputStream(destFile)) ;
byte[] bytes = new byte[1024] ;
int len = 0 ;
while((len=bis.read(bytes))!=-1){
bos.write(bytes,0,len);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
bos.close();
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
2)缓冲流一次读取一个字节
public class CopyMp4 {
public static void main(String[] args) {
long start = System.currentTimeMillis() ;
copyMp4_2("D://a.mp4","copy.mp4") ;
long end = System.currentTimeMillis() ;
System.out.println("共耗时"+(end-start)+"毫秒");
}
private static void copyMp4_2(String srcFile, String destFile) {
BufferedInputStream bis = null ;
BufferedOutputStream bos = null ;
try {
bis = new BufferedInputStream(new FileInputStream(srcFile)) ;
bos = new BufferedOutputStream(new FileOutputStream(destFile)) ;
int by = 0 ;
while((by=bis.read())!=-1){
bos.write(by);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
bos.close();
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
3)基本的字节流一次读取一个字节数组
public class CopyMp4 {
public static void main(String[] args) {
long start = System.currentTimeMillis() ;
copyMp4_3("D://a.mp4","copy.mp4") ;
long end = System.currentTimeMillis() ;
System.out.println("共耗时"+(end-start)+"毫秒");
}
public static void copyMp4_3(String srcFile,String destFile){
FileInputStream fis = null ;
FileOutputStream fos = null ;
try {
fis = new FileInputStream(srcFile) ;
fos = new FileOutputStream(destFile) ;
byte[] bytes = new byte[1024] ;
int len = 0 ;
while((len=fis.read(bytes))!=-1){
fos.write(bytes,0,len);
fos.flush();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
fos.close();
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
4)基本的字节流一次读取一个字节
public class CopyMp4 {
public static void main(String[] args) {
long start = System.currentTimeMillis() ;
copyMp4_4("D://a.mp4","copy.mp4") ;
long end = System.currentTimeMillis() ;
System.out.println("共耗时"+(end-start)+"毫秒");
}
public static void copyMp4(String srcFile, String destFile) {
FileInputStream fis = null ;
FileOutputStream fos = null ;
try {
fis = new FileInputStream(srcFile) ;
fos = new FileOutputStream(destFile) ;
int by = 0 ;
while((by=fis.read())!=-1){
fos.write(by);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
fos.close();
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
阻塞IO针对文本文件的读写复制
基本字节流一次读取一个字节
基本字节流一次读取一个字节数组
高效字节流(字节缓冲流BufferedInputStream)一次读取一个字节/一次读取一个字节数组
基本字符流:Reader-->转换输入流InputStreamReader(InputStream in):一次读取一个字符/一次读取一个字符数组
高效字符流(字符缓冲流BufferedReader):一次读取一个字符/一次读取一个字符数组
特有功能:一次读取一行内容 readLine()
字符缓冲输入流
BufferedReadr ----- 键盘录入数据
BufferedReader(Reader in)
Reader
InputStreamReader(InputStream in):转换流
如果直接进行读的操作(直接操作文件)FileReader(String pathName)
创建使用默认大小的输入缓冲区的缓冲字符输入流
BufferedReader(Reader in , int size):指定缓冲区的大小;
特有功能:
public String readLine():一次读取一行内容;
public class BufferedReadDemo{
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)) ;
System.out.println("请您输入一个字符串数据:");
String line = br.readLine();
System.out.println("您输入的数据是:"+line);
}
}
使用BufferedReader读取bw.txt文件的内容
public class BufferedReaderDemo {
public static void main(String[] args) throws IOException {
BufferedReader br2 = new BufferedReader(new FileReader("bw.txt")) ;
String line2 = null ;
while((line2=br2.readLine())!=null){
System.out.println(line2);
}
}
}
字符缓冲输出流
BufferedWriter(Writer out):创建默认的缓冲区的大小:默认大小:defaultcharbuffersize:8192
BufferedWriter(Writer out, int sz) :指定的大小
public void newLine() throws IOException:写入行的分隔符号
特有功能:
利用BufferedReader的readLine()读取一行
利用BufferedWriter写一行,然后换行
public class BufferedWriterDemo {
public static void main(String[] args) throws IOException {
BufferedWriter bw = new BufferedWriter(new FileWriter("bw.txt"));
bw.write("hello");
bw.newLine();
bw.write("world");
bw.newLine();
bw.write("javaEE");
bw.newLine();
bw.flush();
bw.close();
}
}
读写复制操作
public class CopyFile {
public static void main(String[] args) {
BufferedReader br = null ;
BufferedWriter bw = null ;
try {
br = new BufferedReader(new FileReader("ReaderDemo.java")) ;
bw = new BufferedWriter(new FileWriter("copy.java")) ;
String line = null ;
while((line=br.readLine())!=null){
bw.write(line);
bw.newLine();
bw.flush();;
}
} catch (Exception e) {
e.printStackTrace();
}finally {
try {
bw.close();
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
字符流
字符流的出现是在字节流的后面,可以解决中文乱码问题
Writer:抽象类
提供子类:字符转换输出流:字节输出流通向字符输出流的桥梁;
构造方法:
OutputStreamWritter(OutputStream out):使用平台默认编码集写入数据;
OutputStreamWriter(OutputStream out ,String charsetName):使用指定的字符集进行编码写入数据
public class WriterDemo {
public static void main(String[] args) throws Exception {
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("osw.txt")) ;
osw.write("hello,字符流我来了");
osw.write(97);
char[] chs = {'A','B','C','D','E'} ;
osw.write(chs);
osw.write(chs,2,2);
osw.flush();
osw.close();
}
}
Reader:抽象类
具体的子类方法:字符转换输入流 InputStreamReader
构造方法:
InputStreamReader(InputStream in):使用平台默认解码集进行读取;
InputStreamReader(InputStream in, String charset):使用指定的解码集进行解读
public class ReaderDemo {
public static void main(String[] args) throws Exception {
InputStreamReader isr = new InputStreamReader(new FileInputStream("osw.txt")) ;
char[] chs = new char[1024] ;
int len = 0 ;
while((len=isr.read(chs))!=-1){
System.out.println(new String(chs,0,len));
}
isr.close();
}
}
Reader/Writer子类:转换流
InputStreamReader(InputStream in) OutputStreamWriter(OutputStream out)
他们不能直接去操作文件,jdk提供了这两种类型的便捷类,可以直接操作文件
FileReader(File file)
FileReader(String pathname)
FileWriter(File file)
FileWriter(String filename)
当前项目下的ReaderDemo.java 复制到 D://Demo.java;针对文本文件:优先采用字符流
public class CopyFile {
public static void main(String[] args) throws Exception {
FileReader fileReader = new FileReader("ReaderDemo.java") ;
FileWriter fileWriter = new FileWriter("D://Demo.java") ;
char[] charArray = new char[1024] ;
int len = 0 ;
while((len=fileReader.read(charArray))!=-1){
fileWriter.write(charArray,0,len);
fileWriter.flush();
}
fileWriter.close();
fileReader.close();
}
}
字符流的逻辑串联
可以将两个或者两个以上的文件进行读的操作,只能操作源文件;
构造方法:
public SequenceInputStream(InputStream s1 ,InputStream s2)
参数s1和s2分别是要读取的字节输入流对象
public class CopyMulFile {
public static void main(String[] args) throws Exception {
InputStream is = new FileInputStream("BufferedWriterDemo.java") ;
InputStream is2 = new FileInputStream("copy.java") ;
SequenceInputStream sis = new SequenceInputStream(is,is2) ;
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("b.java")) ;
byte[] bytes = new byte[1024] ;
int len = 0 ;
while((len = sis.read(bytes))!=-1){
bos.write(bytes,0,len);
}
bos.close();
sis.close();
}
}
public SequenceInputStream(Enumeration<? extends InputStream> e) :将两个以上的文件进行读取;
Vector<InputStream>
public class CopyFileDemo2 {
public static void main(String[] args) throws Exception {
InputStream is1 = new FileInputStream("BufferedWriterDemo.java") ;
InputStream is2 = new FileInputStream("ReaderDemo.java") ;
InputStream is3 = new FileInputStream("CopyMp4.java") ;
Vector<InputStream> vector = new Vector<>() ;
vector.add(is1) ;
vector.add(is2) ;
vector.add(is3) ;
Enumeration<InputStream> enumeration = vector.elements();
SequenceInputStream sis = new SequenceInputStream(enumeration);
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("d://hello.java")) ;
int by = 0 ;
while((by=sis.read())!=-1){
bos.write(by);
bos.flush();
}
bos.close();
sis.close();
}
}
属性列表Properties
Properties extends Hashtable<K,V> ,它没有泛型,Key和Value都是String;
表示一组持久的属性.Properties可以保存到流中或从流中加载.
属性列表中的每个键及其对应的值都是一个字符串
1)可以使用Map功能
put(K,V);
遍历:keySet()通用
2)有自己的特有功能添加元素和遍历
public Object setProperty(String key,String value):给属性列表中添加属性描述(key和value);
public Set<String> stringPropertyNames():获取属性列表中的所有的键;
public String getProperty(String key):在属性列表中通过键获取值
public class PropertiesDemo {
public static void main(String[] args) {
Properties properties = new Properties() ;
Properties prop = new Properties() ;
prop.setProperty("张三","30") ;
prop.setProperty("李四","40") ;
prop.setProperty("王五","35") ;
prop.setProperty("赵六","45") ;
Set<String> set = prop.stringPropertyNames();
for(String key:set){
String value = prop.getProperty(key);
System.out.println(key+"---"+value);
}
}
}
5.序列化与反序列化
序列化
将某个实体对象写入到流对象中----->讲一个对象变成流数据
构造方法:
protected ObjectOutputStream();
protected ObjectOutputStream(OutputStream out) :将某个对象通过底层的基本字节输出进行写的动作;
public final void writeObject(Object obj) throws IOException
反序列化
将流数据还原成对象;
构造方法:
public ObjectInputStream(InputStream in);
public final Object readObject() throws IOException, ClassNotFoundException;
异常
NotSerializableException:未实现序列化接口的异常;
一个类在进行序列化的时候,(将类的对象写入序列化流中),标记接口Serializable 它有个特点:为当前这个Person进行编码(为类以及类的成员----->序列化化版本ID(签名):SerialversonUID);
InvalidClassException:序列化版本id号无效
public class ObjectStreamDemo {
public static void main(String[] args) throws IOException, ClassNotFoundException {
myRead() ;
}
private static void myRead() throws IOException, ClassNotFoundException {
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("oos.txt")) ;
Object object = ois.readObject();
ois.close();
System.out.println(object);
}
private static void myWrite() throws IOException {
Person p = new Person("高圆圆",42) ;
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("oos.txt")) ;
oos.writeObject(p);
oos.close();
}
}
public class Person implements Serializable {
private static final long serialVersionUID = 8988325735017562383L;
String name ;
private transient int age ;
public Person(){}
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
6.网络编程
网络编程----->Socket编程
特点:
客户端与服务端必须存在Socket对象
网络编程的三要素:
1)规定的协议 UDP/TCP;
2)互联网ip地址;
3)port 端口号;
InetAddress:互联网ip地址:
获取ip地址的方法:
public static InetAddress getByName(String host):参数:主机名称(计算机电脑名称);
public String getHostAddress():获取ip地址字符串形式
UDP与TCP协议的区别
UDP协议:
1)不需要建立连接通道;
2)属于一种不可靠连接;
3)发送文件大小有限制;
4)执行效率高(不同步的);
TCP协议:
1)建立连接通道;
2)属于可靠连接(安全连接);
3)相对UDP来说,发送文件大小无限制;
4)执行效率底(同步的)
public class NetDemo {
public static void main(String[] args) throws UnknownHostException {
InetAddress inetAddress = InetAddress.getByName("计算机主机名称");
String ip = inetAddress.getHostAddress();
System.out.println(ip);
}
}
UDP发送端和接收端的实现
UDP发送端
DatagramSocket ds = new DatagramSocket() ;
byte[] bytes = "hello,upd".getBytes() ;
int length = bytes.length ;
InetAddress inetAddress = InetAddress.getByName("主机ip地址") ;
int port = 8888 ;
DatagramPacket dp = new DatagramPacket(bytes,length,inetAddress,port) ;
ds.send(dp) ;
ds.close() ;
Upd接收端
DatagramSocket ds = new DatagramSocket(8888) ;
byte[] bytes = new byte[1024] ;
int length = bytes.length ;
DatagramPacket dp = new DatagramPacket(bytes,length) ;
ds.receive(dp) ;
byte[] bytes2 = dp.getData() ;
int length2 = dp.getLength() ;
String str = new String(bytes2,0,length2) ;
InetAddress inetAddress = dp.getInetAddress() ;
String ip = inetAddress.getHostAddress() ;
System.out.println("data from "+ip+"data is ---->"+str) ;
TCP
TCP的特点:需要建立连接通道(以一种字节流的方式写入.读取);
什么时候建立连接?
服务器端如果监听到端口,客户端就立即和服务器端建立连接
TCP客户端写数据:
1)创建TCP客户端的Socket对象;
2)写数据;
3)释放资源;
TCP客户端
public class ScoketDemo {
public static void main(String[] args) throws IOException {
Socket s = new Socket("10.12.156.107",8888) ;
OutputStream out = s.getOutputStream();
out.write("hello,TCP".getBytes());
s.close();
}
}
TCP服务端的实现步骤
1)创建服务器端的Socket对象
2)监听客户端连接
3)获取通道内的输入流
4)读取数据:一次读取一个字节数组
5)展示数据 而且获取ip地址
public class ServerDemo {
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(8888) ;
System.out.println("服务器正在等待连接...");
Socket socket = ss.accept();
InputStream inputStream = socket.getInputStream();
byte[] bytes = new byte[1024] ;
int len = inputStream.read(bytes);
String clientStr = new String(bytes,0,len) ;
String ip = socket.getInetAddress().getHostAddress();
System.out.println("data from "+ip+" content is--->"+clientStr);
ss.close();
}
}
TCP客户端不断键盘录入数据,
public class ClientDemo {
public static void main(String[] args) {
Socket socket = null ;
try {
socket = new Socket("10.12.156.107",10010) ;
BufferedReader br = new BufferedReader(new InputStreamReader(System.in)) ;
String line = null ;
while((line=br.readLine())!=null){
if("over".equals(line)){
break ;
}
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())) ;
bw.write(line);
bw.newLine();
bw.flush();
}
} catch (IOException e) {
e.printStackTrace();
}finally {
if(socket!=null){
try {
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
服务端不断读取数据并显示
public class ServerDemo {
public static void main(String[] args) {
ServerSocket ss = null ;
try {
ss = new ServerSocket(10010) ;
while(true){
System.out.println("服务器正在等待连接");
Socket socket = ss.accept();
BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream())) ;
String line = null ;
while((line=br.readLine())!=null){
System.out.println(line);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
客户端的图片文件,服务器端将图片进行复制,并反馈给客户端
public class ClientImgDemo {
public static void main(String[] args) throws IOException {
Socket socket = new Socket("10.12.156.107",12306) ;
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("d://mm.jpg")) ;
BufferedOutputStream bos = new BufferedOutputStream(socket.getOutputStream()) ;
byte[] buffer = new byte[1024] ;
int len = 0 ;
while((len=bis.read(buffer))!=-1){
bos.write(buffer,0,len);
bos.flush();
}
socket.shutdownOutput();
InputStream inputStream = socket.getInputStream();
byte[] bytes = new byte[1024] ;
int length = inputStream.read(bytes);
System.out.println("反馈内容为:"+new String(bytes,0,length));
bis.close();
socket.close();
}
}
public class ServlerImgDemo {
public static void main(String[] args) throws IOException {
ServerSocket ss = new ServerSocket(12306) ;
Socket socket = ss.accept() ;
BufferedInputStream bis = new BufferedInputStream(socket.getInputStream()) ;
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("高圆圆.jpg")) ;
byte[] bytes = new byte[1024] ;
int len = 0 ;
while((len=bis.read(bytes))!=-1){
bos.write(bytes,0,len);
bos.flush();
}
OutputStream outputStream = socket.getOutputStream();
outputStream.write("图片文件复制完毕".getBytes());
outputStream.flush();
bos.close();
ss.close();
}
}
7.反射reflect
什么是反射?
能够获取当前某个类的字节码文件对象Class,那么就可以获取当前类的构造器并且创建当前类的实例;还可以获取当前类的成员变量并区赋值,或者获取当前类的成员方法并调用
如何获取一个类的字节码文件对象?
1)通过Object类的getClass()获取,获取当前某个正在运行的类的实例;
2)任意java类型的class属性;
3)Class类的静态功能 --class.forName();
方法
获取构造器对象:
public Constructor<?>[] getConstructors():获取当前字节码文件对象中(正在运行的这个类)里面所有的公共的构造方法所在的对象;
public Constructor<?>[] getDeclaredConstructors():获取所有的构造器对象Constructor,返回构造器对象数组 包含私有化构造/默认的;
获取公共的成员变量Filed:
public Field[] getDeclaredFields():所有的字段所在的Field对象;这包括公共,受保护,默认(包)访问和私有字段,但不包括继承的字段。;
Field[] fields = clazz.getFields() ;
Field[] fields = clazz.getDeclaredFields() ;
//遍历
for (Field field : fields) {
System.out.println(field);
获取指定的单个的字段所在的Field对象;
public Field getDeclaredField(String name):参数为当前字段名称;
给绑定在当前对象上的字段进行赋值:
public void set(Object obj,Object value);参数1:创建当前类的实例,参数2:value赋值的实际参数;
取消java语言访问检查:
字段名称+Filed.setAccessible(true);
获取成员方法:
当前字节码文件对象.getMethods();
当前字节码文件对象.getDeclaredMethods():通过此表示类对象,包括公共,默认访问,私有,保护方法,但不包括继承的方法;
使用反射创建对象
public class ReflectDemo {
public static void main(String[] args) throws Exception {
Class personClass = Class.forName("com.qf.reflect_03.Person") ;
Constructor constructor = personClass.getConstructor();
Object obj = constructor.newInstance();
System.out.println(obj);
}
}
通过反射获取当前类实例,并且去获取成员变量所在对象Field,然后去给成员变量赋值
public class ReflectDemo {
public static void main(String[] args) throws Exception {
Class clazz = Class.forName("com.qf.reflect_03.Person") ;
Object obj = clazz.newInstance();
System.out.println(obj);
Field nameField = clazz.getDeclaredField("name");
nameField.setAccessible(true);
nameField.set(obj,"高圆圆");
System.out.println(obj);
Field ageField = clazz.getField("age");
ageField.set(obj,20);
System.out.println(obj);
Field addressField = clazz.getDeclaredField("address");
addressField.setAccessible(true);
addressField.set(obj,"西安市");
System.out.println(obj);
}
}
通过反射获取成员方法所在的Method,并能去调用
public class ReflectDemo {
public static void main(String[] args) throws Exception{
Class clazz = Class.forName("com.qf.reflect_03.Person") ;
Object obj =clazz.newInstance() ;
Method showMethod = clazz.getMethod("show");
showMethod.invoke(obj) ;
Method functonMethod = clazz.getDeclaredMethod("functioin", String.class);
functonMethod.setAccessible(true);
Object returnObj = functonMethod.invoke(obj, "hello");
System.out.println(returnObj);
}
}
反射的应用:
给ArrayList集合中添加String类型的数据
public class ReflectTest {
public static void main(String[] rgs) throws Exception {
ArrayList<Integer> arrayList = new ArrayList<>() ;
arrayList.add(100) ;
arrayList.add(50) ;
arrayList.add(200) ;
Class clazz = arrayList.getClass();
Method addMethod = clazz.getMethod("add", Object.class);
addMethod.invoke(arrayList, "hello");
addMethod.invoke(arrayList, "world");
addMethod.invoke(arrayList, "javaEE");
System.out.println(arrayList);
}
}
通过配置文件调用不同类的方法
public class ReflectTest2 {
public static void main(String[] args) throws Exception {
InputStream inputStream = ReflectTest2.class.getClassLoader().getResourceAsStream("myClass.properties");
Properties prop = new Properties() ;
prop.load(inputStream);
String className = prop.getProperty("className") ;
String methodName = prop.getProperty("methodName") ;
Class clazz = Class.forName(className) ;
Object obj = clazz.newInstance() ;
Method method = clazz.getMethod(methodName) ;
method.invoke(obj) ;
}
}
|