File

文件和目录路径名的抽象表示

  • 文件和目录可以通过File封装成对象
  • File(String pathname ):通过给定的路径名字符串转换为抽象路径名来创建新的File实例
  • File(String parent,String child):从父路径名字符串和子路径名字符串创建新的File实例
  • File(File parent,String child):从父抽象路径名和子路径名字符串创建新的File实例
File类创建功能
  • public boolean createNewFile():当具有该名称的文件不存在时,创建一个由该抽象路径名命名的新空文件
  • public boolean mkdir() :创建由该抽象路径名命名的目录
  • public boolean mkdirs() :创建由该抽象路径名命名的目录,包括任何必需但不存在的父目录
FIle类判断和获取功能
  • boolean isFile|isDirectory():测试是否为文件或目录
  • boolean exists():File是否存在
  • String getAbsolutePath():返回抽象路径名的绝对路径字符串
  • String getPath():将抽象路径名转换为路径名字符串
  • String getName():返回此抽象路径名表示的文件或目录的名称
  • String[] list():返回此抽象路径名表示的目录中的文件或目录的名称字符串数组
  • File[] listFiles():返回此抽象路径名表示的目录中的文件或目录的File对象数组
  • boolean delete():删除此抽象路径名表示的文件或路径

字节流

  • 流:抽象概念,对数据传输的总称,数据在设备之间传输称为流,流的本质时数据传输
  • IO流就是用来处理设备之间数据传输问题的:文件复制、文件上传、文件下载
FileOutputStream fos = new FileOutputStream("javatest.txt");
fos.write();

write()中只能以字节流Byte[]数组进行传输

追加数据:

  • public FileOutputStream(String name,boolean append)
  • 创建文件输出流以指定的名称写入文件,append为 true时,字节写入文件末尾而不是开头
异常处理

finally:在异常处理时提供finally块来执行所有清除操作,比如释放资源

特点:被finally控制的语句一定会执行,除非JVM退出

try{
 可能出现异常的代码;
}catch(异常类名 变量名){
 异常处理的代码;
}finally{
 执行所有清除操作;
}
FileInputStream fis = new FileInputStream("javatest.txt");
fos.read();

while((by = fis.read())!=-1){
 继续读取
}
--------------------
byte[] bys = new byte[1024];	//1024及其整数倍
int len;
while((len = fis.read(bys))!= -1 ){
 System.out.print(new String(bys, 0 ,len));
}
fis.close();

如果到达文件末尾,返回值为 -1

字节缓冲流

字节缓冲流:

  • BufferOutputStream:该类实现缓冲输出流。通过设置这样的输出流,应用程序可以向底层输出流写入字节,而不必为写入的每个字节导致底层的调用
  • BufferedInputStream:创建一个内部缓冲区数组,当从流中读取或跳过字节时,内部缓冲区将根据需要从所包含的输入流中重新填充,一次很多字节
编码&解码

编码:

  • byte[] getBytes():使用平台的默认字符集将该String编码为一系列字节,将结果存储到新的字节数组中
  • byte[] getBytes(String charsetName):使用指定的字符集将该String编码为一系列字节,将结果存储到新的字节数组中

解码:

  • String(byte[] bytes):通过使用平台默认字符集解码指定的字节数组来构造新的String
  • String(byte[] bytes, String charsetName):通过指定的字符集解码指定的字节数组来构造新的String

字符流

编码解码

InputStreamReader:字节流到字符流

  • 读取字节,并使用指定的编码将其解码为字符

OutputStreamWriter:字符流到字节流

  • 使用指定的编码将写入的字符编码为字节
flush
  • flush 仅仅刷新流的缓冲,与close 不同,close 直接关闭输入输出流

改进版字符流(常用)

  • FileReader:用于读取字符文件的便捷类
    • FileReader(String fileName)
  • FileWriter:用于写入字符文件
    • FileWriter(String fileName)
字符缓冲流

字符缓冲流:

  • BufferedWriter:将文本写入字符输出流,缓冲字符,以提供单个字符、数组和字符串的高效写入,可以指定缓冲区大小,或者可以接受默认大小
  • BufferedReader:从字符输入流读取文本,缓冲字符,以提供字符、数组和行的高效读取,可以指定缓冲区大小,或者可以使用默认大小。默认值足够大。

构造方法:

  • BufferedWriter(Writer out)
    • void newLine():写一行行分隔符,行分隔符字符串由系统属性定义
  • BufferedReader(Reader in)
    • public String readLine():读一行文字。结果包含行的内容的字符串,不包含任何行终止字符,如果流的结尾已经到达,则为null

异常处理(JDK7)

try(定义流对象){
 可能出现异常代码
}catch{
 异常处理代码
}

自动释放资源

特殊操作流

标准输入输出流

System类中有两个静态的成员变量

  • public static final InputStream in:标准输入流。通常该流对应键盘输入或由主机环境或用户指定的另一个输入源
  • public static final PrintStream out:标准输出流。通常该流对应显示输出或由主机环境或用户指定的另一个输出源

自己实现键盘录入数据:

  • BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
打印流
  • 字节打印流:PrintStream
  • 字符打印流:PrintWriter
对象序列化流

对象序列化:将对象保存到磁盘中,或者在网络中传输对象

这种机制就是使用一个字节序列表示一个对象,该字节序列包含:对象的类型、对象的数据和对象中存储的属性等信息

字节序列写到文件之后,相当于文件中持久保存了一个对象的信息

反之,该字节序列还可以从文件中读取回来,重构对象,对它进行反序列化

  • 对象序列化流:ObjectOutputStream
  • 对象反序列流:ObjectInputStream

对象序列化流:ObjectOutputStream

  • 将Java对象的原始数据类型和图形写入OutputStream。可以使用ObjectInputStream读取(重构)对象。可以通过使用流的文件来实现对象的持久存储。如果流是网络套接字流,则可以在另一个主机上或另一个进程中重构对象

构造方法:

  • ObjectOutputStream(OutputStream out):创建一个写入指定的OutputStream的ObjectOutputStream

序列化对象的方法:

  • void writeObject(Object obj):将指定的对象写入ObjectOutputStream

对象被序列化,所属类中实现Serializable 接口,不用重写方法

  • 对象反序列流:ObjectInputStream

对象反序列化流:ObjectOutputStream

  • 反序列化先前使用的ObjectOutputStream编写的原始数据和对象

构造方法:

  • ObjectInputStream(InputStream in):创建从指定的InputStream读取的ObjectInputStream

序列化对象的方法:

  • Object readObject(Object obj):从ObjectInputStream读取一个对象
问题

用对象序列化流序列化了一个对象后,假如修改了对象所属的类文件,数据读取会不会出问题?

  • 类的串行版本与从流中读取的类描述符的类型不匹配; 序列化ID不同

如何解决?

  • 可序列化类必须声明一个明确的serialVersionUID值。还强烈建议显式声明serialVersionUID使用 private修饰在可能的地方,因为这样的声明只适用于立即声明类– serialVersionUID字段不能作为继承的成员。数组类不能声明一个明确的serialVersionUID,所以他们总是有默认值,但匹配serialVersionUID值要求豁免数组类。

如果一个对象中的某个成员变量的值不想被序列化,如何实现?

  • transient 修饰
Properties
  • Map体系的集合类 (不用指定泛型)
  • 可以保存到流中或从流中加载
  • Object setProperties(String key,String value):设置集合的键和值,都是String类型,底层调用Hashtable方法put
  • String getProperties(String key):使用此属性列表中指定的键搜索属性
  • Set stringPropertyNames():从该属性列表中返回一个不可修改的键集,其中键及其对应的值是字符串
  • void load():从输入字节流/字符流读取属性列表(键和元素对)
  • void store():将此属性列表(键和元素对)写入此Properties表中,以适合使用load(Reader)方法的格式写入输出字节流/字符流