黑马程序员——Java基础_IO流之文件和Perproties

时间:2022-10-06 00:46:16

 ----------------------Android培训Java培训、期待与您交流! ----------------------

1 文件(File)

File类常见方法:

创建:

          boolean createNewFile():在指定位置创建文件,如果该文件已经存在,则不创建,返回false。

          注意:这里和输出流不一样,输出流对象一建立创建文件。而且文件已经存在,会直接覆盖。

          boolean mkdir():创建文件夹。

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

删除:

          boolean delete():删除失败返回false。如果文件正在被使用,则删除不了返回false。

          void deleteOnExit();在程序退出时删除指定文件。

判断:

          boolean exists() :文件是否存在.

          isFile():

          isDirectory();

          isHidden();

          isAbsolute();

获取信息:

          getName():

          getPath():

          getParent():

          getAbsolutePath() 

          long lastModified() 

          long length() 

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

public static void method_5()
{
File f1 = new File("c:\\Test.java");
File f2 = new File("d:\\hahah.java");
sop("rename:"+f2.renameTo(f1));
}

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

public static void method_3()throws IOException
{
File f = new File("d:\\java1223\\day20\\file2.txt");

//f.createNewFile();
//f.mkdir();
//记住在判断文件对象是否是文件或者目的时,必须要先判断该文件对象封装的内容是否存在。
//通过exists判断。
sop("dir:"+f.isDirectory());
sop("file:"+f.isFile());
sop(f.isAbsolute());
}

public static void method_2()
{
File f = new File("file.txt");
//sop("exists:"+f.exists());
//sop("execute:"+f.canExecute());
//创建文件夹
File dir = new File("abc\\kkk\\a\\a\\dd\\ee\\qq\\aaa");
sop("mkdir:"+dir.mkdirs());
}


public static void method_1()throws IOException
{
File f = new File("file.txt");
//sop("create:"+f.createNewFile());
//sop("delete:"+f.delete());
}
//创建File对象
public static void consMethod()
{
//将a.txt封装成file对象。可以将已有的和未出现的文件或者文件夹封装成对象。
File f1 = new File("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+"zzz"+File.separator+"a.txt");
}

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

-----------------------------分割线-----------------------------

2 递归列出文件夹下所有文件

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

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

          递归要注意:限定条件;要注意递归的次数。尽量避免内存溢出。

练习:

import java.io.*;
import java.util.ArrayList;
import java.util.List;

/*编写一个程序,将d:\java目录下的所有.java文件复制到d:\jad目录下,
并将原来文件的扩展名从.java改为.jad。*/

public class test09 {
public static void main(String[] args) {
// TODO Auto-generated method stub
ArrayList<File> list = new ArrayList<File>();
String sourceDir = "D:\\java";//定义源文件夹
String targetDir = "D:\\jad";//定义目标文件夹
File fs = new File(sourceDir);
File ft = new File(targetDir);
//若目标文件夹不存在,则创建目标文件夹
if(!ft.exists())
ft.mkdir();
//调用遍历方法
bianli(fs,list);
//调用复制文件夹方法
copyDir(list,targetDir);
System.out.println("复制完毕");
}

//该方法将所有.java文件的源路径从List集合中读取出来,并设置好其目标路径,然后调用copyFile()方法进行文件复制
public static void copyDir(List<File> list,String root){
String target = null;
String source = null;
String fileName = null;
for(File f:list){
source = f.getAbsolutePath();
fileName = f.getName();
target = root+"\\"+fileName.substring(0,fileName.indexOf("."))+".jad";
copyFile(source, target);
}
}

//该方法负责把传入过来的source源路径的文件复制到target目标路径
public static void copyFile(String source,String target){
BufferedInputStream bis = null;
BufferedOutputStream bos = null;
byte[] buf = new byte[1024];
try {
bis = new BufferedInputStream(new FileInputStream(source));
bos = new BufferedOutputStream(new FileOutputStream(target));
while(bis.read(buf)!=-1){
bos.write(buf);
}
bos.flush();
}
catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
finally{
try {
bis.close();
bos.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}

//该方法负责遍历源文件夹,将源文件夹中的所有.java文件存储到List集合中去
public static void bianli(File f,List<File> list){
File[] files = f.listFiles();
for(File file:files){
if(file.isDirectory())
bianli(file, list);
else
if(file.getName().endsWith(".java"))
list.add(file);
}
}
}

-----------------------------分割线-----------------------------

3 Properties

          PropertieshashTable的子类。

          也就是说它具备map集合的特点。而且它里面存储的键值对都是字符串。它是集合中和IO技术相结合的集合容器。

Properties对象特点:可以用于键值对形式的配置文件。在加载数据时,需要数据有固定格式:键=值。

练习:限制程序运行次数。当运行次数到达5次时,给出,请您注册的提示。并不再让该程序执行。

提示:程序运行完了以后还可以将数据保存起来,原理就是将数据存到Properties配置文件中了,通过对它读写,就可以做到记录程序的运行次数。

import java.io.*;
import java.util.*;
class RunCount
{
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)
{
System.out.println("您好,使用次数已到,拿钱!");
return ;
}
}
count++;
prop.setProperty("time",count+"");
FileOutputStream fos = new FileOutputStream(file);
prop.store(fos,"");
fos.close();
fis.close();
}
}

注意Writer这类输出流根据读取流读的文件定义后,Properties对象将无法从读取流中读到数据了。



 ----------------------Android培训Java培训、期待与您交流! ----------------------