IO 流(三)-- 节点流
1.FileReader/FileWriter 的使用:1.1 FileReader 的使用 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758/* 将 hello.txt 文件内容读入程序中,并输出到控制台说明点:1. read () 的理解:返回读入的一个字符。如果达到文件末尾,返回 - 12. 异常的处理:为了保证流资源一定可以执行关闭操作。需要使用 try-catch-finally 处理 3. 读入的文件一定要存在,否则就会报 FileNotFoundException。 */@Test public void testFileReader1 () { FileReader fr = null; try { //1.File 类的实例化 File file = new File ("hello.txt"); ...
IO 流(二)--IO 流概述
1. 流的分类
1. 操作数据单位:字节流、字符流
2. 数据的流向:输入流、输出流
3. 流的角色:节点流、处理流
图示:
2. 流的体系结构
说明:红框对应的是 IO 流中的 4 个抽象基类。
蓝框的流需要大家重点关注。
3. 重点说明的几个流结构
4. 输入、输出的标准化过程 4.1 输入过程① 创建 File 类的对象,指明读取的数据的来源。(要求此文件一定要存在)
② 创建相应的输入流,将 File 类的对象作为参数,传入流的构造器中
③ 具体的读入过程:创建相应的 byte [] 或 char []。
④ 关闭流资源
说明:程序中出现的异常需要使用 try-catch-finally 处理。
4.2 输出过程① 创建 File 类的对象,指明写出的数据的位置。(不要求此文件一定要存在)
② 创建相应的输出流,将 File 类的对象作为参数,传入流的构造器中
③ 具体的写出过程:write (char []/byte [] buffer,0,len)
④ 关闭流资源
说明:程序中出现的异常需要使用 try-catch-finally 处理。
IO 流(一)--File 类的使用
1.File 类的理解
File 类的一个对象,代表一个文件或一个文件目录 (俗称:文件夹)
File 类声明在 java.io 包下
File 类中涉及到关于文件或文件目录的创建、删除、重命名、修改时间、文件大小等方法,并未涉及到写入或读取文件内容的操作。如果需要读取或写入文件内容,必须使用 IO 流来完成。
后续 File 类的对象常会作为参数传递到流的构造器中,指明读取或写入的” 终点”.
2.File 的实例化 2.1 常用构造器 123File (String filePath) File (String parentPath,String childPath) File (File parentFile,String childPath)
2.2 路径的分类相对路径:相较于某个路径下,指明的路径。
绝对路径:包含盘符在内的文件或文件目录的路径
说明:
IDEA 中:如果大家开发使用 JUnit 中的单元测试方法测试,相对路径即为当前 Module 下。如果大家使用 main () 测试,相对路径即为当前的 Project 下。
Eclipse 中:不管使用单元测试方法还是使用 main () 测试,相对路径都是当前的 Pr ...
各种锁的理解
1、公平锁、非公平锁
公平锁: 非常公平, 不能够插队,必须先来后到!
非公平锁:非常不公平,可以插队 (默认都是非公平)
1234567public ReentrantLock () { sync = new NonfairSync ();} public ReentrantLock (boolean fair) { sync = fair ? new FairSync () : new NonfairSync ();}
2、可重入锁可重入锁(递归锁
Synchronized 版
1234567891011121314151617181920212223242526// Synchronizedpublic class Demo01 { public static void main (String [] args) { Phone phone = new Phone (); new Thread (()->{ phone.sms (); & ...
深入理解 CAS
1. 什么是 CASCAS(Compare and swap)比较和替换是设计并发算法时用到的一种技术。简单来说,比较和替换是使用一个期望值和一个变量的当前值进行比较,如果当前变量的值与我们期望的值相等,就使用一个新值替换当前变量的值。
1234567891011121314151617public class CASDemo {// CAS compareAndSet : 比较并交换! public static void main (String [] args) { AtomicInteger atomicInteger = new AtomicInteger (2020); // 期望、更新 //public final boolean compareAndSet (int expect, int update) // 如果我期望的值达到了,那么就更新,否则,就不更新,CAS 是 CPU 的并发原语! System.out.println (atomicInteger.compareA ...
彻底玩转单例模式
1. 饿汉式 1234567891011121314151617181920// 饿汉式单例 public class Hungry {// 可能会浪费空间 private byte [] data1 = new byte [1024*1024]; private byte [] data2 = new byte [1024*1024]; private byte [] data3 = new byte [1024*1024]; private byte [] data4 = new byte [1024*1024]; private Hungry (){ } private final static Hungry HUNGRY = new Hungry (); public static Hungry getInstance (){ return HUNGRY; }}
2. DCL 懒汉式 1234567891011121314151617181920212223242526 ...
JMM 和 Volatile
1.JMM
什么是 JMM
JMM : Java 内存模型,不存在的东西,概念!约定!
关于 JMM 的一些同步的约定:
1、线程解锁前,必须把共享变量立刻刷回主存。
2、线程加锁前,必须读取主存中的最新值到工作内存中!
3、加锁和解锁是同一把锁
线程 工作内存 、主内存
8 种操作:
内存交互操作有 8 种,虚拟机实现必须保证每一个操作都是原子的,不可在分的(对于 double 和 long 类型的变量来说,load、store、read 和 write 操作在某些平台上允许例外)
lock (锁定):作用于主内存的变量,把一个变量标识为线程独占状态
unlock (解锁):作用于主内存的变量,它把一个处于锁定状态的变量释放出来,释放后的变量才可以被其他线程锁定
read (读取):作用于主内存变量,它把一个变量的值从主内存传输到线程的工作内存中,以便随后的 load 动作使用
load (载入):作用于工作内存的变量,它把 read 操作从主存中变量放入工作内存中
use (使用):作用于工作内存中的变量,它把工作内存中的变量传输给执行引擎,每当虚拟机遇到一个需要使 ...
并发 --JUC 的使用(三)
1. 线程池
线程池:三大方法、7 大参数、4 种拒绝策略
1.1 线程池的好处 1、降低资源的消耗
2、提高响应的速度
3、方便管理。
4、线程复用、可以控制最大并发数、管理线程
1.2 线程池:三大方法 123456789101112131415161718192021222324252627// Executors 工具类、3 大方法 public class Demo01 {public static void main (String [] args) { ExecutorService threadPool = Executors.newSingleThreadExecutor ();// 单个线程 // ExecutorService threadPool = Executors.newFixedThreadPool (5); // 创建一个固定的线程池的大小 // ExecutorService threadPool = Executors.newCachedThreadPool (); // 可伸缩的,遇强则强,遇 ...
并发 --JUC 的使用(二)
1. 读写锁
ReadWriteLock
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889/** * 独占锁(写锁) 一次只能被一个线程占有 * 共享锁(读锁) 多个线程可以同时占有 * ReadWriteLock * 读 - 读 可以共存! * 读 - 写 不能共存! * 写 - 写 不能共存! */public class ReadWriteLockDemo {public static void main (String [] args) { MyCache myCache = new MyCache (); // 写入 for (int i = 1; i <= 5 ; i++) { final ...
并发 --JUC 的使用(一)
1、什么是 JUC
java.util 工具包、包、分类:
java.util.concurrent
java.util.concurrent.atomic
java.util.concurrent.locks
2、线程和进程进程:一个程序,QQ.exe Music.exe 程序的集合
一个进程往往可以包含多个线程,至少包含一个!
Java 默认有几个线程?
2 个:mian、GC
线程:开了一个进程 Typora,写字,自动保存(线程负责的 )
对于 Java 而言:Thread、Runnable、Callable 、线程池 (四种创建线程的方式)
2.1、 java 无法真正开启线程,底层需要调用 C++ 开启线程 123456789101112131415161718192021222324252627282930313233public synchronized void start () { /** * This method is not invoked for the main method thread or &quo ...