JavaSE之IO流、网络编程、反射

JavaSE之IO流、网络编程、反射


一、IO流

1.File

  (1)包:java.io.File;

  (2)定义:文件和目录路径名的抽象表示形式,只是描述,不一定真实存在。

  (3)构造方法:
    1)public File(String pathname)
      参数:里面当前文件夹/文件的路径 (推荐方式)

    2)public File(String parent,String child)
      参数:parent的字符串路径名和child的字符串路径名构造一个File。

    3)public File(File parent,String child)
      参数:需要描述parent的File和子文件字符串路径名构造一个File。

    4)public File(URI uri)

  (4)创建功能:

    1)public boolean createNewFile()throws IOException
      作用:创建文件
      前提:如果要在一个目录下创建一个文件,那么这个目录必须存在。

    2)public boolean mkdir()
      作用:创建目录(文件夹):如果存在该文件夹,返回值false。

    3)public boolean mkdirs():
      作用:创建多级目录,如果父目录不存在,会自动创建。

    4)注意:如果描述文件或者文件夹没有指定盘符,默认是当前项目路径下。

  (5)删除功能
    public boolean delete()
    作用:删除目录/文件。
    前提条件:如果删除的是目录,那么目录必须为空。

  (6)重命名功能
    public boolean renameTo(File dest)
    作用:修改文件名或修改路径和文件名。
    当前文件的路径和该名后的路径相同,仅仅是改名字。
    当前文件的路径名和该后面的路径名不相同,剪切并重命名。

  (7)判断功能
    public boolean isFile()
    作用:判断是否是文件

    public boolean isDirectory()
    作用:判断是否是文件夹(目录)

    public boolean canRead()
    作用:判断是否可读

    public boolean canWrite()
    作用:判断是否可写

    public boolean exists()
    作用:判断file所表示的文件/目录是否存在

    public boolean isAbsolute()
    作用:判断是否是绝对路径

    public boolean isHidden()
    作用:判断是否是隐藏文件

  (8)获取功能
    public String getAbsolutePath()
    作用:获取绝对路径名

    public String getPath()
    作用:当前文件所表示的路径

    public long length()
    作用:获取文件长度

    public long lastModified()
    作用:获取当前文件最后一次修改的时间(long:毫秒值)。

    public File[] listFiles()
    作用:获取的是某个盘符下/目录File数组(目录中的文件)。

    public String[] list()
    作用:获取某个盘符/目录的下的所有文件以及目录的字符串数组。

    public String[] list(FilenameFilter filter)
    作用:返回满足过滤器要求的File对象名字符串的数组。

    public File[] listFiles(FilenameFilter filter)
    作用:返回满足过滤器要求的File对象数组。

  (9)FilenameFilter:文件名称过滤器
    抽象方法:boolean accept(File dir,String name)
    作用:是否将文件添加到文件列表中。
    返回值为true:添加到指定文件列表中。

2.IO流

  (1)定义:在设备之间进行数据传输的操作。

  (2)分类:
    1)按流的方向划分:
      输入流
      输出流

    2)按流的类型划分
      字节流
        字节输入流:InputStream
        字节输出流:OutputStream
      字符流
        字符输入流:Reader
        字符输出流:Writer

  (3)注意事项:
    1)字符流是在字节输入流之后出现的,解决了中文乱码问题。

    2)对某个文件进行读写时,能使用记事本打开,且能读懂内容的文件,使用字符流;否则使用字节流。

3.字节流

  (1)分类:
    字节输入流:InputStream
    字节输出流:OutputStream

  (2)实例化:两个抽象类,不能直接实例化,提供了一些具体的子类
    XXXInputStream、XXXOutputStream都是字节输入流和字节输出流的子类。

4.文件字节输出流:FileOuputStream

  (1)构造方法:
    1)public FileOutputStream(String name)
      作用:创建文件输出流,写入给定文件路径所表示的文件。

    2)public FileOutputStream(File file)
      作用:创建文件输出流,写入给定文件抽象对象所表示的文件。

    3)public FileOutputStream(String name, boolean append):
      作用:创建输出流对象,并指向文件,将文件内容写入到末尾。
      第二个参数为:true,写入末尾。

  (2)使用步骤
    1)创建OutputStream字节输出流对象,同时指向某个文件路径。

    2)写数据:给文件中写入内容。

    3)关闭相关的系统资源。

  (3)写数据功能
    void write(byte[] b)
    作用:给指定的文件写入字节数组 。

    void write(byte[] b, int off, int len)
    作用;写入字节数组的一部分。

    void write(int b)
    作用:写入一个字节 。

  (4)实现在文件中换行
    使用第三种构造方法创建文件字节输出流对象,并让第二个参数为true,在写入数据之后添加换行符号。
    换行符号:
      windows:\r\n
      linux:\n
      Mac:\r
    写入一个换行符号:fos.write("\r\n".getBytes());

5.文件字节输入流:FileInputStream

  (1)构造方法
    public FileInputStream(String name)throws FileNotFoundException
    作用:创建输出流对象,并指向文件。

  (2)读取方法
    public abstract int read()
    作用:一次读取一个字节。

    public int read(byte[] b) throws IOException
    作用:一次读取一个字节数组。
    返回值:描述的是实际读取的字节数。

  (3)使用步骤
    1)创建FileInputStream对象:指向哪个文件。
    2)读数据 :public abstract int read():读取一个字节。
      展示结果
    3)关闭资源

  (4)注意事项:
    1)中文存储:第一个字节一定是负数,第二个字节可以是负数,整数。

    2)一般情况:定义字节数组的时候,长度是1024或者1024的整数倍。

    3)读写复制操作两种方式
      要么一次读取一个字节,效率低。
      要么一次读取一个字节数组,效率高。

6.字节缓冲流

  (1)字节缓冲输出流:BufferedOutputStream extends OutputStream

  (2)字节缓冲输入流:BufferedInputStream extends InputStream

  (3)构造方法
    public BufferedOutputStream(OutputStream out)
    作用:创建一个缓冲输出流对象,默认缓冲区大小。

    BufferedInputStream(InputStream in)
    作用:创建一个新的缓冲输入流。

  (4)注意事项:
    1)缓冲流是在流中提供了缓冲区字节数组,数组默认长度足够大(8192),一般通过带一个参的构造方法创建。

    2)只是提供缓冲区,具体文件读写复制操作还是需要用底层流InputStream、OutputStream。

  (5)字节流四种方式对文件进行读写复制操作
    1)一次读取一个字节:
      FileInputStream/FileOutputStream
      BufferedInputStrea/BufferedOutputStream

    2)一次读取一个字节数组:
      FileInputStream/FileOutputStream
      BufferedInputStrea/BufferedOutputStream

7.字符转换流

  (1)字符转换流:字符流通向字节流的桥梁。

  (2)字符转换输出流OutputStreamWriter

  (3)构造方法
    public OutputStreamWriter(OutputStream out)
    作用:使用默认字符(gbk)格式进行编码的字符输出流。

    public OutputStreamWriter(OutputStream out, Charset cs)
    作用:使用指定的字符集构造出一个字符输出流。

  (4)成员方法
    public void write(int c)
    作用:写入单个字符。

    public void write(char[] cbuf)
    作用:写入字符数组。

    public abstract void write(char[] cbuf,int off,int len)
    作用:写入字符数组的一部分。

    public void write(String str)
    作用:写入字符串内容。

    public void write(String str,int off,int len)
    作用:写入字符串一部分。

  (5)flush()和close()
    1)flush():刷新流,将缓冲中的数据刷新出来,流刷新之后还可以继续写入数据;

    2)close()方法:将跟该流相关的系统资源释放掉,不再指向当前操作的文件,关闭之后不能再写入数据,否则出现IOException。

  (6)字符转换输入流:InputStreamReader

  (7)构造方法:
    public InputStreamReader(InputStream in)
    作用:使用默认字符集进行解码(gbk格式)。

    public InputStreamReader(InputStream in, String charsetName)
    作用:使用指定的字符集进行解码。

  (8)成员方法:读的功能
    public int read()
    作用:读取一个字符

    public int read(char[] cbuf)
    作用:读取一个字符数组

    public int read(char[] cbuf,int offset,int len)
    作用:读字符数组的一部分

  (9)为了简化字符流读写复制操作:
    提供了字符转换输入流和字符转换输出流的便捷类
    FileReader:继承自InputStreamReader
    FileWriter继承自OutputStreamWriter

    FileReader(String pathname)
    FileWriter(String pathname)

8.字符缓冲流

  (1)字符缓冲输入流:BufferedReader

  (2)构造方法
    BufferedReader(Reader r)
    作用:构造一个字符缓冲输入流提供默认缓冲区大小(8192)。

  (3)特有功能
    public String readLine()
    作用:一次读取一行内容,当读取到\n(换行了),就终止。
  (4)特殊应用:键盘录入
    Scanner(InputStream in)
    使用流的方式进行键盘录入:BufferedReader(Reader r)

  (5)字符缓冲输出流:BufferedWriter
    描述:将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。

  (6)构造方法:
    public BufferedWriter(Writer out)
    作用:构造一个缓冲输出流,默认缓冲区大小(8192)。

  (7)特有功能
    public void newLine()
    作用:写入行的分隔符(换行)。

  (8)字符流复制文本文件的方式操作:
    1)一次读取一个字符:
      InputStreamReader/OutputStreamWriter
      FileReader/FileWriter
      BufferdReader/BufferedWriter

    2)一次读取一个字符数组:
      InputStreamReader/OutputStreamWriter
      FileReader/FileWriter
      BufferdReader/BufferedWriter

    3)一次读取一行:BufferedReader/BufferedWriter

  (9)文件复制注意事项:
    1)文本文件的复制优先采用BufferedReader/BufferedWriter。

    2)图片文件、音频文件、视频文件采用:BufferdInputStrea/BufferedOutputStream。

9.打印流

  (1)打印流:字符输出流的一种
    字符打印流:PrintWriter
    字节打印流:PrintStream

  (2)构造方法:
    public PrintWriter(Writer out,boolean autoFlush):
    第二个参数为true:表示开启自动刷新功能。

    public PrintWriter(String fileName)
    作用:可以操作具体文件路径。

  (3)成员方法:
    public void println(XXX x)
    作用:打印并换行。

  (4)直接操作文件地址的流
    字节流:FileInputStream、FileOutputStream
    字符流:FileReader、FileWriter、PrintWriter

10.内存操作流

  (1)内存操作流:操作临时数据。

  (2)内存操作流:
    内存操作输出流:ByteArrayOutputStream
    内存操作输入流:ByteArrayInputStream

  (3)构造方法:
    public ByteArrayOutputStream()
    作用:构造一个默认的缓冲大小的输出流对象。

    public ByteArrayInputStream(byte[] buf)
    作用:使用指定的字节数组作为缓冲区,构造内存操作输入流。

  (4)成员方法
    public byte[] toByteArray()
    作用:将内存操作输出流对象转为数组格式。

  (5)关闭资源
    baos.close();
    临时变量随着方法完毕就消失了,不用调用close方法关闭,close()没有作任何实现。

11.合并流

  (1)合并流:将两个或者两个以上的字节输入流对象合并到一个流中。

  (2)SequenceInputStream extends InputStream

  (3)构造方法
    public SequenceInputStream(InputStream s1,InputStream s2)
    作用:将两个基本输入流合并到当前SequenceInputStream流中。

    public SequenceInputStream(Enumeration<? extends InputStream> e)
    作用:将两个以上基本输入流合并到当前SequenceInputStream流中。

  (4)两个以上的文件复制
    1)创建 Vector<InputStream>集合对象。

    2)给添加多个InputStream对象。

    3)存储到Vector集合中:elements()方法可以获取Enumeration对象,Enumeration<InputStream>。

    4)读写复制

12.序列化与反序列化

  (1)序列化:可以将网络中的一些数据或对象转成 “流数据”。

  (2)反序列化:将流数据还原成Java对象或网络数据。

  (3)对象流:
    对象输出流:ObjectOutputStream
    对象输入流:ObjectInputStream

  (4)构造方法:
    public ObjectOutputStream(OutputStream out)
    public ObjectInputStream(InputStream in)

  (5)成员方法:
    public final void writeObject(Object obj)
    作用:将指定的对象写入到序列化流中。

    public final Object readObject()
    作用:将流数据还原成对象。

  (6)序列化接口(标记接口):没有字段,连成员方法都没有。
    序列化的类:在内存中对类及成员进行编码。

    内容包含:
      类产生的字节码文件Person.class
      类签名:序列化版本ID
      类的成员:字段(属性)值

  (7)注意事项:
    1)只有实现Serializable接口的类,才能进行序列化,否则会出现异常:java.io.NotSerializableException。

    2)改动了当前类的一个成员,直接进行反序列化会出现一个异常: java.io.InvalidClassException;

    3)原因:每一个类在内存中进行序列化的时候,会产生xxx.class文件,产生一个serialVersionUID:序列化版本ID=100。

      反序列化的时候:将类的成员信息改动了,产生一个新的 serialVersionUID = 200。

      前后类的签名不一致,就会出现异常。

    4)解决:
      当某个成员被transient关键字修饰,不会参与序列化和反序列化。

      让当前这个类在序列化和反序列化的时候:产生的版本ID是一个固定值。


二、网络编程

1.网络编程

  (1)网络编程的三要素:网络协议、ip地址、端口号。

		举例:向某人说话
			1)找到这个人----他所在的位置----ip地址 
			2)对他说话----对方通过耳朵听到----端口号
			3)找到他了,对他说英语/汉语/韩语:----协议

  (2)网络协议:UDP和TCP
    UDP和TCP协议的区别:
      1)是否需要建立连接通道
        UDP:不需要建立通道(QQ聊天,发短信)
        TCP:需要建立连接通道(打电话…)

      2)是否是可靠连接(是否安全)
        UDP:是一种不可靠连接,不安全–执行效率高。
        TCP:是一种可靠连接,执行效率低,三次握手,四次挥手。

      3)传输数据的大小
        Udp:每个数据报的大小在限制在64k。
        TCP:在连接中进行大数据量传输。

    共同点:UDP/TCP两端都需要有Socket(Socket编程)。

  (3)应用协议:http协议、https协议。

  (4)第一要素:ip地址
    1)使用点分十进制法:192.168.138.1,将32位二进制数,转为四位十进制数表示。

    2)A类IP地址:第一段号码为网络号码,剩下的三段号码为本地计算机的号码(政府部门)。

    3)B类IP地址:前二段号码为网络号码,剩下的二段号码为本地计算机的号码(大学校园)。

    4)C类IP地址:前三段号码为网络号码,剩下的一段号码为本地计算机的号码(私人地址)。

    5)回环地址:127.0.0.1,表示本机。
      域名:localhost

    6)广播地址:xxx.xxx.xxx.255

  (5)第二个要素:端口号
    1)定义:每个网络程序都会至少有一个逻辑端口,用于标识进程的逻辑地址,是不同进程的标识。

    2)有效端口号:0-65535

    3)保留端口号:0-1024

    4)网站地址上端口号可以不写。

    5)常见端口号
      tomcat: 8080
      redis:6575
      mysql软件:3306

2.InetAddress

  (1)获取互联网ip地址统称:java.net.InetAddress类

  (2)这个类没有构造方法,不能直接创建对象,只能通过提供的一些静态的成员方法创建对象(单例模式)。

    public static InetAddress getByName(String host)
    参数为:主机名称

  (3)成员方法
    public String getHostAddress()
    作用:返回 IP 地址字符串(以文本形式表现)。

    public String getHostName()
    作用:获取主机名。

  (4)Socket套接字:
    1)定义:网络上具有唯一标识的IP地址和端口号组合在一起才能构成唯一能识别的标识符套接字。

    2)Socket原理机制:
      通信的两端都有Socket;
      网络通信其实就是Socket间的通信;
      数据在两个Socket间通过IO流传输。

3.UDP协议

  接收端的实现步骤
    (1)创建接收端的Socket对象,绑定端口号
      public DatagramSocket(int port)throws SocketException
      构造数据报套接字并将其绑定到本地主机上的指定端口。

    (2)创建一个数据报包DatagramPacket:接收数据的容器
      public DatagramPacket(byte[] buf,int length)

    (3)接收数据
      public void receive(DatagramPacket p)throws IOException
      从此套接字接收数据报包。

    (4)从接收容器中解析实际数据
      public byte[] getData()
      返回数据缓冲区。

      public int getLength()
      返回要发送的数据的长度或接收到的数据的长度。

      new String(byte[] data,0,int len);

    (5)展示数据

  发送端的实现步骤
    (1)创建发送端的Socket对象
      public DatagramSocket()throws SocketException
      构造数据报套接字并将其绑定到本地主机上任何可用的端口。

    (2)数据报包对象:DatagramPacket
      public DatagramPacket(byte[] buf,int length,
      InetAddress address,int port)
      构造数据报包,用来将长度为 length 的包发送到指定主机上的指 定端口号。

    (3)发送数据
      public void send(DatagramPacket p)throws IOException
      从此套接字发送数据报包。

    (4)关闭资源

4.UDP的使用

  (1)需求:在一个窗口下进行聊天,发送和接收数据
    发送端开启发送端的线程。
    接收端开启接收端的线程。

  (2)分析:
    1)发送端和接收端都需要有Socket,都需要在当前用户线程(main)中创建出来。

    2)多线程实现方式2
      SendThread /ReceiveThread 实现Runnable接口重写run方法(这两个作为资源类)这两个资源类对象需要将上面Socket对象传递进来。

    3)创建Thread类对象,将上面的SendThread和ReceiveThread作为参数传递。

    4)启动线程

5.TCP协议

  (1)客户端的实现步骤
    1)创建客户端的Socket对象java.net.Socket(套接字)。
      public Socket(String host,int port)
      创建一个流套接字并将其连接到指定主机上的指定端口号。

    2)获取客户端通道内输出流(字节输出流),写入内容。
      public OutputStream getOutputStream()throws IOException
      返回此套接字的输出流。

    3)关闭资源。

  (2)服务器端实现步骤
    1)创建服务器端的Socket对象,绑定端口。
      public ServerSocket(int port)
      创建绑定到特定端口的服务器套接字。

    2)进入阻塞状态,监听客户端连接。
      public Socket accept()throws IOException
      侦听并接受到此套接字的连接。
      此方法在连接传入之前一直阻塞。

    3)获取通道内输入流(字节输入流),读数据。
      public InputStream getInputStream()throws IOException
      返回此套接字的输入流。

    4)展示数据。
    5)释放资源。

  (3)注意事项:
    服务器端不要开启多次,就会出现BindException:绑定异常,端口号被占用。

6.TCP与IO流结合使用的问题

  (1)情景一:
    客户端将当前项目下ReceiveDemo.java文件写入到通道内的流中;
    服务器端将客户端的文本进行复制:到当前项目Copy.java文件中;
    加入服务器端的反馈。
    问题:文件已经复制完毕,但是服务器端和客户端程序没有结束。

  (2)原因:String readLine() :返回为null,仅仅表示文件已经读完了,但是服务器端不知道客户端的文件是否已经写入完毕,就等待着客户端告诉服务器端"已经写入完毕"。

    当前客户端没有告诉服务器端,是否写入完毕,那么客户端也一直等待着服务器的反馈,就出现互相等待。

  (3)解决方案
    1)在客户端自定义一个结束标记
      通道输出流(BufferedWriter)写入"over",服务器端读取到"over", 直接结束。
     2)使用客户端Socket中的结束方法 ,“告诉服务器,这里面没有内容写入”。
      public void shutdownOutput()

  (4)情景二:图片的复制:BufferedInputStream/BufferedOutputStream
    一次读取一个字节数组
    客户端的一个图片文件:当前项目下xxx.jpg
    服务器端将图片文件:进行复制得到yyy.jpg
    加入服务器端的反馈

  (5)发现问题:
    图片文件:没有复制完整,图片文件缺失(少字节数)。
    图片文件本身在内存中:缓存数据。

  (6)解决办法:
    字节缓冲输出流中:强制将缓冲的字节数输出到流中的方法。
    public void flush()


三、反射

1.Class类中获取类构造方法对象的方法:(Constructor)

  (1)public Constructor<?>[] getConstructors()
    作用:表示获取指定类中所有的公共构造方法。

  (2)public Constructor<?>[] getDeclaredConstructors():
    作用:获取指定类中所有的构造方法:私有的,公共的,默认,受保护的。

  (3)public Constructor<T> getConstructor(Class<?>… parameterTypes)
    作用:获取指定的公共构造方法。
    参数:parameterTypes构造方法中数据类型的字节码对象数组。
    “…”:jdk5提供的可变参数相当于数组。

  (4)public Constructor<T> getDeclaredConstructor(Class<?>… parameterTypes)
    作用:获取指定的构造方法(任何访问修饰符的构造方法)

  (5)public T newInstance(Object… initargs)
    作用:创建指定类的对象。
    参数为Constructor对象的参数类型及个数。

2.获取类的成员变量对象的方法:(Field)

  (1)public Field[] getDeclaredFields()
    作用:获取所有的成员变量(公共的,私有的,默认的,受保护的)。

  (2)public Field[] getFields()
    作用:获取所有公共的成员变量。

  (3)public Field getDeclaredField(String name)
    作用:获取任何访问修饰符修饰的单个成员变量。
    参数:成员变量名。

  (4)public void set(Object obj,Object value)
    作用:给成员变量赋值。
    参数1:指定类的实例。
    参数2:给当前成员变量设置的内容。

3.获取类的成员方法对象的方法:(Method)

  (1)public Method[] getDeclaredMethods()
    作用:获取任何访问修饰符修饰的方法:仅限本类,不包括继承的。

  (2)public Method[] getMethods()
    作用:获取所有的公共(public)的成员方法:不仅有本类的,还有它父类的。

  (3)public Method getDeclaredMethod(String name,
    Class<?>… parameterTypes)
    作用:获取指定名字与参数类型的任何访问修饰符修饰的方法对象。

  (4)public Method getMethod(String name,Class<?>… parameterTypes)
    作用:获取指定名字与参数类型的公共(public)成员方法。
    参数1:方法名
    参数2:当前如果该方法有形式参数,跟上运行时参数类型的Class。

  (5)public Object invoke(Object obj, Object… args)
    作用:在具有指定参数的方法对象上调用此方法对象表示的基础方法。
    参数1:指定类的实例
    参数2:跟的实际参数

4.反射

  (1)反射:获取一个类的字节码文件对象,创建该类实例,调用该类成员方法,给成员变量赋值。

  (2)获取字节码文件的三种方式
    1)Object类的getClass()
    2)任意Java类的.class属性
    3)反射Class类中forName(“类或者接口的全限定名称”) ;
      全限定名:com.qianfeng.reflect_10.ReflectDemo。

  (3)Java代码经历的三个阶段
    源码阶段(SOURCE):执行javac命令对java源码进行编译。
    类加载初始化阶段(CLASS):检查类的语法结构。
    运行阶段:执行java命令运行字节码文件。

5.反射中的常见问题

  (1)非法访问异常:
    1)java.lang.IllegalAccessException:
      Class com.qianfeng.reflect_02.ReflectDemo can not access a member of class com.qianfeng.reflect_01.Person with modifiers “private”

    2)原因:访问非公有的方法、变量或构造。

    3)解决:参数为true,取消java语言的访问检查
      public void setAccessible(boolean flag)
      将此对象的accessible标志设置为指示的布尔值。

  (2)反射操作类的步骤
    1)获取字节码文件对象
      Class.forName(“类的全限定名称”);

    2)获取类的构造方法对象(Constructor类对象)
      使用Class类中获取Constructor类对象的方法。

    3)获取类的成员变量对象(Field类对象)
      使用Class类中获取Field类对象的方法。

    4)获取类的成员方法对象(Method类对象)
      使用Class类中获取Method类对象的方法。

  (3)读取项目根目录下的配置文件
    1)创建属性集合类对象(Properties类)

    2)将文件加载到属性集合类对象中
      Properties类的load(new FileReader(“配置文件名加后缀”));

    3)获取值(集合中存储的类的成员及全限定名)
      getPropertise(String key);

    4)反射对类进行操作。

  (4)读取src目录下的propertise配置文件
    1)获取当前主类(有main方法)的类加载器
      类名.class.getClassLoader();

    2)读取配置文件
      方式1
        加载器对象.getResourceAsStream(“配置文件名加后缀”);
      方式2
        public URL getResource(String name)
        public String getPath()

    3)创建属性集合对象(Properties类)

    4)将流中的数据加载到属性集合对象中。
      properties类中的load方法。

    5)获取值(集合中存储的类的成员及全限定名)。
      getPropertise(String key);

    6)反射对类进行操作。

  (5)使用反射向有泛型的ArrayList集合添加其他类型数据
    1)创建ArrayList<Integer>集合的对象。

    2)添加Integer类型元素。

    3)获取ArrayList集合的字节码文件对象。
      ArrayList集合对象.getClass();

    4)获取ArrayList集合的add方法的对象
      Class对象.getMethod(“add”, Object.class) ;

    5)调用add方法
      Method类对象.invoke(集合对象,要添加的元素);

6.动态代理之JDK动态代理

  (1)动态代理:在程序的运行过程中产生的代理类。

  (2)动态代理
    jdk动态代理
    CGlib动态代理

  (3)JDK动态代理:在程序运行过程中,通过反射的产生的代理类,使用Proxy类和InvocationHandler接口实现。

  (4)Proxy 提供用于创建动态代理类对象的静态方法
    public static Object newProxyInstance(ClassLoader loader,Class<?>[] interfaces,InvocationHandler h)

    参数1:表示真实角色类的加载器
    参数2:获取真实角色类实现的接口列表的Class字节码文件。
    参数3:代理实例的处理程序接口:InvocationHandler。

  (5)InvocationHandler接口中的抽象方法
    Object invoke(Object proxy,Method method,Object[] args)

    proxy:代表动态代理对象。
    method:代表正在执行的方法。
    args:代表调用目标方法时传入的实参。

  (6)注意事项:Proxy.newProxyInstance创建的代理对象是在jvm运行时动态生成的一个对象,它并不是InvocationHandler类型,也不是我们定义的那组接口的类型,而是在运行是动态生成的一个对象,并且命名方式都是这样的形式,以$开头,proxy为中,最后一个数字表示对象的标号。


四、其他知识点

1.URL和URI

  (1)URL(统一资源定位符):指的是信息资源在网络上的地址,是URI的子集合。

  (2)URL的格式由下列三部分组成:
    第一部分是协议(或称为服务方式);
    第二部分是存有该资源的主机IP地址(有时也包括端口号);
    第三部分是主机资源的具体地址。

  (3)URI(统一资源标识符):是一个用于标识某一互联网资源名称的字符串。

  (4)具体URI的格式如下:
    [协议名]: //[用户名]:[密码]@[服务器地址]:[服务器端口号]/[路径]?[查询字符串]#[片段ID]

  (5)网络协议:http://、https://、ftp://、thunder://

2.方法递归

  (1)定义:就是方法本身调用方法一种现象。

  (2)使用要求:
    1)必须定义一个方法:方法调用方法。
    2)满足一定的规律。
    3)方法必须有出口条件(结束条件),否则就是死递归。

  (3)注意事项:
    次数不能太多,否则就内存溢出。
    方法嵌套方法不是方法递归。
    构造方法不存在递归。

3.编码和解码

  (1)定义:
    编码:就将能够看懂的内容转换为"看不懂的内容"。
      例如:String转为byte[]。

    解码: 将看不懂的内容转换为"能看懂的内容"。
      例如:byte[]转为String。

  (2)编码格式:
    big-5:大五码 (繁写字体)
    gbk:中国的中文编码表,一个中文对应两个字节。
    gbk-2312:中国的中文编码表,对上面的编码扩展。
    iso-8859-1:拉丁文码表。
    utf-8:一个中文对应三个字节码。
    JS:日本中的编码格式。

  (3)注意:编码和解码的过程必须保证格式统一,否则出现乱码。

4.Properties

  (1)描述:表示了一个持久的属性集合 ,没有泛型,属性列表中的键和值都是String。

  (2)它继承自Hashtable<K,V> implements Map<K,V>

  (3)Map集合的遍历:
    通用的方式
    Set<K> keySet()
    V get(K key)

  (4)特有功能
    public Object setProperty(String key, String value)
    作用:添加键和值。

    public Set stringPropertyNames()
    作用:获取属性列表中的所有的键的集合。

    public String getProperty(String key)
    作用:通过键获取值。

    public void load(Reader reader)
    作用:将一些配置文件中的数据加载到属性集合类中。

    public void store(Writer writer, String comments)
    作用:将属性集合类中数据保存到指定的文件中。

  (5)应用需求:
    在当前项目下有一个user.txt文件,如果当前文件中’lisi’这个键, 将它的值改为78,然后重新将值写入到user.txt文件。

    步骤:
      创建Properties对象
      创建Reader对象
      创建Writer对象
      通过属性集合类对象调用load方法,
      将字符输入流对象作为参数传入,
      将文件中的数据存储到属性集合对象中。
      通过stringPropertyNames()方法获取键的集合。
      遍历健集合。
      通过getProperty(String key)方法获取对应的值进行判断。
      如果有使用setProperty(String key, String value)方法修改值。
      使用store(Writer writer, String comments)方法将集合中的数据重新写入文件。


总结

  本文主要总结了JavaSE:IO流、网络编程、反射等方面部分的知识点。
  IO流部分的主要内容有:字节文件输入输出流、字节缓冲流、字符转换流、字符缓冲流以及一些其他流。
  网络编程部分的主要内容有:网络编程的三要素、ip的获取、UDP收发端的实现、TCP客户端与服务器端的实现、TCP与IO结合进行文件的复制及问题。
  反射的主要内容有:Class类中的方法、反射概述、反射操作类时的常见问题、JDK动态代理。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
【完整课程列表】 资源汇总下载地址:https://download.csdn.net/download/qq_27595745/55418618 Java SE编程入门教程 collection与collections(共7页).pptx Java SE编程入门教程 java GC(共6页).pptx Java SE编程入门教程 java instanceof(共3页).pptx Java SE编程入门教程 java IO(共28页).pptx Java SE编程入门教程 java Math(共11页).pptx Java SE编程入门教程 java object(共9页).pptx Java SE编程入门教程 java static final(共24页).pptx Java SE编程入门教程 java this和super(共10页).pptx Java SE编程入门教程 java 常用API(共22页).pptx Java SE编程入门教程 javaGUI编程快速入门(1)(共82页).pptx Java SE编程入门教程 java包装器(共9页).pptx Java SE编程入门教程 java反射机制(共16页).pptx Java SE编程入门教程 java泛型(共11页).pptx Java SE编程入门教程 java封装继承多态(共56页).pptx Java SE编程入门教程 java集合(共38页).pptx Java SE编程入门教程 java接口(共21页).pptx Java SE编程入门教程 java类和对象方法以及包的使用(共56页).pptx Java SE编程入门教程 java类和对象方法以及包的使用(共62页).pptx Java SE编程入门教程 java判断循环(共79页).ppt Java SE编程入门教程 java入门以及变量debug(共63页).pptx Java SE编程入门教程 java设计模式(共17页).pptx Java SE编程入门教程 java数组(共33页).pptx Java SE编程入门教程 java网络编程(共29页).pptx Java SE编程入门教程 java线程(共61页).pptx Java SE编程入门教程 java序列化(共14页).pptx Java SE编程入门教程 java异常(共57页).pptx Java SE编程入门教程 java正则(共8页).pptx Java SE编程入门教程 properties(共3页).pptx Java SE编程入门教程 String字符串(共27页).pptx Java 位运算.docx java正则表达式例子大全 共10页.doc JAVA正则表达式实例教程 共17页.docx JAVA正则表达式实例教程 共17页.pdf 递归算法.docx 堆和栈.wps
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值