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 ...