A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 664322624 初级黑马   /  2018-4-23 14:41  /  634 人查看  /  0 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 小石姐姐 于 2018-4-25 15:42 编辑

阶段总结




  • java.io.File类:

    • 是文件和目录的路径名的抽象表现形式(也就是文件和目录在Java中的形式, 既能表示文件, 也能表示目录)
    • 构造方法(创建了File对象, 并将其指向该路径. 不会在磁盘上创建这个文件)

      • File File(String pathname): 使用指定的路径名创建一个File对象.
      • File File(String parent, String child): 根据指定的父路径和文件路径创建File对象.
      • File File(File parent, String child): 根据指定的父路径File对象和文件路径创建File对象


    • 常用成员方法

      • 创建:

        • boolean createNewFile(): 创建一个新文件. 返回是否创建成功
        • boolean mkdir(): 创建目录, 返回是否创建成功
        • boolean mkdirs(): 创建多层目录, 包括指定路径中缺少的父级目录. 返回是否创建成功

          • 注意: 创建目录就只创建目录, 不会创建文件. 即使有a.txt也会把他作为目录名创建目录



      • 删除

        • boolean delete(): 删除文件或目录. 返回是否删除成功

          • 注意: 删除是永久删除, 回收站没有



      • 获取

        • String getPath(): 获取创建File对象时使用的路径(创建时是相对路径则返回相对路径, 是绝对路径则返回绝对路径)
        • String getAbsolutePath(): 获取File对象的绝对路径字符串
        • File getAbsoluteFile(): 获取包含绝对路径的File对象
        • String getParent(): 获取File对象的父路径字符串
        • File getParentFile(): 获取File对象的父路径的File对象
        • String getName(): 获取File对象代表的文件名或目录名(不含上层目录)
        • long length(): 获取File对象所表示的文件的大小, 单位byte

          • 注意: 如果File对象是一个目录, 则返回值不确定; 如果文件不存在, 则返回0L


        • long lastModified(): 获取文件上次修改时间


      • 判断

        • boolean exists(): 判断文件或目录是否存在
        • boolean isAbsolute(): 判断File中保存的是否是绝对路径

          • 注意: 无论该文件是否真实存在, 只判断创建File时使用的路径字符串


        • boolean isDirectory(): 判断该File对象是否为目录
        • boolean isFile(): 判断该File对象是否为文件
        • boolean isHidden(): 判断该文件或目录是否为隐藏的


      • 修改

        • boolean renameTo(File dest): 修改文件名


      • 重要获取功能

        • String[] list(): 获取当前路径下所有文件和目录名称(不包括父路径). File对象必须是目录, 否则会报错
        • File[] listFiles(): 获取当前路径下的所有文件和目录的File对象. File对象必须是目录
        • static File[] listRoots(): 返回系统的所有根路径. windows系统就是各种盘符




  • 字节流

    • InputStream

      • 操作文件的子类: FileInputStream类

        • int read(): 读取一个字节, 读完返回-1

          • 注意返回值是int类型, 而不是byte


        • int read(byte[] b): 读取字节到数组中, 返回读取的长度. 读完返回-1
        • close(): 释放资源



    • OutputStream

      • 操作文件的子类: FileOutputStream类

        • void write(byte b): 写一个字节
        • void write(byte[] b, int offset, int len): 从字节数组的指定索引开始写入指定长度个字节
        • close(): 释放资源



    • 注意: 他们读写的是: byte, byte[]


  • 路径


    • 绝对路径

      • 以盘符开头: E:\\a\\a.txt


    • 相对路径


      • 以斜杠开头: \\a\\a.txt
      • 以文件/目录名开头: a.txt, src
      • 项目根目录: .


  • 标准流

    • System.err: 标准错误流. (命令行输出错误信息)
    • System.in: 标准输入流. (键盘输入)

      • 是InputStream类, 属于字节输入流


    • System.out: 标准输出流. (控制台输出)

      • 是OutputStream的子类PrintStream, 属于字节输出流



  • 转换流

    • InputStreamReader: 字节输入流转字符输入流

      • 是Reader的子类, 属于字符输入流


    • OutputStreamWriter: 字符输出流转字节输出流

      • 是Writer的子类, 属于字符输出流


    • 特点

      • 转换流也是包装类, 需要传入实际的输入输出流对象



  • 打印流

    • PrintStream: 字节打印流
    • PrintWriter: 字符打印流
    • 注意

      • 打印是输出操作, 所以打印流只有输出, 没有输入


    • PrintWriter打印流的特点

      • 可以自动换行, println(). 会根据系统自动确定换行符
      • 不能输出字节, 可以输出其他任意类型(要输出字节需要使用PrintStream)
      • 通过构造方法的配置可以实现自动刷新(flush)(只在调用println, printf, format时有用)
      • 也是包装流, 自身没有写出功能
      • 可以把字节输出流转换为字符输出流
      • 关流不会抛出异常(此类中的方法不会抛出 I/O 异常,尽管其某些构造方法可能抛出异常)


    • 方法

      • 构造方法

        • PrintWriter PrintWriter(String filepath)
        • PrintWriter PrintWriter(Writer out, boolean autoFlush): 创建对象, 同时设置是否自动刷新
        • PrintWriter(OutputStream out, boolean autoFlush): 创建对象, 同时设置是否自动刷新


      • 成员方法

        • void write(String s): 写一个字符串
        • void print(String s): 输出字符串, 没有换行
        • void println(String s): 输出字符串并换行. 如果启动了自动刷新, 则会执行自动刷新写入数据
        • void printf(Locale l, String format, Object... args): 使用指定格式字符串和参数将格式化的字符串写入输出流. 如果启动了自动刷新, 则会执行自动刷新写入数据
        • void format(Locale l, String format, Object... args): 使用指定格式字符串和参数将格式化的字符串写入输出流. 如果启动了自动刷新, 则会执行自动刷新写入数据




  • 对象操作流

    • 作用: 读写对象到文件
    • ObjectInputStream: 对象输入流
    • ObjectOutputStream: 对象输出流
    • 注意

      • 使用对象输出流写出对象到文件, 该文件只能使用对象输入流读取对象
      • 只能将实现了java.io.Serializable接口的对象写入流中


    • Serializable接口

      • 标记接口, 用于标记该类可以序列化
      • private static final long serialVersionUID: 序列版本号. 用于确定对象和类定义是否一致
      • InvalidClassException用对象读取流时发生该异常的原因:

        • 该类的序列版本号与从流中读取的类描述符的版本号不匹配
        • 该类包含未知数据类型(即可能添加了新的成员变量或方法)
        • 该类没有可访问的无参数构造方法



    • 方法

      • 构造方法:

        • ObjectOutputStream ObjectOutputStream(OutputStream out): 创建对象输出流
        • ObjectInputStream ObjectInputStream(InputStream in): 创建对象输入流


      • 成员方法

        • void writeObject(Object o): 将对象写入对象输出流
        • Object readObject(): 从对象输入流读取对象, 一次只读取一个对象. 当读不到时抛出EOFException.



    • 读取对象异常的优化操作

      • 在对象流中只保存一个对象, 通过该对象保存其他对象

        • 比如用集合存储多个同类型的对象
        • 定义一个类, 其中包含不同类型的其他类型对象




  • Properties

    • 继承Hashtable<K, V>, 实现Map<K, V>
    • 作用: 以键值对方式保存信息到文本文件
    • 应用场景: 作为程序的配置文件
    • 注意不能存null的键和值

      • 只能保存英文字符和符号, 默认使用ISO-8859-1编码, 存中文会显示乱码

        • 注意: 如果配置文件保存为.txt, 会变成GBK编码, 可以显示中文. 但一般都存为.properties, 使用ISO-8859-1, 显示不了中文


      • 键和值都是字符串


    • 方法

      • 构造方法

        • Properties Properties()


      • 成员方法

        • 可以使用Map的方法
        • String getProperty(String key): 根据键获取值. 如果找不到该键, 则返回null
        • String getProperty(String key, String defaultValue): 根据键获取值, 如果值不存在, 则使用指定的默认值
        • void setProperty(String key, String value): 设置键值对
        • void load(InputStream in): 从字节输入流中读取Properties
        • void load(Reader reader): 从字符输入流中读取Properties
        • void list(PrintStream out): 将Properties输出到指定的字节打印输出流. 会自动加一个-- listing properties --文件头
        • void list(PrintWriter out): 将Properties输出到指定的字符打印输出流. 会自动加一个-- listing properties --文件头
        • void store(Writer writer, String comments): 将Properties输出到指定的输出流, 并添加一个注释. 如果不想要注释可传null. 无论有没有注释, 都会添加时间字符串的注释
        • void store(OutputStream os, String comments): 同上, 只是流不同


      • list方法和store方法的区别

        • list只能接收打印流(PrintStream, PrintWriter)
        • store可以接收任何输出流(OutputStream, Writer)



    • Properties读写操作步骤

      • 写出到文件

        • 创建Properties对象, 添加键值对, 使用list()或store()保存到文件中


      • 从文件读取

        • 创建Properties对象, 使用load()从文件加载数据, 使用getProperty()根据指定键获取值, 或使用遍历Map的方式遍历所有键和值




  • 编码表


    • 作用: 将计算机二进制数据转换为不同语言的字符
    • 常见编码表

      • ASCII: 美国标准码. 包含26个英文字母的大写和小写, 数字, 符号
      • ISO-8859-1: 西方语言编码
      • GB2312: 国标码
      • GBK: 国标扩展码
      • Unicode: 万国码. 支持多国语言字符.
      • UTF-8: Unicode的一种实现方式, 长度可变的码表, 一个字符占用1个或2个字节
      • ANSI: 本地编码表. 根据系统设置决定编码表


    • Java String类对于字节和编码的操作

      • byte[] getBytes(): 获取字符串的byte数组, 使用默认编码
      • byte[] getBytes(String charsetName): 获取字符串的byte数组, 使用指定编码
      • String String(byte[] bytes): 将byte数组转化为字符串, 使用默认编码
      • String String(byte[] bytes, String charsetName): 将byte数组转换为字符串, 使用指定编码
      • String String(byte[] bytes, int offset, int len, String charsetName): 将byte数组的一部分转换为字符串, 使用指定编码


    • 乱码

      • 原因: 读的编码与写的编码不一致
      • 解决方法: 保证读和写的编码一致, 即可解决


    • 处理乱码的2种方式:


      • String通过指定编码转为byte数组, 然后再创建String: (GBK字符串转UTF-8字符串写入文件)

        • 先将String通过目标编码转为byte数组: byte[] bys = "月薪过万".getBytes("UTF-8");
        • 再将byte数组转换为String: String str = new String(bys);
        • 写入到文件: fw.write(str);


      • OutputStreamWriter可以指定编码写入文件, 免去使用String通过编码转换为byte数组的步骤


        • OutputStreamWriter OutputStreamWriter(OutputStream out, String charsetName): 创建转换流对象, 并指定编码


  • 概念

    • 进程: Process, 一个应用程序在内存中的执行区域
    • 线程: Thread, 进程中的一条执行路径
    • 并发: 并行发生, 同时发生, 多线程就可以实现并发
    • 同步: 注意并不是同时的意思, 同步是指一步接一步的执行, 一个执行完毕再开始执行下一个. 单线程就是同步
    • 异步: 不是一步一步执行, 而是同时执行多步, 每个步骤何时结束不确定. 多线程就是异步
    • 阻塞: 上一行代码正在执行, 还没有执行完毕, 程序就阻塞在这里了, 下一行代码必须等上一行不再阻塞后才能执行


  • 单线程和多线程的特点

    • 单线程: 同一时间只做一件事, 安全性高, 效率低
    • 多线程: 同一时间做多个事情, 安全性低, 效率高


  • 多线程的实现方式

    • 继承Thread类, 重写run方法
    • 实现Runnable接口(仍然是创建Thread类对象), 重写run方法


  • java.lang.Thread类: 实现了Runnable接口

    • 构造方法

      • Thread Thread(): 创建Thead对象
      • Thread Thread(Runnable r): 通过Runnable对象创建Thread对象
      • Thread Thread(Runnable r, String threadName): 通过Runnable对象创建Thread对象并指定线程名


    • 成员方法

      • void start(): 启动线程, 即让线程开始执行run()方法中的代码
      • String getName(): 获取线程的名称
      • void setName(String name): 设置线程名称


    • 静态方法

      • static Thread currentThread(): 返回对当前正在执行的线程对象的引用
      • static void sleep(long millis): 让所在线程睡眠指定的毫秒



  • 多线程中的常见问题

    • 资源共享: 卖票问题

      • 共享资源定义位置: 共享资源要定义在多个线程能够共同使用的地方, 如:

        • 多个Thread共用同一个Runnable实现类对象, 则定义为Runnable实现类的非静态成员变量
        • 如果只用Thread子类, 则可以定义为Thread子类的静态成员变量


      • 操作共享数据的线程安全问题: 使用同步解决

        • 同步代码块

          • synchronized (锁对象) {}
          • 锁对象

            • 必须是多个线程共享的对象:

              • 一个类的Class对象
              • 如果是实现Runnable, 则可以是this




        • 同步方法

          • public (static) synchronized void method() {}
          • 锁对象

            • 静态同步方法, 锁对象是: 方法所在类的Class对象
            • 非静态同步方法, 锁对象是: this





      • Socket

        • 套接字
        • 用于描述IP地址和端口, 是一种网络编程机制, 通信的两端都会有Socket


      • 网络通信3要素

        • 传输协议
        • IP地址
        • 端口号


      • 常见通信协议

        • UDP

          • 它是一种无连接的不可靠协议
          • 数据传输大小限制为64K(一个包)
          • 不需要建立连接即可传输
          • 数据发送速度快, 发送方只发送数据, 不检查接收方是否真正接收到数据, 所以数据有丢包的情况
          • 这种方式适合实时性要求强的场合, 比如网络电话, 网络游戏等环境, 这种协议延迟很小


        • TCP

          • 它是一种需要建立连接的可靠协议
          • 没有数据传输大小的限制
          • 在传输前需要先建立连接(三次握手)
          • 它的重发机制保证了数据传输的准确性, 但因为需要接收方发回验证信息, 所以数据发送时间长, 数据流量大
          • 这种方式适合准确性要求强的场合, 比如金融系统, 视频点播, 用户可以等待数据传输但是不能忍受错误



      • java.net.InetAddress类: 用于表示IP地址对象, 可以获取主机名, IP地址等信息

        • 静态方法

          • static InetAddress getLocalHost(): 获取本机的InetAddress对象
          • static InetAddress getByName(String host): 根据主机名或IP的字符串获取主机的InetAddress对象
          • static InetAddress getLoopbackAddress(): 获取回环地址的InetAddress对象


        • 成员方法

          • String getHostAddress(): 返回主机的IP地址
          • String getHostName(): 返回主机名



      • UDP相关类

        • java.net.DatagramSocket类: 基于UDP协议的Socket

          • 构造方法

            • DatagramSocket(): 创建DatagramSocket对象, 随机分配端口号
            • DatagramSocket(int port): 创建DatagramSocket对象, 指定端口号


          • 成员方法

            • void send(DatagramPacket p): 发送数据包
            • void receive(DatagramPacket p): 接收数据, 数据保存在DatagramPacket对象中
            • void close(): 关闭通信, 释放资源



        • java.net.DatagramPacket类: UDP数据包

          • 构造方法

            • DatagramPackage(byte[] msg, int msgLength, InetAddress host, int port): 创建数据包对象, 指定数据, 目标主机对象, 端口
            • DatagramPacket(byte[] buf, int length): 创建数据包对象, 接收数据为length的数据, 存入byte数组中


          • 成员方法

            • byte[] getData(): 获取包中的数据, 以byte数组形式
            • int getLength(): 获取数据包中数据的长度, 即byte数组的长度
            • int getPort(): 获取发送方端口号
            • InetAddress getAddress(): 获取数据包发送方的InetAddress对象




      • TCP相关类

        • java.net.Socket类: 基于TCP协议的Socket

          • 构造方法

            • Socket(InetAddress add, int port)


          • 成员方法

            • OutputStream getOutputStream(): 获取输出流对象, 用于发送数据
            • InputStream getInputStream(): 获取输出流, 即接收数据
            • void close(): 释放资源



        • java.net.ServerSocket: TCP服务端

          • 构造方法

            • ServerSocket(int port)


          • 成员方法

            • Socket accept(): 监听数据, 会阻塞. 收到数据后返回Socket对象
            • void close(): 关闭Socket




      • UDP收发数据步骤

        • 发送端

          • 为发送端创建Socket对象(DatagramSocket):

            • DatagramSocket udp = new DatagramSocket();


          • 创建数据并打包:

            • DatagramPacket packet = new DatagramPacket(buf, buf.length, address, port);


          • 发送数据:

            • DatagramSocket对象的void send(DatagramPackage p)


          • 释放资源:

            • DatagramSocket对象的void close()



        • 接收端

          • 创建接收端Socket对象:

            • DatagramSocket DatagramSocket(int port)


          • 接收数据

            • 创建包对象: DatagramPacket datagramPackage(byte[] buf, int length)
            • 接收包: DatagramSocket对象的void receive(DatagramPacket p), 该方法会阻塞等待接收数据


          • 解析数据

            • 获取发送端信息

              • DatagramPacket对象的InetAddress getAddress(): 获取客户端
              • DatagramPacket对象的byte[] getData(): 获取数据
              • DatagramPacket对象的int getLength(): 获取数据长度



          • 输出数据
          • 释放资源:

            • DatagramSocket对象的void close()




      • TCP收发数据步骤

        • 客户端

          • 创建客户端Socket对象(建立连接):

            • Socket Socket(InetAddress add, int port)


          • 获取输出流对象:

            • Socket对象的OutputStream getOutputStream()


          • 发送数据:

            • OutputStream对象的void write(byte[] b)


          • 释放资源:

            • OutputStream对象的close()
            • Socket对象的close()



        • 服务端

          • 创建服务端ServerSocket对象:

            • ServerSocket ServerSocket(int port)


          • 监听数据:

            • ServerSocket对象的Socket accept(), 获取客户端Socket对象
            • 监听时是阻塞的


          • 获取输入流对象:

            • Socket对象的InputStream getInputStream()


          • 获取数据:

            • InputStream对象的int read(byte[] buf)


          • 输出数据:

            • 将获取的字节数组转换为String打印输出


          • 释放资源:

            • Socket对象的void close()方法
            • ServerSocket对象的void close()方法











0 个回复

您需要登录后才可以回帖 登录 | 加入黑马