黑马程序员 File类 、 Properties类、IO包中的其他类
------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------
1.概述
(1)用来将文件或者文件夹封闭成对象。
(2)方便对文件与文件夹进行操作。
(3)File对象可以作为参数传递给流的构造函数。
(4)了解File类中的常用方法。
2.创建File对象
File f1=new File(“a.txt”);
File f2=new File(“c:\\abc”,”b.txt”);
跨平台的分隔符:File.separator
3.File类常见方法
(1)创建
Boolean createNewFile():在指定位置创建文件,如果该文件已经存在,则不创建,返回false。和输出流不一样,输出流对象一建立创建文件,而且文件已经存在,会覆盖。
boolean mkdir():创建文件夹。
boolean mkdirs():创建多级文件夹。
(2)删除
boolean delate():删除失败返回false,如果文件正在使用,则删除不了返回false。
void delateOnExit():在程序退出时删除指定文件。
(3)判断
boolean exists():文件是否存在。
isFile():判断是否为文件
isDirectory():判断是否为文件夹
isHidden():判断是否为隐藏文件
isAbsolute():判断是否为绝对路径名
(4)获取信息
getName():获取文件或目录名称
getPath():获取路径名称
getParent():获取指定父目录,如果没有,返回null
getAbsolutePath():获取绝对路径名称
long lastModified():获取最后一次修改的时间
long length():获取文件长度
4.文件列表
(1)//列出c盘中所有文件夹和文件(包括隐藏文件)
File f=new File(“c:\\”);
//调用list方法时,File对象必须封装的是目录,否则names数组为空。
String[] names=f.list();
for(String name:names)
{
System.out.println(name);
}
(2)过滤.bmp文件并且列出全部.bmp文件名称
File dir=new File(“c:\\”);
String[] arr=dir.list(new FilenameFilter()
{ public boolean accept(File dir,String name)
{
Return name.endsWith(“.bmp”)
}
});
for(String name:arr)
{
System.out.println(name);
}
(3)listFiles返回的是文件对象,所以可以操作该对象
File dir=new File(“c:\\”);
File[] files=dir.listFiles();
For(File f:files)
{
System.out.println(f.getName()+”...”+f.length());
}
(4)递归
void to Bin(int num)
{
If(num>0)
{
toBin(num/2);
Sop(num%2);
}
}
分析:
(5)利用递归方法列出指定目录下文件或者文件夹,包含子目录中的内容。
//列出目录下所有内容
import java.io.*;
class FileDemo
{
public static void main(String[] args)
{
File dir =new File("E:\\zz");//创建文件目录
showDir(dir);
}
public static void showDir(File dir)
{
System.out.println(dir);
File[] files=dir.listFiles();//将文件和文件夹封装成对象并存到数组
for(int x=0;x<files.length;x++)
{
if(files[x].isDirectory())//判断是否为文件夹
showDir(files[x]);//递归
else
System.out.println(files[x]);
}
}
}
(6)利用递归方法删除带内容的目录
//删除带内容的目录
import java.io.*;
class RemoveDir
{
public static void main(String[] args)
{
File dir=new File("e:\\zz");//创建目录
removeDir(dir);
}
public static void removeDir(File dir)
{
File[] files=dir.listFiles();//将文件和文件夹封装成对象并存到数组
for(int x=0;x<files.length;x++)
{
if(files[x].isDirectory())//判断是否为文件夹
removeDir(files[x]);//递归
else
//打印的是路径和删除文件是否为真
System.out.println(files[x].toString()+":files:"+files[x].delete());
}
System.out.println(dir+":dir:"+dir.delete());//删除文件夹
}
}
(7)利用递归方法创建java文件列表
/*将一个指定目录下的java文件的绝对路径,
存储到一个文本文件中,建立一个java文件列表文件
思路:
1.对指定的目录进行递归
2.获取递归过程所有的java文件路径
3.将这些路径存储到集合中
4.将集合中的数据写入到一个文件中*/
import java.io.*;
import java.util.*;
class JavaFileList
{
public static void main(String[] args)
{
File dir=new File("e:\\javaLX\\day02");//创建目录对象
List<File> list=new ArrayList<File>();//创建集合对象
fileToList(dir,list);
System.out.println(list.size());
File file=new File("e:\\javaLX\\javalist.txt");
writeToFile(list,file);
}
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(".java"))//获取后缀名为.java的文件
list.add(file);//将该文件存储到集合里
}
}
}
public static void writeToFile(List<File> list,File file)
{
BufferedWriter bufw=null;
try
{
bufw=new BufferedWriter(new FileWriter(file));
for(File f:list)
{
String path=f.getAbsolutePath();//获取绝对路径
bufw.write(path);//写出绝对路径
bufw.newLine();//换行
bufw.flush();
}
}
catch (IOException e)
{
throw new RuntimeException("打印路径失败");
}
finally
{
try
{
if(bufw!=null)
bufw.close();
}
catch (IOException e)
{
throw new RuntimeException("写入流关闭失败");
}
}
}
}
二.Properties类
1.概述
(1)Properties是hashtable的子类,也就是说它具备map集合的特点,而且它里面存储的键值对都是字符串。
(2)Properties是集合中和IO技术相结合的集合容器。
2.该对象的特点:可以用于键值对形式的配置文件。
3.常用方法
Properties prop=new Properties();
(1)创建键值对
prop.setProperty(“lisi”,”30”);
(2)获取键对应的值
String value=prop.getProperty(“lisi”)
(3)stringPropertyName()返回的是键集合。
Set<String> name=prop.stringPropertyName()
三.IO包中的其他类
1.打印流
(1)PrintWriter与PrintStream:可以直接操作输入流和文件。
(2)该流提供了打印方法,可以将各种数据类型的数据都原样打印
(3)字节打打印流:PrintStream
构造函数可以接收的参数类型:
(a).file对象:File;
(b).字符串路径:String;
(c).字节输出流:OutputStream
(4)字符打印流:PrintWriter
构造函数可以接收的参数类型:
(a).file对象:File;
(b).字符串路径:String;
(c).字节输出流:OutputStream
(d).字符输出流:Writer
//PrintWriter练习:键盘录入数据,输出数据的大写在控制台
import java.io.*;
class PrintStreamDemo
{
public static void main(String[] args) throws IOException
{
BufferedReader bufr=
new BufferedReader(new InputStreamReader(System.in));
//如果为true,则println方法将刷新输出缓冲区,所以不用out.flush()
PrintWriter out=new PrintWriter(System.out,true);
String line=null;
while((line.bufr.readLine())!=null)
{
if("over".equals(line))
break;
out.println(line.toUpperCase());//转成在写
}
out.close();
bufr.close();
}
}
2.序列流
SequenceInputStream:对多个流进行合并。
//合并流,对文件进行合并。
import java.io.*;
import java.util.*;
class SequenceDemo
{
public static void main(String[] args) throws IOException
{
Vector<FileInputStream> v=new Vector<FileInputStream>();//创建集合对象
//添加文本输入流
v.add(new FileInputStream("e:\\javaLX\\1.txt"));
v.add(new FileInputStream("e:\\javaLX\\2.txt"));
v.add(new FileInputStream("e:\\javaLX\\3.txt"));
Enumeration<FileInputStream> en=v.elements();
//将三个文本输入流合并
SequenceInputStream sis=new SequenceInputStream(en);
FileOutputStream fos=new FileOutputStream("e:\\javaLX\\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
{
public static void main(String[] args) throws IOException
{
spliFile();
}
public static void spliFile() throws IOException
{
FileInputStream fis=new FileInputStream("e:\\javaLX\\1.gif");
FileOutputStream fos=null;
byte[] buf=new byte[1024*1024];
int len=0;
int count=1;
while((len=fis.read(buf))!=-1)
{
//每循环一次都创建一个格式为part的文件
fos=new FileOutputStream("e:\\javaLX\\"+(count++)+".part");
fos.write(buf,0,len);
fos.close();
}
fis.close();
}
}
3.操作对象
ObjectInputStream与ObjectOutputStream:被操作的对象需要实现Serializable(标记接口)
4.RandomAccessFile
(1)随机访问文件,自身具备读写的方法。
(2)通过skipBytes(int x),seek(int x)来达到随机访问
5.管道流
PipedInputStreamt和PipedOutputStream:输入输出可以直接进行连接,通过结合线程使用。
6.RandomAccessFile
(1)该类不是算IO体系中子类,而是直接继承Object。但是它是IO包中成员,因为它是具备读和写功能。内部封装了一个数组,而且通过指针对数组的元素进行操作。可以通过getFilePointer获取指针位置。同时可以通过seek方法改变指针的位置。
(2)完成读写的原理:内部封装了字节输入流和输出流。通过构造函数可以看出,该类只能操作文件,操作文件还有模式:r(只读),
rw(读写)。而且该对象的构造函数要操作的文件不存在,会自动创建,如果存在则不会覆盖。
7.操作基本数据类型
DataInputStream与DataOutputStream
DataOutputStream dos=
new DataOutputStream(new FileOutputStream(“data.txt”));
dos.writeInt(234);
dos.writeBoolean(true);
dos.writeDouble(98.543);
DataInputStream dis=
new DataInputStream(new FileInputStream(“data.txt”));
int num=dis.readInt();
boolean b=dis.readBoolean();
double d=dis.readDouble();
8.操作字节数组
ByteArrayInputStream与ByteArrayOutputStream
ByteArrayInputStream:在构造的时候,需要接收数据源,而且数据源是一个字节数组。ByteArrayInputStream bis=
new ByteArrayInputStream(“ABCDE”.getBytes());
ByteArrayOutputStream:在构造的时候,不用定义数据目的,因为该对象中已经内部封装了可变长度的字节数组。
ByteArrayOutputStream bos=new ByteArrayOutputStream();
因为这两个流对象都操作的是数组,并没有使用系统资源,所以不用进行关闭流。
9.操作字符数组(操作跟字节数组相似)
CharArrayReader与CharArrayWrite
10.操作字符串
StringReader与StringWriter
11.字符编码
(1)字符流的出现为了文便操作字符
(2)更重要的是加入了编码转换
(3)通过子类转换流来完成:
InputStreamReader,OutputStreamWriter
(4)在两个对象进行构造的时候可以加入字符集(编码表)。
(5)默认编码表:GBK
(6)GBK:两个字节代表一个字。如:
GBK的编码不可以在UTF-8里找,因为UTF-8的编码表里一个字符至少三个字节。所以结果会是:??。
(7)UTF-8:三个字节代表一个字。如:
UTF-8的编码可以在GBK的编码里找,但结果不是“你好”,而是其他的三个字符。原因是:GBK会将UTF-8的字节拆成两个两个的字节在GBK编码表里面找。
(8)
编码:字符串变成字节数组。
解码:字节数组变成字符串。
String s=”你好”;
Byte[] b1=s.getBytes(“utf-8”);//编码
String s1=new String(b1,”utf-8”);//解码
注:要是解码错误,就重新编码再解码。