文章目录

昨天知识总结

  • 1.多线程的定义
  • 2.多线程的原理
  • 3.多线程的实例:垃圾回收机制
  • 4.多线程的创建方式
  • 5.多线程–线程安全
  • 6.多线程–线程的通信
  • 7.多线程–Lock
  • 8.多线程–线程的停止
  • 9.多线程–守护线程
  • 10.多线程–join
  • 11.多线程–线程的状态图

递归

  • 递归:有条件的自己调用自己(方法)
  • 条件:
  • 1.要给一个出口负责结束当前的递归
  • 2.循环次数不能太多,否则占用内存过多,死机
    java第19天----递归,文件类,流的简介和,字符流-LMLPHP
    java第19天----递归,文件类,流的简介和,字符流-LMLPHP
  • 死循环: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。作用:实现两个设备之间的通信。
  • 设备:内存,磁盘,控制台,键盘,文件,网络
  • 网络:在网络上,你的主机之外的环境,
    java第19天----递归,文件类,流的简介和,字符流-LMLPHP
  • 流的分类:
    • 根据操作方式分类:输入流和输出流
    • 根据数据的类型分类:字节流和字符流
  • 字节流:传输的字节,可以传输任意类型的数据----视频,音频。文件,图片等
  • 字符流:传输的也是字节,不同点在于传输的过程中加入了编码的操作,让我们在传输字符的时候更加便捷----文件
  • 以内存为参考
  • 字节流:----对应的父类
  • 字节输入流: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

  • 两种方式:
  • 第一种:read()–一个一个字符的读
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();
	}
10-05 11:36