File类似一个与流无关的类;该类用于获取文件及文件所在的目录,文件的长度扥信息。
构造方法:
通过将给定路径名字符串转换成抽象路径名来创建一个新 File 实例。
File(String pathName) //具体实现如下; new File(pathName);通过给定的父路径名和子路径名字符串创建一个新的File实例。
File(String path, String filename);通过指定的File的父类路径和字符串类型的子路径;
File(File file, String filename); //file:父路径对象; //filename:子路径字符串; package classx.Demo15; import java.io.File; //文件 public class FileDemo { public static void main(String[] args) { File file=new File("E:\\学习资料\\实习实训\\天津_软通培训\\后端\\java\\学习笔记","9.2.txt"); System.out.println(file.getName());//9.2.txt System.out.println(file.length());//1191 System.out.println(file.getPath());//E:\学习资料\实习实训\天津_软通培训\后端\java\学习笔记\9.2.txt System.out.println(file.getAbsolutePath());//E:\学习资料\实习实训\天津_软通培训\后端\java\学习笔记\9.2.txt System.out.println(file.lastModified()/1000/60/60/24/365);//lastModified()最后一次修改的时间(毫秒) 50 } }InputStream类和OutputStream类都是抽象类,不能直接实例化,所以使用他们的子类:FileInputStream和FileOutputStream来实现文件的读取和写入;
InputStream是一个抽象类,是所有输入字节流的父类。
`ByteArrayInputStream、 StringBufferInputStream、FileInputStream是三中基本的戒指了,他们分别从数组、StringBuffer、和本地文件中读取数据。**
PipedInputStream是从与其它线程共用的管道中读取数据,与Piped 相关的知识后续单独介绍。
返回值类型方法intavailable() 返回从该输入流中可以读取(或跳过)的字节数的估计值,而不会被下一次调用此输入流的方法阻塞。voidclose() 关闭此输入流并释放与流相关联的任何系统资源。voidmark(int readlimit) 标记此输入流中的当前位置。booleanmarkSupported() 测试这个输入流是否支持 mark和 reset方法。abstract intread() 从输入流读取数据的下一个字节。intread(byte[] b) 从输入流读取一些字节数,并将它们存储到缓冲区 b 。intread(byte[] b, int off, int len) 从输入流读取最多 len字节的数据到一个字节数组。voidreset() 将此流重新定位到上次在此输入流上调用 mark方法时的位置。longskip(long n) 跳过并丢弃来自此输入流的 n字节数据。OutputStream 是所有的输出字节流的父类,它是一个抽象类。
ByteArrayOutputStream、FileOutputStream 是两种基本的介质流,它们分别向Byte 数组、和本地文件中写入数据。
追加写:
FileOutputStream(File file, boolean append) 创建文件输出流以写入由指定的 File对象表示的文件。FileOutputStream(String name, boolean append) 创建文件输出流以指定的名称写入文件。参数:boolean append
true:创建对象不会覆盖源文件,继续在源文件末尾追加写数据;
false:创建一个新文件,覆盖源文件;
换行写:
windows:\r\n;linux :/n;mac:/r;FilterOutputStream 这个类是过滤输出流的所有类的超类;
PipedOutputStream 是向与其它线程共用的管道中写入数据。
ObjectOutputStream将Java对象的原始数据类型和图形写入OutputStream。 可以使用ObjectInputStream读取(重构)对象。 可以通过使用流的文件来实现对象的持久存储;
返回值类型方法voidclose() 关闭此输出流并释放与此流相关联的任何系统资源。voidflush() 刷新此输出流并强制任何缓冲的输出字节被写出。voidwrite(byte[] b) 将 b.length字节从指定的字节数组写入此输出流。voidwrite(byte[] b, int off, int len) 从指定的字节数组写入 len个字节,从偏移 off开始输出到此输出流。abstract voidwrite(int b) 将指定的字节写入此输出流。 注意:在使用write(byte[] b)或write(byte[] b, int off, int len)时:如果写的第一个字节是正数(0-127),那么显示会查询ASCII码表;如果写的第一个字节是负数,那么第一个字节会和第二个字节一起组成一个中文显示,查询系统默认表(GBK);字符流和字节流的使用范围:字节流一般用来处理图像,视频,以及PPT,Word类型的文件。字符流一般用于处理纯文本类型的文件,如TXT文件等,字节流可以用来处理纯文本文件,但是字符流不能用于处理图像视频等非文本类型的文件。
转换流的作用,文本文件在硬盘中以字节流的形式存储时,通过InputStreamReader读取后转化为字符流给程序处理,程序处理的字符流通过OutputStreamWriter转换为字节流保存。
转换流的特点:
其是字符流和字节流之间的桥梁可对读取到的字节数据经过指定编码转换成字符可对读取到的字符数据经过指定编码转换成字节何时使用转换流?
当字节和字符之间有转换动作时;流操作的数据需要编码或解码时。具体的对象体现:
InputStreamReader:字节到字符的桥梁OutputStreamWriter:字符到字节的桥梁这两个流对象是字符体系中的成员,它们有转换作用,本身又是字符流,所以在构造的时候需要传入字节流对象进来。
OutputStreamWriter(OutStreamout):将字节流以字符流输出。
InputStreamReader(InputStream in):将字节流以字符流输入。
常用的节点流:
1.文 件 :FileInputStream 、 FileOutputStrean 、FileReader 、FileWriter 文件进行处理的节点流
2**.数 组** :ByteArrayInputStream、 ByteArrayOutputStream、 CharArrayReader 、CharArrayWriter 对数组进行处理的节点流(对应的不再是文件,而是内存中的一个数组)
3.字符串 :StringReader、 StringWriter 对字符串进行处理的节点流
4**.管 道** :PipedInputStream 、PipedOutputStream 、PipedReader 、PipedWriter 对管道进行处理的节点流
1.缓冲流:BufferedInputStrean 、BufferedOutputStream、 BufferedReader、 BufferedWriter 增加缓冲功能,避免频繁读写硬盘。
2.转换流:InputStreamReader 、OutputStreamReader实现字节流和字符流之间的转换。
3.数据流: DataInputStream 、DataOutputStream 等-提供将基础数据类型写入到文件中,或者读取出来。
1.读写单位不同:字节流式以字节(8位2进制)为单位,字符流是以字符为单位,根据码表映射字符,一次可能读多个字节。
2.处理对象不同:字节流能处理所有类型的数据(如图片、avi等),而字符流只能处理字符类型的数据。
3.一次读入或读出是8位二进制。
4.字符流:一次读入或读出是16位二进制。
结论:只要是纯文本数据优先使用字符流,除此之外都使用字节流。
InputStreamReader 、OutputStreamWriter 要InputStream或OutputStream作为参数,实现从字节流到字符流的转换。
Java序列化就是指把Java对象转换为字节序列的过程;
Java反序列化就是指把字节序列恢复为Java对象的过程。
(1)序列化最重要的作用:在传递和保存对象时.保证对象的完整性和可传递性。对象转换为有序字节流,以便在网络上传输或者保存在本地文件中。
反序列化的最重要的作用:根据字节流中保存的对象状态及描述信息,通过反序列化重建对象。
总结:核心作用就是对象状态的保存和重建。(整个过程核心点就是字节流中所保存的对象状态及描述信息)
① 将对象实例相关的类元数据输出。
② 递归地输出类的超类描述直到不再有超类。
③ 类元数据输出完毕后,从最顶端的超类开始输出对象实例的实际数据值。
④ 从上至下递归输出实例的数据。
1、实现序列化的必备要求:
只有实现了Serializable或者Externalizable接口的类的对象才能被序列化为字节序列。(不是则会抛出异常)
2、JDK中序列化和反序列化的API:
①java.io.ObjectInputStream:对象输入流。
该类的readObject()方法从输入流中读取字节序列,然后将字节序列反序列化为一个对象并返回。
②java.io.ObjectOutputStream:对象输出流。
该类的writeObject(Object obj)方法将将传入的obj对象进行序列化,把得到的字节序列写入到目标输出流中进行输出。