文章目录 昨天知识总结 1.多线程的定义 2.多线程的原理 3.多线程的实例:垃圾回收机制 4.多线程的创建方式 5.多线程–线程安全 6.多线程–线程的通信 7.多线程–Lock 8.多线程–线程的停止 9.多线程–守护线程 10.多线程–join 11.多线程–线程的状态图 递归 递归:有条件的自己调用自己(方法) 条件: 1.要给一个出口负责结束当前的递归 2.循环次数不能太多,否则占用内存过多,死机 死循环:1.自己调用自己 2.方法之间互相调用 public static void main ( String[ ] args) {
// int sum = 0;
// for(int i = 0;i < 100; i++) {
// sum+=1;
// }
Dog. run ( ) ;
}
}
class Dog {
static int sum = 0 ;
static int i = 0 ;
public static void run ( ) {
sum+= i;
System. out. println ( sum) ;
if ( i++ == 100 ) {
return ;
}
run ( ) ;
}
}
文件类File File:文件类,用来操作文件或文件夹(目录/路径) 创建文件 创建单层目录 创建多层目录 判断是否是文件 判断是否是路径 判断是否隐藏 public static void main ( String[ ] args) throws IOException {
//1.创建file对象并关联文件
//a:通过完整的路径实现
File file = new File ( "D:\\eclipse-workspace\\BigData1715N19\\src\\com\\qianfeng\\com\\Demo1.java" ) ;
//b. 通过父目录,子目录实现
File file2 = new File ( "D:\\eclipse-workspace\\BigData1715N19" , "src\\com\\qianfeng\\com\\Demo1.java" ) ;
//c.先得到父目录的File对象
File file3 = new File ( "D:\\eclipse-workspace\\BigData1715N19" ) ;
File file4 = new File ( file3, "src\\com\\qianfeng\\com\\Demo1.java" ) ;
// * 创建文件
File file5 = new File ( "D:\\eclipse-workspace\\BigData1715N19\\temp4.txt" ) ;
file5. createNewFile ( ) ;
//创建目录----这里只能创建目录
File file6 = new File ( "D:\\eclipse-workspace\\BigData1715N19\\aa\\bb\\cc" ) ;
// * 创建单层目录
file6. mkdir ( ) ;
// * 创建多层目录
file6. mkdirs ( ) ;
// * 判断是否是文件
System. out. println ( file3. isFile ( ) ) ;
// * 判断是否是路径
System. out. println ( file3. isDirectory ( ) ) ;
// * 判断是否隐藏
System. out. println ( file3. isHidden ( ) ) ;
//获取文件的最后修改时间
long lastTime = file5. lastModified ( ) ;
//进行格式转换
SimpleDateFormat dateFormat = new SimpleDateFormat ( "yyyy-MM--dd HH:mm:ss" ) ;
System. out. println ( dateFormat. format ( new Date ( lastTime) ) ) ;
}
public static void main ( String[ ] args) {
// * 获取根目录--获取的是当前主机的根目录
File[ ] arr = File. listRoots ( ) ;
for ( File file : arr) {
System. out. println ( file) ;
}
System. out. println ( "********************" ) ;
//* 获取指定路径下的文件或文件夹----1.不包括子层。2.得到的是当前层的全部内容,包括文件和文件夹3.不是全路径。只是文件或文件夹的名字
File file = new File ( "D:\\eclipse-workspace\\BigData1715N19" ) ;
String[ ] strings = file. list ( ) ;
for ( String string : strings) {
System. out. println ( string) ;
}
System. out. println ( "*******" ) ;
//当前目录的文件或文件夹的全路径(是以File对象的形式)
File[ ] files = file. listFiles ( ) ;
for ( File file2 : files) {
System. out. println ( file2) ;
}
}
流 流的简介 流(IO流):input-output-stream。作用:实现两个设备之间的通信。 设备:内存,磁盘,控制台,键盘,文件,网络 网络:在网络上,你的主机之外的环境, 流的分类:根据操作方式分类:输入流和输出流 根据数据的类型分类:字节流和字符流 字节流:传输的字节,可以传输任意类型的数据----视频,音频。文件,图片等 字符流:传输的也是字节,不同点在于传输的过程中加入了编码的操作,让我们在传输字符的时候更加便捷----文件 以内存为参考 字节流:----对应的父类 字节输入流:InputStream 字节输出流:OutputStream 字符流----对应的父类 字符读入流(将数据输入内存):Reader 字节写出流(将数据从内存取出):Writer 字符流 字符流writer 先处理字符流: 实例:以磁盘的存储为例,将内容写入文件 分析:因为传输的是字符–字符流 因为是从内存传出–写出流—FileWriter public static void main ( String[ ] args) throws IOException {
//创建写出流对象并关联内容写入的文件
/*
* 注意点一:关联文件的特点:如果之前不存在,程序会自动创建一个,如果已经存在来,直接使用,但是会将原文件的内容覆盖
* 注意点二:如果只写名字,不写其他具体的路径,默认的路径是当前的工程
* 注意点三:我们可以指定自己的路径,但一定保证自己的路径存在,否则报异常
*/
FileWriter fileWriter = new FileWriter ( "temp1.txt" ) ;
//调用写出方法
/*
* 注意点四:在执行write方法是,数据被临时写入了流对象的内部数组中,这是一个字节数组,会默认去查编码表
*/
fileWriter. write ( "bingbingAndChenchen" ) ;
//调用刷新方法--会将内容真正的写入文件
//fileWriter.flush();
//关闭流--a:将流关闭 b:刷新
//注意点四:流使用完后必须关闭
fileWriter. close ( ) ;
//注意点六:当流对象关闭后,不能在进行任何操作
//fileWriter.write("zhangsan");
}
文件的续写:FileWriter(String file,boolean value) 当value为true时,不会将原来的内容删除 :是转义字符 \t:制表符 \\ 实现换行:\r\n–Windows下的换行linux:\n public static void main ( String[ ] args) {
//创建对象并关联文件
FileWriter fileWriter = null;
try {
fileWriter = new FileWriter ( "temp1.txt" , true ) ;
fileWriter. write ( "bingbing" ) ;
fileWriter. write ( "\r\n" ) ;
fileWriter. write ( "chenchen" ) ;
} catch ( IOException e) {
// TODO Auto-generated catch block
e. printStackTrace ( ) ;
} finally {
if ( fileWriter != null) {
try {
fileWriter. close ( ) ;
} catch ( IOException e) {
// TODO Auto-generated catch block
e. printStackTrace ( ) ;
}
}
}
}
字符流Reader public static void main ( String[ ] args) throws IOException {
//创建对象并关联文件,关联的文件必须存在
FileReader fileReader = new FileReader ( "temp1.txt" ) ;
//第一种:read()--一个一个字符的读
//a:会将当前的字符读出 b:将当前的指针后移一个字符
int data;
while ( ( data = fileReader. read ( ) ) != - 1 ) {
System. out. println ( ( char ) data) ;
}
fileReader. close ( ) ;
}
第二种:read(字符数组)–一次可以读取多个字符,将读到的字符存储到了这个数组中 数组是临时存放数据的地方,我们会将读到的字符放到数组中,数组的大小决定了我们一次可以读到的字符个数, 但是从内存的角度考虑,临时数组并不是越大越好,一般数组的大小在1kb左右 返回值:代表的是本次读到的真实字符的个数,如果返回值是-1代表读完了 public static void main ( String[ ] args) throws IOException {
//创建对象并关联文件,关联的文件必须存在
FileReader fileReader = new FileReader ( "temp1.txt" ) ;
char [ ] arr = new char [ 2 ] ;
int num;
while ( ( num = fileReader. read ( arr) ) != - 1 ) {
System. out. println ( new String ( arr, 0 , num) + " " + num) ;
}
fileReader. close ( ) ;
}
路径分为相对路径和绝对路径 D:\eclipse-workspace\BigData1715N19\src\com\qianfeng\com\Demo1.java 绝对路径 \com\qianfeng\com\Demo1.java 相对路径 相对路径:从路径中间的某个部分开始一直到当前的文件的名字 绝对路径:一个文件的完整路径,即从目录开始的路径 路径中的/ \是转义字符 \\==/ 例题:实现文件的复制,要求将Demo1的内容拷贝到temp3.txt public static void main ( String[ ] args) throws IOException {
//1.创建读入流与写出流并关联对应的文件
FileWriter fileWriter = new FileWriter ( "temp3.txt" ) ;
FileReader fileReader = new FileReader ( "src\\com\\qianfeng\\com\\Demo1.java" ) ;
//读写,一次读多个字符
char [ ] arr = new char [ 1024 ] ;
int num;
while ( ( num = fileReader. read ( arr) ) != - 1 ) {
//将字符数组的部分内容写入文件
fileWriter. write ( arr, 0 , num) ;
}
fileWriter. close ( ) ;
fileReader. close ( ) ;
}