黑马程序员_IO_file对象以及对象序列化

来源:互联网 发布:大连 张丕林 知乎 编辑:程序博客网 时间:2024/06/06 11:09

              ------- android培训java培训、期待与您交流! ----------

File类
用来将文件或者将文件夹封装成对象,方便于对文件与文件夹的属性信息进行操作,弥补流对象对文件操作的不足。

1.创建File对象.
File f=new File("a.txt");
//将a.txt封装成file对象,可以将已有的或者未出现的文件或者是文件夹封装成为对象。

File f1=new File("c:\\abc","a.txt");//左边是父目录,等价于
File f2=new File("c:\\abc\\a.txt");但是方法2的好处是第二个参数可以是一个file对象引用,也就是想要操作的文件可以改变,在目录不改变的前提下。
File d=new File("c:\\abc");
File f3=new File(d,"a.txt");//先将"c:\\abc"封装成一个file对象,再作为参数传入,与上述代码等价。

如果打印这三个文件,将会分别打印字符串参数,不保证打印印绝对路径。
File类的static String separator 参数是一个静态成员,一般用于跨平台的分隔符的调用。因为是静态成员,可直接类名调用,无需创建实例。
 


File类常见的方法
1.创建
boolean createNewFile() //返回true创建成功,在指定位置创建文件,如果文件已经存在。则不创建,返回false.与输出流不同,输出流对象已建立就会创建文件,而且存在文件时会覆盖。


 

2.删除
boolean delete() ;//删除文件不存在返回false
void deleteOnExit();//告诉虚拟机退出时删除该文件。

 

3.判断
boolean canExecute() ;//文件是否可执行。
boolean exists()  ;//文件是否存在。
boolean mkdir() ;//创建一个文件夹需要用到此方法
boolean isHidden();//是否隐藏。
 
File dir=new File("abc")

dir.mkdir();//只能创建一级目录。
此文件夹会放在当前目录下。
dir.mkdirs();//可以创建多及目录。


boolean isFile();//是不是文件。 不存在返回false,注意在判断是否是文件或者是目录时,最好先判断一下该文件是否存在。
boolean isDirectory()//是不是目录。不存在返回false
记住: File f=new File("abc.txt");//如果当前目录不存在该文件,则不会创建该文件。

boolean isAbsolute() //是不是绝对的,只要是路径带盘符是绝对的,不存在也可以判断。是抽象的不管存不存在都返回false.

4.获取信息:

String getName() //返回的是封装时传入的参数的最后一个目录或者是文件名称。
String getPath() // 返回封装时的路径,可能是相对的路径,无论文件是否存在。
String getParent() // 该方法返回的是绝对路径中的文件父目录,如果获取的是相对路径,那么返回空,也是无论文件是否存在。如果相对路径中有上一层目录,那么该目录就是返回结果。
String getAbsolutePath() //返回文件的绝对路径。无论文件是否存在,都会加上当前指定目录路径。
File getAbsoluteFile()//也返回绝对路径,但是封装成为了一个对象。
long lastModified()// 判断文件最后一次修改的时间。
long length()//获取文件大小.文件夹返回0


特殊方法:
boolean renameTo(File dest)  //给文件改名字。
File f1=new File("c:\\abc.txt");//C盘中实际存在这个文件。
File f2=new File("D:\\abcde.txt")//D中不存在这个文件
f1.renameTo(f2);\\f1文件不仅会改名,还会移动到D盘。


static File[] listRoots()  //如何打印盘符呢?

//静态方法,能列出机器中的有效盘符。

String[] list()
 //用来打印指定目录下的  文件夹的名称和文件的名称。注意:影藏的文件的文件名也能打印出来。调用list的对象必须是一个目录而不是一个文件,并且必须存在。注意将一个存在的绝对路径封装为一个file对象就可以了。不需要创建。
String[] list(FilenameFilter filter)  //list根据filter中的accept方法的返回值来选择过滤文件,
 File[] listFiles()  返回当前文件夹的文件,以及文件夹对象。
在windows中,删除目录是从里往外删除。
java删除文件夹是不走回收站的,删完就没有了。

public class IOdemo19 {public static void main(String[] args) {File f=new File("bac.txt");//记住,如果文件存在,则该File对象不用创建。//可以将已有的和未出现的文件或者文件夹封装成为对象。File f1=new File("c\\abc","bac.txt");//第一个参数为父目录,第二个参数为文件名字System.out.println(f1);//打印的是封装时的路径。f1的封装路径包含c\\abc//目录分隔符可以用一个跨平台的成员变量得到static String separatorFile f4=new File("c:"+File.separator+"abc");//File f5=new File( "abc\\bc\\aa\\dd\\gg");//f5.mkdirs(); mkdir()只能创建一级目录。File f6=new File("c:\\");//可以将存在的绝对路径封装成一个File对象,System.out.println(f6.isDirectory());f6.list(new FilenameFilter(){public boolean accept(File dir,String name){return name.endsWith(".java");}//这个接口的方法的意思就是以该FilenameFilter对象作为参数的list方法的调用//对象的中的每一个文件或者目录。});//该接口的实现使用的是匿名内部类的形式,匿名内部类中复写方法也是一样的写法,该//方法返回的还是一个字符串数组。}}


 

ObjectInputStream类与ObjectOutputStream类
可以直接操作对象的流。对象存在于堆中,程序运行完之后对象被回收,我们可以将堆内存中的对象存入硬盘上。也就是所谓的对象的序列化。一个类实现序列化就是声明一个标记Serializable,这是一个标记接口,此接口没有方法,只要在需要序列化的类上面声明此关键字就行了。序列化后的类有一个序列号用于标示类,这个值是根据对象中的属性来计算的,对象被存入配置文件中是一堆看不懂的乱码。

void writeObject(Object obj) ;//写入一个对象。输入流ObjectOutputStream中的写入对象的方法。


 Object readObject() //读取一个对象,输出流ObjectInputStream中的一个方法 ,此对象返回时的类型编译时期不确定,所以编译时需要强制转换一下类型。注意:如果对象对应的类被改变或者不存在,则取出该类对象会产生异常。但是可以自己自定义类的Uid.
public static final long serialVersionUId=42L;//自定义的序列号。这样即使改变该类的属性值,该类的序列号也不会改变。静态的属性是不能够被序列化的,静态属性在方法区。加上关键字transient的属性,也不能被序列化。一般序列化的

PipedInputStream与PipeOutputStream(管道流)。

 

RandomAccessFile类
该类不算是IO体系中的子类,直接继承自Object,但是它是IO包中的成员,因为它具备读和写的功能,内部封装了一个数组,而且通过指针对数组中的元素进行操作,可以通过getFilePointer获取指针的位置,同时可以通过Seek改变指针的位置。
其实它能完成读写的原理就是内部封装了字节输入流和输出流。操作数据必然是流,其他能读和写的类只不过是内部封装IO流而具备读写功能,通过构造函数可以看出该类只能操作文件,而且操作文件还有模式,mode代表模式,有只读模式,读取模式等等,对应字符串。:
RandomAccessFile(File file, String mode)这个mode只能是几个字符串中的一个(参见API)。
writeInt(int a)会将int类型按4个字节写出去,如果直接用write写一个int数据,则只会写一个8位。
int readInt();一次读4个字节 自动转换成int类型。

seek();//用于把取数据的位置调整,因为里面是用数组存储的数据,所以()中传入的数据是希望从哪一位开始取的角标。
int skipBytes(int n )//跳过指定的字节数,不可以往回跳,seek则可以随便指定位置。
最牛的可以直接将写入的东西根据随便指定的位置进行写入,且不会覆盖文件,直接在文件上修改,写的地方如果有数据会改变原来数据。
如果模式为可读可写,那么该对象的构造函数要操作的文件不存在就会创建一个,存在也不会覆盖该文件。直接在该文件上操作。
如果模式为只读,不会创建文件,会去读取一个已存在的文件,如果该文件不存在,则会出现异常。
该类是多线程下载实现的原理类。

DateInputStream类 以及DateOutputStream类
用于操作基本数据类型数据的流对象。构造方法会传入一个流对象。。
 void writeUTF(String str)如果是用这个方法存入的STR,只能用
DteOutputStream中对应的readUTF方法读取。
凡事操作基本数据类型就应该选择DateInputStream类以及DateOutputStream类
ByteArrayInputStream 类 在构造时候,需要接收数据源,而且数据源是一个字节数组。
 
ByteArrayOutputStream类 在构造的时候,不用定义数据目的。因为该对象中已经内部封装了可变长度的字节数组,这就是数据的目的。

因为这两个流对象都操作的数组,并没有使用系统资源,所以,不可进行close关闭。

class Person implements Serializable{private String name;//对象的序列号是根据成员来生成的,public transient int age;//该成员不会被序列化public static final long serialVersionUID = 42L;//该参数设置为固定的值,这样改变其他的属性比如age或者name的访问权限//该类的序列号不变。//静态不能被序列化。//不想被序列化的数据可以用transient修饰Person(String name,int age){this.name=name;this.age=age;}}public class IOdemo24 {public static void main(String[] args) throws  Exception {ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("abc.txt"));oos.writeObject(new Person("zangshan",45));}}



 

 

0 0
原创粉丝点击