天天看点

黑马程序员-----IO(二)一、File类二、其他流介绍

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

一、File类

1、File类概述

该类对文件系统的中的文件以及文件夹进行对象的封装,方便对文件文件夹的属性信息如文件名、创建修改时间、大小、可读可写属性等进行操作,File对象可以作为参数传递给流的构造函数

File f1 = new file(“c:\\aaa\\a.txt”); 

File f2 = new File(“c:\\aaa”,”b.txt”); 

File d = new File(“c:\\abc”); 

File f3 = new File(d,”c.txt”);

名称分隔符 

C:\\aaa\\eds.txt 同 “C:”+ File.separator+”abc”++ File.separator+“aaa.txt” 

2、File类常见方法:

1)创建

boolean createNewFile();在指定位置创建文件,如果该文件已经存在则不创建返回false,和输出流不一样,输出流对象一建立

boolean mkdir()创建文件夹

boolean mkdirs()创建多级文件夹

2)删除

boolean delete();删除失败返回false

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

3)判断

boolean canExcause();是否可以执行

canRead();

canWrite();

boolean exist();

Boolean isFile();是否是文件,不存在为false,判断是文件或文件夹时必须判断是否存在exist();

Boolean isDirectory()是否是目录

Boolean isHidden() 是否是隐藏文件

Boolean isAbsolute();是否是绝对路径

4)获取信息

getName();

getPatn();获取相对路径

getParent();获取父目录,该方法返回new File()里的文件上一级目录

getAbsolutePath();获取绝对路径返回值可以是String 或File类 

lastModified();最后修改时间

long Length();

5)移动 renameTo()例把“C:\\a.txt”) 移动到“D:\\a.txt”

File a = new File(“C:\\a.txt”);

File b = new File(“D:\\a.txt”);

a.renameTo(b);      

例:递归方法列出目录下所有内容:

Public static void main(String[] args)
{
   File dir = new File(“D:\\JAVA基础视频”);
   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(file[x].isDirectory())
     showDir(files[x]);
   else
     System.out.println(files[x]);
   }
}
           

删除带内容的目录:

原理:windows删除从里到外删除

Public static void removeDir(File dir)
{
   File[] files = dir.listFiles();
   For(int x=0;x<files.length;x++)
   {
      if(files[x].isHidden()&&files[x].isDirectory())
          removeDir(files[x]);
    }
}
           

二、其他流介绍

1、序列流

构造函数

SequenceInputStream(InputStream s1, InputStream s2)

SequenceOutputStream(OutputStream s1, OutputStream s2)

例:合并多个流:

public static void hebingSequenceInputStream() throws Exception {
		InputStream in1 = new FileInputStream("c:/a.txt");
		InputStream in2 = new FileInputStream("c:/b.txt");
		InputStream in3 = new FileInputStream("c:/c.txt");

		LinkedHashSet<InputStream> set = new LinkedHashSet<InputStream>();
		set.add(in1);
		set.add(in2);
		set.add(in3);
		final Iterator<InputStream> iter = set.iterator();

		SequenceInputStream sin = new SequenceInputStream(
				new Enumeration<InputStream>() {
					@Override
					public boolean hasMoreElements() {
						return iter.hasNext();
					}

					@Override
					public InputStream nextElement() {
						return iter.next();
					}
				});

		FileOutputStream out = new FileOutputStream("c:/z.txt");

		for (int b = -1; (b = sin.read()) != -1;) {
			out.write(b);
		}
        sin.close();
		out.close();
	}
           

例:切割文件

FileInputStream fis = new FileInputStream(“C:\\123.bmp”);
FileOutputStream fos = null;
Byte[] buf = new byte[1024*1024];
Int len = 0;
Int count =1;
While(len = fis.read(buf)!=-1)
{
    Fos = new FileOutputStream((count++) +“.txt”);
    Fos.write(buf,0,len);
    Fos.close();
}
Fis.close();
           

2、对象的序列化

对象的序列化:将内存中的对象直接写入到文件设备中 ;对象的反序列化: 将文件设备中持久化的数据转换为内存对象。

ObjectInputStream ObjectOutputStream

ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream(“abc.txt”))

oos.writeObject(new Person(“lisi”,39));

oos.close();

ObjectInputStream ois = new ObjectInputStream (new FileInputStream(“abc.txt”))

Person p = (Person)ois.readObject();

System.out.println(p);

ois.close();

注:需要被序列化的类必须是实现Serializable接口,该接口中没有描述任何的属性和方法,称之为标记接口。如果对象没有实现接口Serializable,在进行序列化时会抛出:NotSerializableException 异常。

3、Properties

Properties 是hashtable的子类,可用于键值对形式的配置文件也就是说它具备map集合的特点.Properties:该集合不需要泛型,因为该集合中的键值对都是String类型。

Map

|--Hashtable

|--Properties

Properties常用方法:

1)存入键值对:setProperty(key,value);

Properties prop = new Properties();

prop.setProperty(“zhangsan”,”30”);

2)获取指定键对应的值value getProperty(key); 

String value = prop.getProperty(“lisi”);

3)获取集合中所有键元素:Enumeration  propertyNames();

在jdk1.6版本给该类提供一个新的方法。

Set<String> names = prop.stringPropertyNames();

For(String s:names)

{

String s = prop.getProperty(s);

]

4)列出该集合中的所有键值对,可以通过参数打印流指定列出到的目的地。

list(PrintStream);

list(PrintWriter);

5)可以将流中的规则数据加载进行集合,并称为键值对。

load(InputStream):

jdk1.6版本。提供了新的方法load(Reader):

6,可以将集合中的数据进行指定目的的存储。

store(OutputStram,String comment)方法。

jdk1.6版本。提供了新的方法 store(Writer ,String comment);使用该方法存储时,会带着当时存储的时间。

4、打印流

1,字节打印流PrintStream,System.out对应的类型就是PrintStream。

它的构造函数可以接收三种数据类型的值。

1)字符串路径。

2)File对象。

3)OutputStream。

打印流的三种方法

void print(数据类型 变量)  

println(数据类型 变量) 提供换行,自动刷新

printf(String format, Object... args) 可以自定数据格式

JDK1.5之后Java对PrintStream进行了扩展,增加了格式化输出方式,可以使用printf()重载方法直接格式化输出。但是在格式化输出的时候需要指定输出的数据类型格式。

2、PrintWriter是一个字符打印流。

构造函数可以接收四种类型的值。对于1,2类型的数据,还可以指定编码表。也就是字符集。对于3,4类型的数据,可以指定自动刷新。

1,字符串路径。

2,File对象。

3,OutputStream

4,Writer

注意:该自动刷新值为true时,只有三个方法可以用:println,printf,format.

PrintWrter pw = newPrintWriter(new  BufferdWriter(new OutputSteamWriter(newFileOutputStream("a.txt"),"utf-8")),true);

5、 操作数组的流对象

1)字节数组  ByteArrayInputStream以及ByteArrayOutputStream

toByteArray();

toString();

writeTo(OutputStream);

2)字符数组  CharArrayReader以及CharArrayWriter

对于这些流,源是内存。目的也是内存。而且这些流并未调用系统资源。使用的就是内存中的数组。所以这些在使用的时候不需要close。

注:操作数组的读取流在构造时,必须要明确一个数据源。所以要传入相对应的数组。

对于操作数组的写入流,在构造函数可以使用空参数。因为它内置了一个可变长度数组作为缓冲区。 

6、操作基本数据类型的流对象

DataInputStream 从数据流读取字节,并将它们转换为正确的基本数据类型值或字符串。

DataOutputStream 将基本类型的值或字符串转换为字节,并且将字节输出到数据流。

1)DataInputStream类继承FilterInputStream类,并实现了DataInput接口。

DataInputStream

操作基本数据类型的方法:

int readInt():一次读取四个字节,并将其转成int值。

boolean readBoolean():一次读取一个字节。

short readShort();

long readLong();

String readUTF():按照utf-8修改版读取字符。注意,它只能读writeUTF()写入的字符数据。

2)DataOutputStream(OutputStream):

操作基本数据类型的方法:

writeInt(int):一次写入四个字节。write(int)只将该整数的最低一个8位写入。剩余三个8位丢弃。

writeBoolean(boolean);

writeShort(short);

writeLong(long);

writeUTF(String):按照utf-8修改版将字符数据进行存储。只能通过readUTF读取。

继续阅读