黑马程序员_IO_file对象以及对象序列化
2015-08-18 15:56
513 查看
------- 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删除文件夹是不走回收站的,删完就没有了。
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改变指针的位置。
其实它能完成读写的原理就是内部封装了字节输
4000
入流和输出流。操作数据必然是流,其他能读和写的类只不过是内部封装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关闭。
----------
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 separator File 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改变指针的位置。
其实它能完成读写的原理就是内部封装了字节输
4000
入流和输出流。操作数据必然是流,其他能读和写的类只不过是内部封装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)); } }
相关文章推荐
- 黑马程序员_IO_字符流与字节流
- 怎样尊重一个程序员
- 黑马程序员_多线程
- 《招聘一个靠谱的iOS》面试题参考答案(上)
- Java经典面试题
- 优秀程序员的良好的学习方式
- 每个程序员1小时内必须解决的5个编程问题
- 架构师与程序员的区别
- 【.Net码农】 .NET中执行js脚本的方法
- 程序员开发学习利器篇(上)之百度搜索-你真的会用百度吗
- 黑马程序员——IO(概述、FileWriter、FileReader)
- 黑马程序员——IO流
- 【.Net码农】RDLC报表显示外部图片方法
- 黑马程序员——黑苹果的日记(4)——基础知识(2)
- 黑马程序员——其他对象
- 全面解读java虚拟机(面试考点大全)d
- 程序员的自我修养-读书笔记(1)
- 职场奇葩说:不得不了解的11个奇葩现象
- 剑指offer-第四章解决面试题思路(判断一个数组是否为二叉搜索树的后序遍历序列)
- 一个启发式程序员的思考