JavaIO技术总结。
一.File类。
1.File类作用:
1.用来将文件或文件夹封装为对象。
2.方便对文件与文件夹进行属性的操作,从而弥补了流的不足(留不可以操作文件夹、文件的属性信息)。
3.File类可以作为参数传递给流的构造函数。
4.File类中的方法使得操作文件更方便。
2.创建对象。
//将a.txt封装为file对象。可以通过构造函数将要操作的已有的或未出现的文件或文件夹封装为对象。(将文件信息传给对象,通过对象内部的方法调用系统底层以达到操作文件的目的)。
File f1 = new File(“a.txt”);//创建当前目下的文件a.txt相对路径
File f2 = new File (“c:\\123”,“b.txt”);//创建到指定路径下的b.txt文件。绝对路径
File d = new File(“c:\\123”);//将路径封装为对象。
File f3 = new File(d,“c.txt”);//在指定目录创建文件。
其中的“\\”可以写成“/”或写为跨平台的目录分隔符“File.separator”
3.File类的常见方法。
1.创建方法:
*boolean createNewFile();创建文件。如果该文件已经存在则不创建,返回false,和输出流不同,输出流意见立对象就创建文件,并且会覆盖原有文件。
File f1 = new File(“1.txt”);
f1.createNewFile();
2.删除方法。
Void deleteOnExit();在程序退出时删除。
*boolean delete();删除文件,删除失败返回假。
f1.delete();
f1.deleteOnExit();
3.判断方法。
boolean canExecute();判断文件是否可执行。
*boolean exist();测试此路径名表示的文件或目录是否存在。
Boolean mkdir();创建一级目录。
File dir = new File(“abc”);
File dir1 = new File(“abc\\123\\1”);
dir.mkdir();
dir1.mkdirs();
boolean mkdirs();创建多级目录。
Boolean isDirectory();判断是否存在目录。在判断文件对象是否是文件或者目的时,必须要先判断该文件的对象封装的内容是否存在。
通过exist()判断。
Boolean isFile();是否存在文件。
Boolean isHidden();是否隐藏。
isAbsolute();判断对象是否是绝对路径,不管对象是否被创建
4.获取信息的方法
String getName()获取文件或目标的名称。
String getParent()返回父目录名称
*Boolean renamTo();重写命名文件的名(包括路径)。
File f1 = new File(“c:\\old.txt”);
File f2 = new File(“d:\\new.txt”);
*f1.renameTo(f2);若改名成功返回true。
File[] listRoots();返回盘符File类型数组列表。
File[] files = File.listRoots();
for(Filf f : files)
{
System.out.println(“盘符:”+f);
}
String getAbsolutePath()获取文件的绝对路径。
Long length();获取文件的大小。
Long lastModified()获取上次文件被修改的时间。
String[] list();获取指定前目录下的文件夹或文件的名称(包含隐藏文件)。当指定的对象为文件时,抛出空指针异常。
File f1 = new File(“c:\\”);
String[] names = f1.list();
for(String name : names)
{
System.out.println(“文件列表”+name);
}
*String[]list(FilenameFilter filter);文件过滤,返回指定名称的文件名数组。过滤器必须实现FilenameFilter接口,并重写其accept(File路径,String名称)方法,指定自定义过滤器。
File dir = new File(“c:\\123”);
String[] arr = dir.list(newFilenameFilter
{ //使用匿名内部类实现FilenameFilter接口,重写了过滤方法。
public boolean accept(Filedir,String name)
{
System.out.println(“dir:”+dir+“name”+name);
/*If(name.endsWith(“.java”))
returnture;
else
returnfalse;*/
returnname.endsWith(“.java”);//后缀名称为.java的文件,则返回true
}
});
File[] listFiles();返回当前文件下的文件的对象。listFiles()方法的优点,list()方法只能返回文件的名称具有局限性,在开发时应使用listFile[]提高效率,返回的为File类的对象,就可以调用File类中的更多方法,获取更多的信息。如通过getName()方法获取对象索关联的文件名称。Length()获取文件的长度等。
File f1 = new File(“c:\\123”);
File[] arr = f1.listFiles()
for(File f : arr)
{
System.out.println(“名称”+f.getName()+f.length());
}
5.递归。
递归思想。
1. 简单的递归例子:
toBin(5);
Void toBin(int num)
{
If(num>0)
toBin(num/2);
print(num%2);
}
列出指定目录下的文件或文件夹,包括子目录中的内容。
也就是列出多层目录中的所有内容。
使用递归时要注意:
1. 递归要有停止递归的限制条件。2.注意递归的次数,以防内存溢出。
1. 通过listFiles()方法获取指定目录下的目录列表。
2. 通过while循环遍历文件或文件夹名。
3. 使用isDirectrory();方法判断File对象是文件还是文件夹。
4. 如果为文件夹则调用本身方法,进行该文件夹下的文件或文件夹名称遍历。
5. 当其不再存在子文件夹时,输出该目录下的文件名(这时文件中不再存在子目录)。
6. 当前执行的方法被执行完毕,调用它的被阻塞的上一个方法也将执行完毕,继续执行输出(当前执行文件夹的上个文件夹中的文件名)。
7. 通过循环遍历下一个文件或文件夹。回到第一步的步骤。
Public void show(File f)
{
File[] f1 = f.listFiles();
System.out.print(“父目录”+f.getName())
While(Filefile : f1)
{
If(file.isDirctory())
show(file)
else
System.out.println(file);
}
}
3.(必须掌握)递归方法练习:
删除一个带内容的多层级文件夹。
Abc
|--123
| |--a.txt
| |--b.txt
|--234
|--456
|--c.txt
|--d.txt
Public void deleteTool(File f)
{
File[] f1 = f.listFiles();
While(File file : f1)
{
If(file.isDirctory())
deleteTool(file)//调用本身删除多层内容
else
System.out.println(file.toString()+file.delete());
}//删除文件。
f1.delete();//删除制定目录下的第一层目录
}
4.(必须掌握)递归方法练习:
将一个指定文件夹下的java文件的绝对路径,存储到一个文本文件中。
思路:
1,对指定的目录进行递归。
2,获取递归过程所有的java文件的路径。
3,将这些路径存储到集合中。
4,将集合中的数据写入到一个文件中。
importjava.io.*;
importjava.util.*;
class JavaFileList
{
public static void main(String[] args)throws IOException
{
//创建File类对象并关联文件夹路径。
File dir = new File("d:\\java1223");
//建立list集合用于存储File类型对象。
List
//把File类型对象存储入List集合。
fileToList(dir,list);
//创建File类对象并关联文件。该文件用于写入文件列表。
File file = newFile(dir,"javalist.txt");
//把文件列表写入到文件中
writeToFile(list,file.toString());
}
public static void fileToList(Filedir,List
{
File[] files = dir.listFiles();
for(File file : files)
{
if(file.isDirectory())
fileToList(file,list);
else
{
if(file.getName().endsWith(".java"))
list.add(file);//将后缀为.java的File对象添加到链表中。
}
}
}
public staticvoid writeToFile(List
{
BufferedWriter bufw = null;
try
{//使用缓冲流接受FileWriter流
bufw = newBufferedWriter(new FileWriter(javaListFile));
for(File f : list)
{ //通过getAbsolutePath()方法获取该文件的绝对路径。
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;
}
}
}
}
二.Properties类
1.Properties是hashtable的子类。也就是说它具备map集合的特点,它里面储存的键值是字符串,是集合中和IO技术相结合的集合容器。
该对象的特点:可以用于键值对形式的配置文件。在加载数据时,需要数据有固定格式:键=值。
设置和获取元素:
Properties pro = new Properties();//创建容器
pro.setProperty(“xiaowang”,“25”);//添加元素(string key,stringvalue)
pro.setProperty(“liusan”,“26”);
System.out.println(pro);
String value= pro.getProperty(“xiaowang”);//通过key获取value
System.out.println(value);
Set
Set
For(String s : names)
{
System.out.println(s+“键值”+s.getProperty());
}
要将info.txt中键值数据存到集合中进行操作。
2.练习:
1,用一个流和info.txt文件关联。
2,读取一行数据,将该行数据用"="进行切割。
3,等号左边作为键,右边作为值。存入到Properties集合中即可。
public staticvoid method_1()throws IOException
{
//使用缓存流接收关联了info文件的FielReader流。
BufferedReader bufr = new BufferedReader(new FileReader("info.txt"));
String line = null;
Properties prop = newProperties();
while((line=bufr.readLine())!=null)
{ //读取的单行字符串通过“=”分割的字符保存到字符数组中
String[] arr =line.split("=");
///System.out.println(arr[0]+"...."+arr[1]);
//通过setProperty(key,value);添加键值对到properties中。
prop.setProperty(arr[0],arr[1]);
}
bufr.close();//关闭流。
System.out.println(prop);
}
3.练习:将info中的内容存储到Properties集合中,然后增加元素,将新集合存储到info中。
public staticvoid loadDemo()throws IOException
{
Properties prop = newProperties();
。//从文件系统中的某个文件中获得输入字节(取出文件的内容以字节流的形式封装为对象。)
FileInputStream fis = new FileInputStream("info.txt");
//将流中的数据加载进集合。
prop.load(fis);//Properties的特有方法,可以将流中的数据读入到集合中
prop.setProperty("wangwu","39");//添加键值
//文件输出流是用于将数据写入File
的输出流。
FileOutputStream fos = newFileOutputStream("info.txt");
//将集合中内容储存到输出流中。
prop.store(fos,"haha");
// System.out.println(prop);
prop.list(System.out);
fos.close();
fis.close();
}
}
4.练习:
用于记录应用程序运行次数。如果使用次数已到,那么给出注册提示。
建立一个配置文件。用于记录该软件的使用次数。该配置文件使用键值对的形式。这样便于阅读数据,并操作数据。键值对数据是map集合。数据是以文件形式存储,使用io技术。那么map+io -->properties.配置文件可以实现应用程序数据的共享。
importjava.io.*;
importjava.util.*;
class RunCount
{
public static void main(String[] args)throws IOException
{ //创建Properties集合
Properties prop = newProperties();
//创建配置文件对象,并与文件名相关联。
File file = newFile("count.ini");
//测试此路径表示的文件或目录是否存在。若不存在则创建。
if(!file.exists())
file.createNewFile();
//把文件对象传给文件输入流
FileInputStream fis = newFileInputStream(file);
//把文件流中的数据储存到prop集合中
prop.load(fis);
int count = 0;//计数器
获取time key的键值
String value =prop.getProperty("time");
//假如time的键值存在则将键值传递给计数器
if(value!=null)
{
count =Integer.parseInt(value);
if(count>=5)
{//假如计数器的值大于5则显示使用次数到期。
System.out.println("您好,使用次数已到,拿钱!"); }
}
//1.首次运行时,计数器自加,并添加一个time = count的键值对。
count++;
prop.setProperty("time",count+"");
//创建输出流将文件对象传递给流。
FileOutputStream fos = newFileOutputStream(file);
//将被修改过的集合储存到fos中。
prop.store(fos,"");
fos.close();
fis.close();
}
}
5.打印流
打印流:该流提供了打印方法,可以将各种数据类型的数据都原样打印。
*字节打印流:
PrintStream
构造函数可以接收的参数类型:
1,file对象。File
2,字符串路径。String
3,字节输出流。OutputStream
*字符打印流:
PrintWriter
构造函数可以接收的参数类型:
1,file对象。File
2,字符串路径。String
3,字节输出流。OutputStream
4,字符输出流,Writer。
class PrintStreamDemo
{
public static void main(String[] args)throws IOException
{
BufferedReaderbufr =
new BufferedReader(newInputStreamReader(System.in));
PrintWriter out = newPrintWriter(new FileWriter("a.txt"),true);
String line = null;
while((line=bufr.readLine())!=null)
{
if("over".equals(line))
break;
out.println(line.toUpperCase());
//out.flush();
}
out.close();
bufr.close();
}
}