JAVA学习课第五十三届 — IO流程(七)File打靶 & Properties设置

一个、锻炼

深度遍历目录

深度遍历非常自然而然想到递归,而递归就非常自然的想到事实上现的底层算法是栈

对指定文件夹下列出全部内容(包括子文件夹的内容)

PS:建议不要遍历C盘

import java.io.*;

public class Main
{
	public static void main(String[] args) throws IOException {

		File dir = new File("D:\\ACM集训");
		ListAllDemo(dir,0);
	}

	public static void ListAllDemo(File dir,int level) throws IOException {

		System.out.println(GetSpace(level)+"文件夹 : "+dir.getAbsolutePath());
		level++;//为了缩进
		//获取指定文件夹下当前全部文件/文件对象
		File[] files = dir.listFiles();
		for(int i =0;i<files.length;i++){
			if(files[i].isDirectory()){
				ListAllDemo(files[i],level);
			}
			else{
				System.out.println(GetSpace(level)+"文件 : "+files[i].getAbsolutePath());
			}
		}
	}

	public static String GetSpace(int level) {
		// TODO Auto-generated method stub
		StringBuilder sb = new StringBuilder();
		for(int i = 0;i<level;i++)
		sb.append("    ");
		return sb.toString();
	}
}

删除文件夹

import java.io.*;

public class Main
{
	public static void main(String[] args) throws IOException {

		File dir = new File("D:\\ACM集训1");
		//dir.delete(dir);假设文件中有内容,是不能从根文件夹删除的,必须从里往外删
		DeleteDemo(dir);
	}

	public static void DeleteDemo(File dir) {

		File[] files = dir.listFiles();
		for(File f: files){
			if(f.isDirectory()){
				DeleteDemo(f);
			}
			else{
				System.out.println(f.getAbsolutePath()+" : "+f.delete());//删除文件
			}
		}
		System.out.println(dir.getAbsolutePath()+":"+dir.delete());//删除文件夹
	}

}

二、Properties集合

API文档解释:Properties 类表示了一个持久的属性集。Properties 可保存在流中或从流中载入。

属性列表中每一个键及其相应值都是一个字符串。

特点:

该集合中的键和值都是字符串类型

集合中的数据能够保存到流中,或从流中获取

通常该集合用于操作以键值对的形式存在的配置文件

import java.io.*;
import java.util.Properties;
import java.util.Set;

public class Main
{
	public static void main(String[] args) throws IOException {

		PropertiesDemo();
	}

	public static void PropertiesDemo() {
		//存
		Properties pro = new Properties();
		pro.setProperty("a", "1");
		pro.setProperty("b", "2");
		pro.setProperty("c", "3");
		pro.setProperty("d", "1");

		//改动
		pro.setProperty("c", "6");
		//取
		Set<String> name = pro.stringPropertyNames();
		//stringPropertyNames():返回此属性列表中的键集。当中该键及其相应值是字符串,
		//假设在主属性列表中未找到同名的键,则还包含默认属性列表中不同的键。
		for(String s : name){
			String value = pro.getProperty(s);
			//getProperty():用指定的键在此属性列表中搜索属性。
			System.out.println(s+" : "+value);
		}
	}
}

三、Properties集合和流对象相结合

1.list方法:

将属性列表输出到指定的输出流。

此方法对调试非常实用。

public static void PropertiesDemo() {

		Properties pro = new Properties();
		pro.setProperty("a", "1");
		pro.setProperty("b", "2");
		pro.setProperty("c", "3");
		pro.setProperty("d", "1");

		pro.list(System.out);
	}

调用此方法随时都能够看到Properties集合存储的是什么

和 System.getProperties(),差点儿相同

2.store方法

这方法就体现了Properties集合特点中的持久化,将集合中的信息储存起来

public void store(OutputStream out, String comments)throws IOException

以适合使用 load(InputStream) 方法载入到 Properties 表中的格式。将此
Properties 表中的属性列表(键和元素对)写入输出流。

out - 输出流。

comments - 属性列表的描写叙述。

而save方法已经过时了。

public static void PropertiesDemo() throws IOException {

		Properties pro = new Properties();
		pro.setProperty("a", "1");
		pro.setProperty("b", "2");
		pro.setProperty("c", "3");
		pro.setProperty("d", "1");

		//将Properties集合中的信息持久化的储存到文件里,须要关联输出流

		FileOutputStream fos = new FileOutputStream("tep.txt");
		//集合数据存储到文件里。store
		pro.store(fos, "name and age");//这种方法不建议是使用中文信息
	}

3.load方法

load(InputStream inStream) 输入流中读取属性列表(键和元素对)。

public static void PropertiesDemo() throws IOException {

		//集合中的数据来自文件,而不是我们存放的
		Properties pro = new Properties();//注意必须保证文件里的数据是键值对

		FileInputStream fis = new FileInputStream("tep.txt");

		//使用load方法
		pro.load(fis);
		pro.list(System.out);
	}

其原理

	public static void Myload() throws IOException {

		Properties pro = new Properties();
		BufferedReader br = new BufferedReader(new FileReader("tep.txt"));
		String str = null;
		while((str = br.readLine())!=null){
			if(str.startsWith("#"))continue;//由于文件里有些配置信息不是含“=”的
			String[] arr = str.split("=");
			//System.out.println(arr[0]+":"+arr[1]);
			pro.setProperty(arr[0], arr[1]);
		}
		pro.list(System.out);
		br.close();

	}

4.改动已有的配置文件里的信息

1.读取这个文件

2.将文字中的键值信息存储到集合中

3.通过集合改动信息

4.在通过流将改动后的信息存储到文件里

public static void PropertiesDemo() throws IOException{

		File file = new File("tep.txt");
		if(!file.isFile()){
			file.createNewFile();
		}
		FileReader fr = new FileReader("tep.txt");
		//FileWriter fw = new FileWriter(file);假设放在这。就会新建一个文件覆盖file。最后文件存的c=3
		Properties pro = new Properties();
		pro.load(fr);
		//pro.list(System.out);
		pro.setProperty("c", "3");

		//一定要改完后才关联输出流对象,不要在上面就关联
		FileWriter fw = new FileWriter(file);//流能够直接操作File对象
		pro.store(fw, "after change");
	}

四、练习

获取一个应用程序的使用次数,超过3次,给出使用次数已到请注冊的信息,并不要再执行程序的信息

分析:

此需求。须要一个计数器,每次程序启动计数器进内存。次数+1,退出程序,计数器关闭。存储到文件。

由于信心要明白。应该有名字和次数。->键值对->Map->Map+IO -> Properties

public static void PropertiesDemo() throws IOException{

		File countFile = new File("conutFile.properties");//键值对的配置信息(java)
		if(!countFile.isFile())
			countFile.createNewFile();
		FileInputStream  fis = new FileInputStream(countFile);
		Properties pro = new Properties();
		pro.load(fis);

		//从集合中通过键获取使用次数

		String value = pro.getProperty("time");
		int count = 0;//定义计数器
		if(value!=null){
			count = Integer.parseInt(value);//转换成int
			if(count>=3){
				throw new RuntimeException("使用次数已到。请注冊!");
			}
		}
		count++;
		//将改变后的数据又一次存储
		pro.setProperty("time", count+"");//改动

		FileOutputStream fos = new FileOutputStream(countFile);//关联输出流

		pro.store(fos, "time is");//存储到文件
		fos.close();
		fis.close();
	}

在开发的时候就能够将这段代码封装成一个对象,在执行时,创建就可以

版权声明:本文博客原创文章,博客,未经同意,不得转载。

时间: 2024-08-09 13:06:18

JAVA学习课第五十三届 — IO流程(七)File打靶 &amp; Properties设置的相关文章

JAVA学习课第五 — IO流程(九)文件分割器合成器

文件分割器 private static final int SIZE = 1024 *1024; public static void splitFile(File file) throws IOException{ //用读取流关联文件(不确定文件格式) FileInputStream fis = new FileInputStream(file);//源是一个 byte[] by = new byte[SIZE];//定义1M的缓冲区 FileOutputStream fos = null

JAVA学习课第五十八届 — GUI

GUI Graghical User Interface(图形用户接口) java为GUI提供的对象都存在java.awt和java.swing包中 Java的GUI做的的确干只是C++等.不打算浪费过多的时间在这上面 一个简单的窗口演示 public static void main(String[] args){ Frame f = new Frame("新窗口"); f.setLocation(400, 200);//设置窗口的位置 f.setSize(500, 400);//设

第五周JAVA学习笔记(五)

将指定目录下的所有文件显示到列表框(JList)组件中, :效果图如下:                  import java.awt.BorderLayout; import java.io.File; import javax.swing.JComboBox; import javax.swing.JFrame; import javax.swing.JList; import javax.swing.JScrollPane; public class kuang { public st

java学习之第五章编程题示例(初学篇)

1 /* 2 Animal.java 3 */ 4 package animal; 5 6 public abstract class Animal { 7 public abstract void cry(); 8 public abstract String getanimalName(); 9 } 1 //Dog.java 2 package animal; 3 4 public class Dog extends Animal 5 { 6 7 String aa="旺旺"; 8

java学习笔记(五)枚举

原文出处:http://www.cnblogs.com/linjiqin/archive/2011/02/11/1951632.html 在实际编程中,往往存在着这样的"数据集",它们的数值在程序中是稳定的,而且"数据集"中的元素是有限的. 例如星期一到星期日七个数据元素组成了一周的"数据集",春夏秋冬四个数据元素组成了四季的"数据集". 在java中如何更好的使用这些"数据集"呢?因此枚举便派上了用场,以

构建之法学习(第五章 团队和流程)

第五章团队和流程 本章主要讲了一些典型的软件团队模式和开发流程以及它们的优缺点 1.团队的共同特点: -应该有一致的集体目标,团队要一起完成这目标   -团队成员有各自的分工,互相依赖合作,共同完成任务 2.软件团队的模式 主治医师模式(有首席工程师,其他成员支持其工作):明星模式:社区模式:   业余剧团模式:秘密团队(软件项目在秘密状态下进行):   特工团队(由特殊技能的专业人士组成):交响乐团模式(各司其职,重在执行):   爵士乐模式:功能团队模式(平等协作,共同完成):官僚模式 3.

JAVA学习第十五课(多态及其基本应用)

多态: 面向对象的第三个特征,定义:某类事物存在多种形态,比如,函数就具备多态性,同名的一个函数,它的参数列表不一样,它的存在性就不一样,还有同一个函数,放在父类和放在子类,它的存在性也就不一样. 对象也存在多态性. 例子:动物有猪.猫.狗等 猫这个对象对应的类是猫类 猫 x = new 猫(): 同时,猫还是动物的一种,也就可以把猫成为动物 动物 y = new 猫(); 动物 z = new 狗(); 动物是狗和猫集体事物中抽取出来的父类 父类引用指向了子类对象 一.概述 //对象的多态性

JAVA学习第二十五课(多线程(四))- 单例设计模式涉及的多线程问题

一.多线程下的单例设计模式 利用双重判断的形式解决懒汉式的安全问题和效率问题 //饿汉式 /*class Single { private static final Single t = new Single(); private Single(){} public static Single getInstance() { return t; } } */ //懒汉式 class Single { private static Single t = null; private Single()

java学习笔记(五)

import java.awt.BorderLayout;import java.awt.Color;import java.io.File; import javax.swing.JComboBox;import javax.swing.JFrame;import javax.swing.JPanel;import javax.swing.JScrollPane;import javax.swing.JTextArea; public class FileUtils {/** 列出指定文件夹(