[Java视频笔记]day20

File类

1. 用来将文件或者文件夹封装成对象

2. 方便对文件与文件夹的属性信息进行操作(流只能操作数据)

3. File对象可以作为参数传递给流的构造函数

 

File类常见方法:

1. 创建

         boolean createNewFile();在指定位置创建文件,如果该文件已经存在,则不创建,返回false.和输出流不一样,输出流对象一建立就创建文件,而且文件已经存在,则覆            盖。

         boolean mkdir():创建文件夹

         boolean mkdirs():创建多级文件夹

2. 删除

         boolean delete(); //删除失败返回false

         void deleteOnExit();//在虚拟机退出时删除指定文件

3. 判断

         boolean exists();//文件是否存在

         isFile();

         isDirectory();

         isHidden();

isAbsolute()//是否是绝对路径

4. 获取信息

         getName();

         getPath();

         getParent();

         getAbsolutePath();

         long lastModified();//上次修改的时间

         long length();//文件大小

import java.io.*;

class  day20
{
	public static void main(String[] args) throws IOException
	{
		method_5();
	}

	public static void method_5()
	{
		File f1 = new File("file.txt");
		File f2 = new File("haha.txt");
		sop(f1.renameTo(f2));
	}

	public static void method_4()
	{
		File f = new File("file.txt");//文件可以存在也可以不存在
		sop("path:"+f.getPath());//相对路径
		sop("abspath:"+f.getAbsolutePath());//绝对路径
		sop("parent:"+f.getParent());//该方法返回的是绝对路径中的文件父目录
		//如果获取的是相对路径,返回null,比如上面的file.txt。如果相对路径中有
		//上一层目录,那么该目录就是返回结果
	}

	public static void method_3()throws IOException
	{
		File f = new File("file.txt");
		f.createNewFile();
		//记住在判断文件对象是否是文件或者目录时,必须要先判断文件
		//对象封装的内容是否存在,通过exists判断。
		sop("dir:"+f.isDirectory());
		sop("file:"+f.isFile());

		sop(f.isAbsolute());//是否是绝对路径
	}

	public static void method_2()
	{
		File f = new File("file.txt");
		//sop("execute:" + f.canExecute());
		sop("exists:"+f.exists());
	}

	public static void method_1() throws IOException
	{
		File f = new File("file.txt");
		//f.deleteOnExit();//虚拟机退出时删除,就算中间发生异常也没关系
		//sop("create:" + f.createNewFile());
		sop("delete:"+f.delete());

		//创建文件夹(目录)
		File dir = new File("abc");
		sop("mkdir:"+dir.mkdir());

		//File dirs = new File("abc\\d\\kk\\ff\\fdg");
		//dirs.mkdirs();
	}

	//创建File对象
	public static void consMethod()
	{
		//将a.txt封装成file对象,可以将已有的和未出现的
		//文件或者文件夹封装成对象
		File f1 = new File("c:\\a.txt");

		File f2 = new File("c:\\abc", "b.txt");


		File d = new File("c:\\abc");
		File f3 = new File(d, "c.txt");

		sop("f1:" + f1);
		sop("f2:" + f2);
		sop("f3:" + f3);

		File f4 = new File("c:"+File.separator+"abc"+File.separator+"t.txt");
		//File.separator是分隔符,可以跨平台
	}

	public static void sop(Object obj)
	{
		System.out.println(obj);
	}
}

列出指定目录下的所有文件和目录(不包含子目录中的文件)

import java.io.*;

class  day20
{
	public static void main(String[] args) throws IOException
	{
		File dir = new File("d:\\java_day18");//当前目录下的目录和文件对象(不包含子目录中的文件)
		File[] files = dir.listFiles();
		for(File f : files)
		{
			sop(f.getName()+"::"+f.length());
		}
	}

	public static void listDemo2()
	{
		File dir = new File("d:\\java_day18");
		String[] arr = dir.list(new FilenameFilter()//文件名过滤器
		{
			public boolean accept(File dir, String name)
			{
				//sop(dir+"..."+name);
				return name.endsWith(".txt");//只显示.txt文件
			}
		});
		sop(arr.length);
		for(String name : arr)
		{
			sop(name);
		}
	}

	public static void listDemo()//打印c盘下文件和文件夹的名称
	{
		File f = new File("c:\\");
		String[] names = f.list();//调用list方法的file对象必须是封装了一个目录,
									//该目录还必须存在
		for(String name : names)
		{
			sop(name);
		}
	}

	public static void listRootsDemo()//打印出所有的盘符  c:\\   d:\\
	{
		File[] files = File.listRoots();
		for(File f : files)
		{
			sop(f);
		}
	}

	
	public static void sop(Object obj)
	{
		System.out.println(obj);
	}
}

列出指定目录下文件或者文件夹,包含子目录中的内容。也就是列出指定目录下的所有内容。

因为目录中还有目录,只要使用同一个列出目录功能的函数完成即可。在列出过程中出现的还是目录的话,还可以再次调用本功能。也就是函数自身调用自身。这种表现形式,或者编程手法,称为递归。

 

递归要注意:

1. 限定条件

2. 要注意递归的次数,避免内存溢出。

import java.io.*;

class  day20
{
	public static void main(String[] args) throws IOException
	{
		File dir = new File("d:\\java_day18");
		showDir(dir, 0);
	}
	public static String getLevel(int level)//单纯是为了让显示直观一些
	{
		StringBuilder sb = new StringBuilder();
		sb.append
		for(int x = 0; x < level; x ++)
		{
			sb.append("|--");
		}
		return sb.toString();
	}
	public static void showDir(File dir, int level)
	{
		sop(getLevel(level)+dir);//打印下目录
		level++;
		File[] files = dir.listFiles();
		for(File file : files)
		{
			if(file.isDirectory())
				showDir(file, level);
			else
				sop(getLevel(level)+dir);
		}
	}

	public static void sop(Object obj)
	{
		System.out.println(obj);
	}
}

输出:

d:\java_day18

|--d:\java_day18

|--d:\java_day18

|--d:\java_day18

|--d:\java_day18

|--d:\java_day18

|--d:\java_day18

|--d:\java_day18

|--d:\java_day18\hello

|--|--d:\java_day18\hello

|--d:\java_day18

 

删除一个带内容的目录。

删除原理:

在windows中,删除目录是从里面往外删除的。

既然是从里往外删除,就需要用到递归。

import java.io.*;

class  day20
{
	public static void main(String[] args) throws IOException
	{
		File dir = new File("d:\\java_day18");
		removeDir(dir);
	}

	public static void removeDir(File dir)
	{
		File[] files = dir.listFiles();
		for(int x = 0; x < files.length; x ++)
		{
			if(!files[x].isHidden() && files[x].isDirectory())
				removeDir(files[x]);
			else
				sop(files[x].toString()+".."+files[x].delete());
		}
		sop(dir.toString()+"....>>>"+dir.delete());
	}
	
	public static void sop(Object obj)
	{
		System.out.println(obj);
	}
}


练习:将一个指定目录下的txt文件的绝对路径,存储到一个文本文件中。建立一个txt文件列表文件。

思路:

1. 对指定的目录进行递归。

2. 获取递归过程中所有的txt文件的路径。

3. 将这些路径存储到集合中。

4. 将集合中的数据写入到一个文件中。

import java.io.*;
import java.util.*;

class  day20
{
	public static void main(String[] args) throws IOException
	{
		File dir = new File("d:\\java_day18");
		List<File> list = new ArrayList<File>();
		fileToList(dir, list);
		//sop(list.size());
		File file = new File(dir, "javaList.txt");
		writeToFile(list, file.toString());
	}

	//将dir目录下所有.txt文件绝对路径保存到list集合中去
	public static void fileToList(File dir, List<File> list)
	{
		File[] files = dir.listFiles();
		for(File file : files)
		{
			if(file.isDirectory())
				fileToList(file, list);
			else
			{
				if(file.getName().endsWith(".txt"))
					list.add(file);
			}
		}
	}

	//将文件绝对路径的集合中的文件绝对路径写入到文件中去
	public static void writeToFile(List<File> list, String javaListFile)throws IOException
	{
		BufferedWriter bufw = null;
		try
		{
			bufw = new BufferedWriter(new FileWriter(javaListFile));
			for(File f :list)
			{
				String path = f.getAbsolutePath();
				bufw.write(path);
				bufw.newLine();
				bufw.flush();
			}
		}
		catch (IOException e)
		{
			throw e;
		}
		finally
		{
			try
			{
				if(bufw != null)
					bufw.close();
			}
			catch (IOException e)
			{
				throw e;
			}
		}
	}

	public static void sop(Object obj)
	{
		System.out.println(obj);
	}
}

Properties是hashtable的子类。也就是说它具备Map集合的特点,而且它里面存储的键值对都是字符串。是集合中和io技术相结合的集合容器。

该对象的特点:可以用于键值对形式的配置文件。

那么加载数据时,需要数据有固定格式:键=值

import java.io.*;
import java.util.*;

class  day20
{
	public static void main(String[] args) throws IOException
	{
		method_2_loadDemo();
	}

	//如何将流中的数据存储到集合中
	//想要将info.txt中键值数据存到集合中进操作
	//info.txt中的内容如下:
	//zhangsan=40
	//lisi=50
	/*
		1.用一个流和info.txt文件关联
		2.读取一行数据,将该行数据用'='分割
		3.等号左边作为键,右边作为值,存入到properties集合中即可
	*/
	public static void method_2_loadDemo() throws IOException
	{
		FileInputStream fis = new FileInputStream("info.txt");
		Properties prop = new Properties();
		//将流中的数据加载进集合
		prop.load(fis);//封装好了
		//sop(prop);
		prop.list(System.out);//列出集合目录

		prop.setProperty("zhangsan", "100");//修改内存中,但没修改文件中的数据
		FileOutputStream fos = new FileOutputStream("info.txt");
		prop.store(fos, "midified");
		prop.list(System.out);//列出集合目录

		fos.close();
		fis.close();


	}
	public static void method_1() throws IOException
	{
		BufferedReader bufr = new BufferedReader(new FileReader("info.txt"));
		String line =null;
		Properties prop = new Properties();
		while((line = bufr.readLine()) != null)
		{
			String[] arr = line.split("=");
			prop.setProperty(arr[0], arr[1]);
		}

		bufr.close();
		sop(prop);
	}

	//设置和获取元素
	public static void setAndGet()
	{
		Properties prop = new Properties();
		prop.setProperty("zhangsan", "30");
		prop.setProperty("lisi", "40");
		//sop(prop);
		String value = prop.getProperty("lisi");
		sop(value);//输出40

		//修改
		prop.setProperty("lisi", "89");

		//获取全部
		Set<String> names = prop.stringPropertyNames();
		for(String s : names)
		{
			sop(s+":"+prop.getProperty(s));
		}
	}

	public static void sop(Object obj)
	{
		System.out.println(obj);
	}
}

用于记录应用程序运行次数。如果使用次数已到,那么给出注册提示。

很容易想到的是:计数器。可是该计数器定义在程序中,随着程序的运行而在内存中存在,并进行了自增。但随着该应用程序的退出,该计数器也在内存中消失。下一次再启动该程序,又重新开始从0计数。这样不是我们想要的。想要的是程序即使结束,该计数器的值也存在,下次程序启动后会先加载该计数器的值并加1后再重新存储起来。所以要建立一个配置文件,用于记录该软件的使用次数。

该配置文件使用键值对的形式。这样便于阅读数据,并操作数据。键值对数据是map集合,数据是以文件形式存储,使用io技术。那么map+io-àproperities。配置文件可以实现应用程序数据的共享。

import java.io.*;
import java.util.*;

class  day20
{
	public static void main(String[] args) throws IOException
	{
		Properties prop = new Properties();

		File file = new File("count.ini");//先封装成文件对象,可以判断存不存在
		if(!(file.exists()))//文件不存在,创建一个
			file.createNewFile();
		FileInputStream fis = new FileInputStream(file);
		prop.load(fis);

		int count  = 0;
		String value = prop.getProperty("time");
		if(value != null)
		{
			count = Integer.parseInt(value);
			if(count >= 5)
			{
				sop("DATE OUT");
				return;
			}
		}
		count ++;
		prop.setProperty("time", count+"");

		FileOutputStream fos = new FileOutputStream(file);
		prop.store(fos,"");

		fos.close();
		fis.close();

	}

	

	public static void sop(Object obj)
	{
		System.out.println(obj);
	}
}

打印流

该流提供了打印方法,可以将各种类型数据都原样打印。

 

PrintStream 字节打印流

构造函数可以接受的参数类型:

1. file对象     File

2. 字符串路径  String

3. 字节输出流 OutputStream

 

PrintWriter 字符打印流

1. file对象     File

2. 字符串路径  String

3. 字节输出流 OutputStream

4. 字符输出流 Writer

import java.io.*;
import java.util.*;
 
class day20
{
         publicstatic void main(String[] args) throws IOException
         {
                   BufferedReaderbufr = new BufferedReader(new InputStreamReader(System.in));
                   PrintWriterout = new PrintWriter(System.out, true);
                   //保存到文件中PrintWriterout = new PrintWriter(new FileWriter("a.txt", true));
                   //true代表println换行自动刷新
                   Stringline = null;
                  while((line = bufr.readLine()) != null)
                   {
                            if("over".equals(line))
                                     break;
                            out.println(line.toUpperCase());
                            //out.flush();前面如果有true,就不用写这句话了
                   }
                   out.close();
                   bufr.close();
         }
 
         publicstatic void sop(Object obj)
         {
                   System.out.println(obj);
         }
}


序列流

SequenceInputStream



多个流变成一个流

 

将1.txt  2.txt  3.txt 三个文件的内容保存到4.txt 一个文件中去

import java.io.*;
import java.util.*;

class  day20
{
	public static void main(String[] args) throws IOException
	{
		Vector<FileInputStream> v = new Vector<FileInputStream>();

		v.add(new FileInputStream("1.txt"));
		v.add(new FileInputStream("2.txt"));
		v.add(new FileInputStream("3.txt"));

		Enumeration<FileInputStream> en = v.elements();

		SequenceInputStream sis = new SequenceInputStream(en);
		//多个流对象编程一个流

		FileOutputStream fos = new FileOutputStream("4.txt");
		byte[] buf = new byte[1024];
		int len = 0;
		while((len = sis.read(buf)) != -1)
		{
			fos.write(buf, 0, len);
		}
		fos.close();
		sis.close();
	}

	public static void sop(Object obj)
	{
		System.out.println(obj);
	}
}

接下来能合并就能切割

import java.io.*;
import java.util.*;

class  day20
{
	public static void main(String[] args) throws IOException
	{
		merge();
	}

	public static void splitFile()throws IOException
	{
		FileInputStream fis = new FileInputStream("x.jpg");

		FileOutputStream fos = null;
		byte[] buf = new byte[1024 * 1024];//1M
		int len = 0;
		int count = 1;
		while((len = fis.read(buf)) != -1)//每1M就存一个文件
		{
			fos = new FileOutputStream("splitFiles\\"+(count++)+".part");
			fos.write(buf, 0, len);
			fos.close();
		}
		fis.close();
	}

	public static  void merge() throws IOException//合并切割文件
	{
		ArrayList<FileInputStream> al = new ArrayList<FileInputStream>();
		for(int x = 1; x<= 7; x++)
		{
			al.add(new FileInputStream("splitFiles\\"+x+".part"));
		}

		final Iterator<FileInputStream> it = al.iterator();
		//下面匿名内部类访问到了it,所以这里要用final修饰
		Enumeration<FileInputStream> en = new Enumeration<FileInputStream>()
		{
			public boolean hasMoreElements()
			{
				return it.hasNext();
			}
			public FileInputStream nextElement()
			{
				return it.next();
			}
		};
		SequenceInputStream sis = new SequenceInputStream(en);

		FileOutputStream fos = new FileOutputStream("victory.jpg");//合并成该文件

		byte[] buf = new byte[1024 * 1024];
		int len = 0;
		while((len = sis.read()) != -1)
		{
			fos.write(buf, 0, len);
		}
		fos.close();
		sis.close();
	}

	public static void sop(Object obj)
	{
		System.out.println(obj);
	}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 尚硅谷Java基础笔记是一套系统而全面的Java基础学习资料。这份笔记Java语言的基本概念介绍开始,涵盖了Java的核心知识点,包括变量、数据类型、运算符、流程控制等。接着,笔记详细讲解了面向对象编程的特点和Java中的类、对象、封装、继承、多态等内容。 在这份笔记中,还深入讨论了Java中的常用类库,如String、ArrayList、HashMap等,以及它们的常见用法和实例操作。此外,笔记还介绍了常见的异常处理机制,包括try-catch语句、throw和throws关键字等,帮助学习者理解并掌握Java中的错误和异常处理。 除了基础知识的讲解,尚硅谷Java基础笔记还提供了大量的例子和练习题,帮助学习者巩固所学内容,并通过实践提高编程能力。这些例子和练习题涵盖了各个知识点和应用场景,从简单到复杂,逐渐深入,非常有助于学习者的理解和应用能力的提升。 总而言之,尚硅谷Java基础笔记是一份详细、系统、易懂的学习资料,适合初学者入门学习Java编程。无论是对于零基础的学习者还是对于有一定编程经验的人来说,这份笔记都是一份不可多得的宝藏,可以帮助他们夯实Java基础,掌握编程技巧,为进一步扩展知识奠定坚实的基础。 ### 回答2: 尚硅谷java基础笔记是一份完整而详细的教程,对于初学者来说是一个很好的学习资源。 这份笔记由尚硅谷团队精心编写而成,包含了Java基础的各个方面。首先从Java的历史和应用领域入手,引导读者对Java有一个整体的认识。然后逐步介绍Java的发展环境和使用工具,让读者能够了解如何配置和使用Java开发环境。 接下来,笔记逐个介绍了Java的基本语法、数据类型、运算符、流程控制语句等基础知识。这些内容以简洁明了的方式呈现,附有实例和练习题,让读者可以通过练习巩固所学内容。 除了基础语法,笔记还深入讲解了Java的面向对象编程思想和相关特性,包括类与对象、封装、继承、多态等。这部分内容对于理解Java的核心思想和编程范式非常重要,而且通过实例和案例的讲解,更加直观地展示了面向对象的优势和应用。 此外,笔记还包含了Java的常用类库的介绍,如集合框架、IO流、异常处理等,这些内容对于进行实际开发非常实用。 总之,尚硅谷java基础笔记内容全面、深入浅出,适合初学者学习和巩固基础知识。通过系统地学习这份笔记,读者可以建立起扎实的Java基础,为后续的学习和实践打下坚实的基础。同时,笔记中的案例和练习题也为读者提供了不少实践机会,帮助读者更好地理解和应用所学知识。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值