黑马程序员技术交流社区

标题: 大哥大的日常生活2 [打印本页]

作者: 社会我大哥大    时间: 2018-12-19 19:36
标题: 大哥大的日常生活2
常用获取线程名称的方法
        获取线程的名称:
1.使用Thread类中的方法getName()
        String getName() 返回该线程的名称。
2.可以先获取到当前正在执行的线程,使用线程中的方法getName()获取线程的名称
创建多线程程序的第二种方式:实现Runnable接口
Runnable 接口应该由那些打算通过某一线程执行其实例的类来实现。类必须定义一个称为 run 的无参数方法
1.创建一个Runnable接口的实现类
2.在实现类中重写Runnable接口的run方法,设置线程任务
3.创建一个Runnable接口的实现类对象
4.创建Thread类对象,构造方法中传递Runnable接口的实现类对象
5.调用Thread类中的start方法,开启新的线程执行run方法
匿名内部类方式实现线程的创建:
格式: new 父类/接口(){重复父类/接口中的方法}
同步代码块:格式:synchronized(锁对象){可能会出现线程安全问题的代码(访问了共享数据的代码)}
线程安全问题的二种方案:使用同步方法
格式:public synchronized void method(){可能会出现线程安全问题的代码(访问了共享数据的代码)}
线程安全问题的三种方案:使用Lock锁
Lock接口中的方法:void lock()获取锁。void unlock()  释放锁
进入到TimeWaiting(计时等待)有两种方式
1.使用sleep(long m)方法,在毫秒值结束之后,线程睡醒进入到Runnable/Blocked状态
2.使用wait(long m)方法,wait方法如果在毫秒值结束之后,还没有被notify唤醒,就会自动醒来,线程睡醒进入到Runnable/Blocked状态
唤醒的方法:
     void notify() 唤醒在此对象监视器上等待的单个线程。
     void notifyAll() 唤醒在此对象监视器上等待的所有线程。
线程池的使用步骤:
    1.使用线程池的工厂类Executors里边提供的静态方法newFixedThreadPool生产一个指定线程数量的线程池
    2.创建一个类,实现Runnable接口,重写run方法,设置线程任务
    3.调用ExecutorService中的方法submit,传递线程任务(实现类),开启线程,执行run方法
    4.调用ExecutorService中的方法shutdown销毁线程池(不建议执行)
        ExecutorService e = Executors.newFixedThreadPool(3);
        e.submit(new Runnable());
        e.shutdown();
Lambda表达式的标准格式:(参数列表) -> {一些重写方法的代码};
Lambda表达式:是可推导,可以省略
凡是根据上下文推导出来的内容,都可以省略书写
可以省略的内容:
    1.(参数列表):括号中参数列表的数据类型,可以省略不写
    2.(参数列表):括号中的参数如果只有一个,那么类型和()都可以省略
    3.{一些代码}:如果{}中的代码只有一行,无论是否有返回值,都可以省略({},return,分号)
        注意:要省略{},return,分号必须一起省略
File类是一个与系统无关的类,任何的操作系统都可以使用这个类中的方法
重点:file:文件
     directory:文件夹/目录
     path:路径
static String pathSeparator 与系统有关的路径分隔符,为了方便,它被表示为一个字符串。
static char pathSeparatorChar 与系统有关的路径分隔符。
static String separator 与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串。
static char separatorChar 与系统有关的默认名称分隔符。
路径:
    绝对路径:是一个完整的路径,以盘符(C:,D:)开始的路径
    相对路径:是一个简化的路径:相对指的是相对于当前项目的根目录(C:\\Users\itcast\\IdeaProjects\\shungyuan)
File类的构造方法
参数:把路径分成了两部分
    String parent:父路径
    String child:子路径
File类获取功能的方法
    - public String getAbsolutePath() :返回此File的绝对路径名字符串。
    - public String getPath() :将此File转换为路径名字符串。
    - public String getName()  :返回由此File表示的文件或目录的名称。
    - public long length()  :返回由此File表示的文件的大小。
File类判断功能的方法
    - public boolean exists() :此File表示的文件或目录是否实际存在。
    - public boolean isDirectory() :此File表示的是否为目录。
    - public boolean isFile() :此File表示的是否为文件。
File类创建删除功能的方法
    - public boolean createNewFile() :当且仅当具有该名称的文件尚不存在时,创建一个新的空文件。
    - public boolean delete() :删除由此File表示的文件或目录。
    - public boolean mkdir() :创建由此File表示的目录。
    - public boolean mkdirs() :创建由此File表示的目录,包括任何必需但不存在的父目录
File类遍历(文件夹)目录功能
    - public String[] list() :返回一个String数组,表示该File目录中的所有子文件或目录
    - public File[] listFiles() :返回一个File数组,表示该File目录中的所有的子文件或目录。
递归
递归:方法自己调用自己
- 递归的分类:
  - 递归分为两种,直接递归和间接递归。
  - 直接递归称为方法自身调用自己。
  - 间接递归可以A方法调用B方法,B方法调用C方法,C方法调用A方法。
- 注意事项:
  - 递归一定要有条件限定,保证递归能够停止下来,否则会发生栈内存溢出。
  - 在递归中虽然有限定条件,但是递归次数不能太多。否则也会发生栈内存溢出。
  - 构造方法,禁止递归
过滤器:File[] listFiles(FileFilter filter)
File pathname:使用ListFiles方法遍历目录,得到的每一个文件对象
OutputStream:字节输出流
    - public void close() :关闭此输出流并释放与此流相关联的任何系统资源。
    - public void flush() :刷新此输出流并强制任何缓冲的输出字节被写出。
    - public void write(byte[] b):将 b.length字节从指定的字节数组写入此输出流。
    - public void write(byte[] b, int off, int len) :从指定的字节数组写入 len字节,从偏移量 off开始输出到此输出流。
    - public abstract void write(int b) :将指定的字节输出流。
字节输出流的使用步骤:
    1.创建一个FileOutputStream对象,构造方法中传递写入数据的目的地
    2.调用FileOutputStream对象中的方法write,把数据写入到文件中
    3.释放资源(流使用会占用一定的内存,使用完毕要把内存清空,提供程序的效率)
追加写/续写:使用两个参数的构造方法
String name,File file:写入数据的目的地
       boolean append:追加写开关
        true:创建对象不会覆盖源文件,继续在文件的末尾追加写数据
        false:创建一个新文件,覆盖源文件
写换行:写换行符号
    windows:\r\n
    linux:/n
    mac:/r
InputStream:字节输入流
     int read()从输入流中读取数据的下一个字节。
     int read(byte[] b) 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。
     void close() 关闭此输入流并释放与该流关联的所有系统资源。
读取的遍历
    布尔表达式(len = fis.read())!=-1
        1.fis.read():读取一个字节
        2.len = fis.read():把读取到的字节赋值给变量len
        3.(len = fis.read())!=-1:判断变量len是否不等于-1
        int len = 0; //记录读取到的字节
        while((len = fis.read())!=-1){System.out.print(len);}
字符输出流,是所有字符输出流的最顶层的父类,是一个抽象类
- void write(int c) 写入单个字符。
    - void write(char[] cbuf)写入字符数组。
    - abstract  void write(char[] cbuf, int off, int len)写入字符数组的某一部分,off数组的开始索引,len写的字符个数。
    - void write(String str)写入字符串。
    - void write(String str, int off, int len) 写入字符串的某一部分,off字符串的开始索引,len写的字符个数。
    - void flush()刷新该流的缓冲。
    - void close() 关闭此流,但要先刷新它。
字符输出流的使用步骤(重点):
    1.创建FileWriter对象,构造方法中绑定要写入数据的目的地
    2.使用FileWriter中的方法write,把数据写入到内存缓冲区中(字符转换为字节的过程)
    3.使用FileWriter中的方法flush,把内存缓冲区中的数据,刷新到文件中
    4.释放资源(会先把内存缓冲区中的数据刷新到文件中)
lush方法和close方法的区别
    - flush :刷新缓冲区,流对象可以继续使用。
    - close:  先刷新缓冲区,然后通知系统释放资源。流对象不可以再被使用了。
在try的后边可以增加一个(),在括号中可以定义流对象
那么这个流对象的作用域就在try中有效
try中的代码执行完毕,会自动把流对象释放,不用写finally
格式:
    try(定义流对象;定义流对象....){可能会产出异常的代码 }catch(异常类变量 变量名){异常的处理逻辑}
获取和遍历的方法
Object setProperty(String key, String value) 调用 Hashtable 的方法 put。
    String getProperty(String key) 通过key找到value值,此方法相当于Map集合中的get(key)方法
    Set<String> stringPropertyNames() 返回此属性列表中的键集,其中该键及其对应值是字符串,此方法相当于Map集合中的keySet方法
可以使用Properties集合中的方法store,把集合中的临时数据,持久化写入到硬盘中存储;
OutputStream out:字节输出流,不能写入中文
    Writer writer:字符输出流,可以写中文
    String comments:注释,用来解释说明保存的文件是做什么用的
            不能使用中文,会产生乱码,默认是Unicode编码
            一般使用""空字符串
使用步骤:
    1.创建Properties集合对象,添加数据
    2.创建字节输出流/字符输出流对象,构造方法中绑定要输出的目的地
    3.使用Properties集合中的方法store,把集合中的临时数据,持久化写入到硬盘中存储
    4.释放资源
可以使用Properties集合中的方法load,把硬盘中保存的文件(键值对),读取到集合中使用;
    void load(InputStream inStream)
    void load(Reader reader)
InputStream inStream:字节输入流,不能读取含有中文的键值对
        Reader reader:字符输入流,能读取含有中文的键值对
使用步骤:
1.创建Properties集合对象
        2.使用Properties集合对象中的方法load读取保存键值对的文件
        3.遍历Properties集合
    注意:
        1.存储键值对的文件中,键与值默认的连接符号可以使用=,空格(其他符号)
        2.存储键值对的文件中,可以使用#进行注释,被注释的键值对不会再被读取
        3.存储键值对的文件中,键与值默认都是字符串,不用再加引号
BufferedOutputStream:字节缓冲输出流:
继承自父类的共性成员方法:
    - public void close() :关闭此输出流并释放与此流相关联的任何系统资源。
    - public void flush() :刷新此输出流并强制任何缓冲的输出字节被写出。
    - public void write(byte[] b):将 b.length字节从指定的字节数组写入此输出流。
    - public void write(byte[] b, int off, int len) :从指定的字节数组写入 len字节,从偏移量 off开始输出到此输出流。
    - public abstract void write(int b) :将指定的字节输出流。
构造方法:
    BufferedOutputStream(OutputStream out)  创建一个新的缓冲输出流,以将数据写入指定的底层输出流。
    BufferedOutputStream(OutputStream out, int size)  创建一个新的缓冲输出流,以将具有指定缓冲区大小的数据写入指定的底层输出流。
BufferedInputStream:字节缓冲输入流

继承自父类的成员方法:
    int read()从输入流中读取数据的下一个字节。
    int read(byte[] b) 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。
    void close() 关闭此输入流并释放与该流关联的所有系统资源。
构造方法:
    BufferedInputStream(InputStream in) 创建一个 BufferedInputStream 并保存其参数,即输入流 in,以便将来使用。
BufferedInputStream(InputStream in, int size) 创建具有指定缓冲区大小的 BufferedInputStream 并保存其参数,即输入流 in,以便将来使用。

BufferedWriter:字符缓冲输出流
继承自父类的共性成员方法:
    - void write(int c) 写入单个字符。
    - void write(char[] cbuf)写入字符数组。
    - abstract  void write(char[] cbuf, int off, int len)写入字符数组的某一部分,off数组的开始索引,len写的字符个数。
    - void write(String str)写入字符串。
    - void write(String str, int off, int len) 写入字符串的某一部分,off字符串的开始索引,len写的字符个数。
    - void flush()刷新该流的缓冲。
    - void close() 关闭此流,但要先刷新它

BufferedReader:字符缓冲输入流

继承自父类的共性成员方法:
    int read() 读取单个字符并返回。
    int read(char[] cbuf)一次读取多个字符,将字符读入数组。
    void close() 关闭该流并释放与之关联的所有资源。





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2