黑马程序员 File类、Properties类、IO包中的其他类

                 黑马程序员 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”);//解码

注:要是解码错误,就重新编码再解码。





评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值