b站 Java教程:https://www.bilibili.com/video/BV18J411W7cE?t=4&p=303
1 案例
- 数据源的数据不一定来自文件
- 数据目的地也不一定是文件
2 文件案例
- 复制单级文件夹
- 复制多级文件夹
-
import java.io.*; public class CopyFoldersDemo { public static void main(String[] args) throws IOException { //数据源 File srcFile = new File("E:\\itcast"); //目的地 File destFile = new File("F:\\"); copyFolder(srcFile,destFile); } //复制文件夹 public static void copyFolder(File srcFile, File destFile) throws IOException { if(srcFile.isDirectory()){ String srcFileName = srcFile.getName(); File newFolder = new File(destFile,srcFileName); if(!newFolder.exists()){ newFolder.mkdir(); } File[] fileArray = srcFile.listFiles(); for(File file : fileArray){ copyFolder(file, newFolder); } }else{ File newFile = new File(destFile,srcFile.getName()); copyFile(srcFile,newFile); } } public static void copyFile(File srcFile, File destFile) throws IOException { BufferedInputStream bis = new BufferedInputStream(new FileInputStream(srcFile)); BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream(destFile)); byte[] bys = new byte[1024]; int len; while((len = bis.read(bys)) != -1){ bos.write(bys,0,len); } bos.close(); bis.close(); } }
-
复制文件的异常处理
-
-
3 特殊操作流
- 标准输入流
- public static final InputStream in
- 通常该流对应于键盘输入或由主机环境或用户指定的另一个输入源
- 标准输出流
- public static final PrintStream out
- 通常该流对应于显示输出或由主机环境或用户指定的另一个输出目标
- 打印流
- 字节打印流 PrintStream
- 字符打印流 PrintWriter
- 打印流的特点:只负责输出数据,不负责读取数据;有自己的特有方法
- 字节打印流如果使用继承父类(字节输出流)的方法写数据,查看的时候会转码;使用自己的特有方法写数据,查看的数据原样输出
- 对象序列化流
- 一个对象想要被序列化,则该对象所属的类必须实现Serializable接口;Serializable只是一个标识接口,如果一个类实现了Serializable接口,则该类的对象是可以被序列化和反序列化的,没有方法需要重写
- 用对象序列化流序列化了一个对象后,如果我们修改了对象所属的类文件,读取数据会不会出问题?
- 会抛出异常:InvalidClassException:该异常类是当序列化运行时检测到类的以下问题之一时抛出:类的串行版本与从流中读取的类描述符的类型不匹配;该类包含未知的数据类型;该类没有可以访问的无参数构造函数。
- 序列化运行时与每个可序列化的类关联一个版本号,称为serialVersionUID,它在反序列化过程中使用,以验证序列化对象的发送者和接收者是否加载了与序列化兼容的对象的类。如果接收者已经为具有对应发件人类别不同的serialVersionUID的对象加载了一个类,则反序列化将导致一个InvalidClassException。
- 如果出问题应该如何解决?
- 一个可序列化的类可以通过声明一个名为“serialVersionUID”的字段来显式地声明它自己的serialVersionUID,该字段必须是static,final和long类型。
- private static final long serialVersionUID = ...
- 如果可序列化类没有显式声明serialVersionUID,则序列化运行时将根据Java(TM)对象序列化规范中所述的类的各个方面计算该类的默认serialVersionUID值。强烈建议所有可序列化的类显式声明serialVersionUID值,因为默认的serialVersionUID计算对类的细节非常敏感,且声明的serialVersionUID最好使用private来修饰。
- 如果一个对象中的某个成员变量的值不想被序列化,应该如何实现
- 将变量使用transient关键字修饰,被该关键字标记的变量不参与序列化。
4 Properties
- 继承自Hashtable<Object,Object>;
- Properties:是一个Map体系的集合类,可以保存到流中或从流中加载;
- Properties作为Map集合的使用
- 不能指定泛型
- 类型默认是Object类型