Java基础知识_IO流(二)

时间:2022-05-01 20:01:18

一.  File类

 

public class File

extends Object

implements Serializable, Comparable<File>

 

文件和目录路径名的抽象表示形式。

构造函数:

import java.io.*;

class FileDemo
{
publicstatic void main(String[] args)
{
consMethod();
}

publicstatic void consMethod()
{
/*File的几种构造方法*/


//File(Stringpathname)
// 通过将给定路径名字符串转换为抽象路径名来创建一个新 File 实例。
File f1= new File("a.txt");

//File(Stringparent, String child)
// 根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。
File f2= new File("d:\\abd","b.txt");

//File(Fileparent, String child)
// 根据 parent 抽象路径名和 child 路径名字符串创建一个新 File 实例。
File d =new File("d:\\abc");
File f3= new File(d,"c.txt");

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

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


 

File类常见方法:

1,创建。

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

                            和输出流不一样,输出流对象一建立创建文件。而且文件已经存在,会覆盖。

 

     booleanmkdir():创建文件夹。

     booleanmkdirs():创建多级文件夹。

2,删除。

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

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

 

 

3,判断。

     booleanexists() :文件是否存在.

     isFile():

     isDirectory();

     isHidden();

     isAbsolute();

 

4,获取信息。

     getName():

     getPath():

     getParent():

 

     getAbsolutePath()

     longlastModified()

     longlength()

 

    文件的创建与删除

 publicstatic void method_1()throws IOException
{
//文件创建与删除
File f =new File("file.txt");
sop("create:"+f.createNewFile());
sop("delete:"+f.delete());
}

publicstatic 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_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());
}


   返回路径

  publicstatic void method_4()
{
File f =new File("file.txt");

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

 重命名,也可用于快速剪切

    

 publicstatic void method_5()
{
//重命名,也可用于快速剪切文件
File f1= new File("c:\\Test.java");
File f2= new File("d:\\hahah.java");

sop("rename:"+f2.renameTo(f1));

}

 

实例:文件的提取和过滤

 

import java.io.*;
class FileListDemo
{
publicstatic void main(String[] args)
{
File dir= new File("d:\\java\\exercise");
Filedir2 = new File("d:\\java\\exercise\\0603");
show(dir);
listFilter(dir2);

}

//获取指定目录下的所有文件
publicstatic void show(File dir)
{
System.out.println(dir);

File[]files = dir.listFiles();

for(File f : files )
{
if(f.isDirectory()) //如果是目录,则通过递归得到该目录下的所有文件
{
listFilter(f);
show(f);
}
else
System.out.println(f.getName());
}
}

//获取当前目录下所有java文件,通过匿名内部类
publicstatic void listFilter(File dir)
{
File[]files = dir.listFiles(new FilenameFilter()
{
publicboolean accept(File dir,String name)
{
returnname.endsWith(".java");
}
});

}
}


 

递归删除文件:

import java.io.*;

class RemoveDemo
{
publicstatic void main(String[] args)
{
File dir= new File("d:\\abd");
removeDir(dir);
}

publicstatic void removeDir(File dir)
{
File[]files = dir.listFiles();

for(File f : files )
{
if(f.isDirectory())//如果是文件夹,则递归调用自身函数
{
removeDir(f);
}
else
System.out.println(f.toString()+"...delete..."+f.delete());//如果是文件,则删除文件
}

System.out.println(dir+"...delete..."+dir.delete());
}
}


 

练习

将一个指定目录下的java文件的绝对路径,存储到一个文本文件中。

建立一个java文件列表文件。

 

思路:

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

2,获取递归过程所以的java文件的路径。

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

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

 

import java.io.*;
import java.util.*;
class JavaFileList
{
publicstatic void main(String[] args) throws IOException
{

File dir= new File("d:\\java1223");

List<File>list = new ArrayList<File>();

fileToList(dir,list);

//System.out.println(list.size());


Filefile = new File(dir,"javalist.txt");
writeToFile(list,file.toString());




}
publicstatic void fileToList(File dir,List<File> list)//先遍历文件夹,将.java文件的文件名存入list集合中
{
File[]files = dir.listFiles();

for(Filefile : files)
{
if(file.isDirectory())
fileToList(file,list);
else
{
if(file.getName().endsWith(".java"))
list.add(file);
}
}
}

publicstatic void writeToFile(List<File> list,String javaListFile)throwsIOException//将集合中的文件名写入文件
{
BufferedWriterbufw = null;
try
{
bufw= new BufferedWriter(new FileWriter(javaListFile));

for(Filef : list)
{
Stringpath = f.getAbsolutePath();
bufw.write(path);
bufw.newLine();
bufw.flush();
}

}
catch (IOExceptione)
{
throwe;
}
finally
{
try
{
if(bufw!=null)
bufw.close();
}
catch(IOException e)
{
throwe;
}
}
}
}

二.Properties

public class Properties
extends Hashtable<Object,Object>

 

Properties 类表示了一个持久的属性集。Properties 可保存在流中或从流中加载。属性列表中每个键及其对应值都是一个字符串。

 设置和获取元素

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

class PropertiesDemo
{
publicstatic void main(String[] args)
{
setAndGet();
}
//设置和获取元素
publicstatic void setAndGet()
{
Propertiesprop = new Properties();

prop.setProperty("zhangsan","25");//存放键值对,都是字符串
prop.setProperty("lisi","45");

System.out.println(prop);

Stringvalue = prop.getProperty("zhangsan");//通过键取值

System.out.println(value);

Set<String>names = prop.stringPropertyNames();//获取键集,jdk1.6新特性

for(String str:names )//遍历输出
{
System.out.println(prop.getProperty(str));
}


}
}


练习

记录应用程序运行次数。

如果使用次数已到,那么给出注册提示。

 

很容易想到的是:计数器。

可是该计数器定义在程序中,随着程序的运行而在内存中存在,并进行自增。

可是随着该应用程序的退出,该计数器也在内存中消失了。

 

下一次在启动该程序,又重新开始从0计数。

这样不是我们想要的。

 

程序即使结束,该计数器的值也存在。

下次程序启动在会先加载该计数器的值并加1后在重新存储起来。

 

所以要建立一个配置文件。用于记录该软件的使用次数。

 

该配置文件使用键值对的形式。

这样便于阅读数据,并操作数据。

 

键值对数据是map集合。

数据是以文件形式存储,使用io技术。

那么map+io-->properties.

 

配置文件可以实现应用程序数据的共享。

 

import java.io.*;
import java.util.*;
class RunCount
{
publicstatic void main(String[] args) throws IOException
{
Propertiesprop = new Properties();

Filefile = new File("count.ini");
if(!file.exists())
file.createNewFile();

FileInputStreamfis = new FileInputStream(file);

prop.load(fis);


intcount = 0;
Stringvalue = prop.getProperty("time");

if(value!=null)
{
count= Integer.parseInt(value);
if(count>=5)
{
System.out.println("您好,使用次数已到,拿钱!");
return;
}

}

count++;

prop.setProperty("time",count+"");

FileOutputStreamfos = new FileOutputStream(file);

prop.store(fos,"");

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

}
}

IO中的其他类:

字节打印流:PrintStream

字符打印流:PrintWriter

 

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

字节打印流:
PrintStream
构造函数可以接收的参数类型:
1,file对象。File
2,字符串路径。String
3,字节输出流。OutputStream

字符打印流:
PrintWriter
构造函数可以接收的参数类型:
1,file对象。File
2,字符串路径。String
3,字节输出流。OutputStream
4,字符输出流,Writer

*/

import java.io.*;

class PrintStreamDemo
{
publicstatic void main(String[] args) throws IOException
{
BufferedReaderbufr =
newBufferedReader(new InputStreamReader(System.in));

PrintWriterout = new PrintWriter(new FileWriter("a.txt"),true);

Stringline = null;

while((line=bufr.readLine())!=null)
{
if("over".equals(line))
break;
out.println(line.toUpperCase());
//out.flush();
}

out.close();
bufr.close();

}
}


 

序列流(合并流)SequenceInputStream

public class SequenceInputStream
extends InputStream

 

SequenceInputStream 表示其他输入流的逻辑串联。它从输入流的有序集合开始,并从第一个输入流开始读取,直到到达文件末尾,接着从第二个输入流读取,依次类推,直到到达包含的最后一个输入流的文件末尾为止。

 

将三个文本文件的内容合并到一个文件中

import java.io.*;
import java.util.*;
class SequenceDemo
{
publicstatic void main(String[] args) throws IOException
{

Vector<FileInputStream>v = new Vector<FileInputStream>();//使用Vector的elements方法可以返回枚举类


v.add(newFileInputStream("c:\\1.txt"));
v.add(newFileInputStream("c:\\2.txt"));
v.add(newFileInputStream("c:\\3.txt"));

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

SequenceInputStreamsis = new SequenceInputStream(en);

FileOutputStreamfos = new FileOutputStream("c:\\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();

}
}

切割文件

 

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

class SplitFile
{
publicstatic void main(String[] args) throws IOException
{
//splitFile();
merge();
}


publicstatic void merge()throws IOException
{
ArrayList<FileInputStream>al = new ArrayList<FileInputStream>();

for(intx=1; x<=3; x++)
{
al.add(newFileInputStream("c:\\splitfiles\\"+x+".part"));//创建三个文件碎片
}

finalIterator<FileInputStream> it = al.iterator();

Enumeration<FileInputStream>en = new Enumeration<FileInputStream>()//枚举类型的使用
{
publicboolean hasMoreElements()
{
returnit.hasNext();
}
publicFileInputStream nextElement()
{
returnit.next();
}
};

SequenceInputStreamsis = new SequenceInputStream(en);//添加到合并流


FileOutputStreamfos = new FileOutputStream("c:\\splitfiles\\0.bmp");

byte[]buf = new byte[1024];

int len= 0;

while((len=sis.read(buf))!=-1)
{
fos.write(buf,0,len);
}

fos.close();
sis.close();
}

publicstatic void splitFile()throws IOException
{
FileInputStreamfis = newFileInputStream("c:\\1.bmp");

FileOutputStreamfos = null;


byte[]buf = new byte[1024*1024];

int len= 0;
intcount = 1;
while((len=fis.read(buf))!=-1)
{
fos= newFileOutputStream("c:\\splitfiles\\"+(count++)+".part");
fos.write(buf,0,len);
fos.close();
}

fis.close();

}
}