第12章 文件与IO
java.io 在Java当中 万事万物皆对象 也可以把计算机系统当中 文件用类表示 File类 即表示一个文件对象,也表示一个目录对象 IO:Input Output 输入与输出流 输入:从硬盘读取数据 输入到内存 输出:从内存读取数据 输出到硬盘(不一定硬盘 网络设备 键盘...) 学习IO流的目的:就为了能够让程序处理一些持久化的数据 流:就是内存与硬盘之间的桥梁,负责数据的运输,数据的流动是单向的 以字节位单位 字节输入流 InputStream FileInputStream 文件字节输入流 BufferedInputStream 字节缓冲输入流 字节输出流 OutputStream FileOutputStream 文件字节输出流 BufferedOutputStream 字节缓冲输出流 字符流:字节流 + 编码表 目的:就是为了更方便操作纯文本文件 txt java py cpp 纯文本文件 有编码之分的 ASCII GBK:中文国标码 专门用于处理中文字符的 1个字节存储基本英文和标点符号 2个字节存储中文字符 UTF-8:万国码 大部分语言体系中的常用字符都有 中文字符没有GBK多 1个字节存储基本英文和标点符号 2个字节存储其他的语言符号 2~3个字节存储中文字符 当前的工作环境默认是UTF-8编码 String.getBytes() 字符串-字节数组 编码 new String() 字节数组-字符串 解码 在编码和解码的过程中 指定码表 String.getBytes("GBK"); new String(buf, 0, len, "GBK")) 以字符为单位 字符输入流 Reader FileReader BufferedReader 字符缓冲输入流 字符输出流 Writer FileWriter BufferedWriter 字符缓冲输出流
第13章 多线程编程
进程:正在运行的程序 确切的来说,当一个程序进入内存运行时,即变成一个进程 进程是处于运行过程中的程序,具有一定独立功能 进程是系统进行资源分配和调度的一个独立的单位 进程是正在运行的程序,进程负责给程序分配内存空间 每一个进程都是有程序代码组成的,这些代码在进程中 有CPU轮流进行执行 线程:是进程中的一个执行单元/执行路径,负责当前进程中程序的执行 一个进程中至少要有线程,也可存在多个线程的,这种程序我们称之为多线程程序 是否线程越多 执行效率就越高呢?不是 如果线程越多 每个线程没CPU执行的概率就下降 会明显产生出等待的时间差 如果真想多开线程 同时还需考虑硬件的要求 【Thread】 实现多线程的方式有两种 1.继承Thread类 一个类继承了Thread类的话 就具备了可以被多线程执行的功能 继承Thread 相当于与获得了一个 执行路径 还差一个 执行任务 重写run函数 run函数不是由我们调用的 由JVM调用 start开辟一个执行路径 由虚拟机具体执行 run (1)定义一个类继承Thread (2)重写run函数 (3)创建子类对象,就是创建线程对象 (4)调用start方法,开启线程并让线程执行,同时告诉JVM去调用run方法 2.实现Runnable接口 如果某一个类已经继承了别的类 则不能在重新继承Thread (1)定义类实现Runnable接口 创建一个任务类 (2)重写run函数 就是任务的具体执行内容 (3)外面创建Thread对象 创建执行路径 (4)任务对象与Thread对象进行关联:将Runnable接口的子类对象作为参数传递给Thread的构造函数 (5)start() 线程安全问题 原因 1.多个线程共同操作同一个数据 2.操作同一个数据的语句有多条 同步代码块:把需要被加锁的代码片段放到synchronized(){}中,并且关联一把锁(任意对象) 锁对象必须是唯一的 同步好处:解决了线程安全的问题 同步弊端:降低了多线程的效率,多个线程在同步代码块中呈现出的单线程的情况 注意:同步代码块中 禁止再去使用别的同步情况 可能会出现死锁问题 在函数声明上写一个synchronized 说明这个函数是同步函数 同步函数 = 就是意味着该函数内容所有的代码都被同步代码块包含 同步函数的锁是谁呢? this 静态同步函数的锁是谁呢?就是当前类的字节码Class对象