目录
文件的读取和写入:
synchronization线程锁:
单例模式:
反射
前言
因工作问题,有些代码常常需要使用,为了方便,整理如下。
文件的读取和写入:
import java.io.File;
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileWriter;
public class FileReadAndWrite {
public static void main(String args[]) {
// 绝对路径或相对路径都可以,这里是绝对路径,写入文件时演示相对路径
String readFilePath = "D:/input.txt";
String writeFilePath = "D:/output.txt";
// 防止文件建立或读取失败,用catch捕捉错误并打印,也可以throw
try {
/* 读文件 */
File filename = new File(readFilePath); // 要读取以上路径的input.txt文件
if(!filename.exists()) {
System.out.println("读取失败,文件不存在!");
}else {
// 建立一个输入流对象reader
InputStreamReader inputStreamReader = new InputStreamReader(new FileInputStream(filename));
// 建立一个对象,它把文件内容转成计算机能读懂的语言
BufferedReader reader = new BufferedReader(inputStreamReader);
String line = "";
while ((line = reader.readLine()) != null) {
//line:一次读入一行的数据
System.out.println(line);
}
reader.close();
}
/* 写文件 */
File writeFileName = new File(writeFilePath); // 相对路径,如果没有则要建立一个新的output.txt文件
if(!writeFileName.exists()) {
writeFileName.createNewFile(); // 创建新文件
}
FileWriter fileWriter = new FileWriter(writeFileName);
//FileWriter fileWriter = new FileWriter(writeFile,true); //true,代表着追加写入,不会讲之前已经录入的内容覆盖
BufferedWriter write = new BufferedWriter(fileWriter);
write.write("该字符串写入成功!\r\n"); // \r\n即为换行
write.flush(); // 把缓存区内容压入文件
write.close(); // 最后记得关闭文件
} catch (Exception e) {
e.printStackTrace();
}
}
}
synchronization线程锁:
package jinCheng;
public class TestBank {
public static void main(String[] args) {
Bank bank = new Bank();
Thread yangkang = new Thread(bank,"杨康");
Thread guojing = new Thread(bank,"郭靖");
yangkang.start();
guojing.start();
}
}
class Bank implements Runnable{
private int money = 0;
public void setMoney() {
money += 100;
System.out.println(Thread.currentThread().getName()
+ "存了100,余额:"+money);
}
public void run() {
try {
for(int i = 1;i<=3;i++) {
synchronized (this) {
setMoney();
}
}
}catch (Exception e) {
e.printStackTrace();
}
}
}
单例模式:
package danli;
public class SingletonTest {
public static void main(String[] args) {
Singleton singleton1 = Singleton.getSingleton();
Singleton singleton2 = Singleton.getSingleton();
System.out.println(singleton1);
System.out.println(singleton2);
}
}
/**
* 懒汉式单例模式
* 双检锁/双重校验锁(DCL,即 double-checked locking)
是否Lazy初始化:是
是否多线程安全:是
描述:这种方式采用双锁机制,安全且在多线程情况下能保持高性能。
getInstance() 的性能对应用程序很关键。
*/
class Singleton{
private volatile static Singleton singleton;
private Singleton() {}
public static Singleton getSingleton() {
if(singleton == null) {
synchronized(Singleton.class) {
if(singleton==null) {
singleton = new Singleton();
}
}
}
return singleton;
}
}
反射
public class testPersonReflect {
public static void main(String[] args) {
//获取class对象
Class p=Person.class;
//获取属性 获取所有的属性 包括私有的
Field[] fields = p.getDeclaredFields();
//获取属性 只能返回 公有的
Field[] fields2 = p.getFields();
System.out.println("=================");
for(Field f:fields){
System.out.println(f);
}
System.out.println("--------------");
for(Field f:fields2){
System.out.println(f);
}
//参数表示的是属性的名字
Field field = p.getField("name");
System.out.println(field.getName());
//方法
/**
* 参数1:方法名
* 参数2:方法需要的参数
* 获取的方法是共有的方法
*/
Method method = p.getMethod("eat", int.class,double.class);
System.out.println(method.getName());
//构造方法
Constructor[] constructors = p.getConstructors();
for(Constructor c:constructors){
System.out.println(c);
}
//参数指的是构造方法的参数类型
Constructor constructor = p.getConstructor(String.class,int.class);
System.out.println(constructor);
//通过反射创建对象 获取构造方法 参数:创建对象的时候给构造方法穿的参数
//new Person("tt",34)
Person person = (Person)constructor.newInstance("sanpang",45);
System.out.println("age"+person.getAge());
System.out.println("name"+person.getName());
//设置属性的值
//person.setAge(56);
//System.out.println(person.getAge());
//p.getField("name") 获取属性 set(obj, value);给属性复制
//p.name=
//set的两个参数 参数1:对象 参数2:属性的值
p.getField("name").set(person, "xiaohuahua");
System.out.println(person.getName());
/*p.getField("age").set(person, 109);
System.out.println(person.getAge());*/
Field declaredField = p.getDeclaredField("age");
//将私有属性的赋值权限打开
declaredField.setAccessible(true);
declaredField.set(person, 109);
System.out.println(person.getAge());
//方法调用
Method m01=p.getMethod("eat", int.class,double.class);
//person.eat(4, 5.6);
//参数1 对象 参数2:方法的参数
m01.invoke(person, 18,0.0);
}
}