文件API
Q: File类可以用来做目录操作吗?
A:
可以。
File对象本身可以是目录。
调用file.mkdirs()即可创建目录。
Q:直接调用file.delete()可以删除目录吗?
A:
如果是文件或者空目录,可以直接删除。
但如果目录中有文件或者子目录,则必须递归删除。
private static boolean deleteDir(File dir) {
if (dir.isDirectory()) {
String[] children = dir.list();
//递归删除目录中的子目录下
for (int i=0; i<children.length; i++) {
boolean success = deleteDir(new File(dir, children[i]));
if (!success) {
return false;
}
}
}
// 目录此时为空,可以删除
return dir.delete();
}
Q: 有哪些方法判断给定路径下文件是否存在?
A:
File类的exists方法: ? file.exist(string)
File testFile = new File(testFilePath);
if(!testFile .exists()) {...}
File类的静态exist方法, File.exist(Path path)
Path filePath = Paths.get(testFilePath);
if (Files.exists(filePath) {...}
注意静态方法和非静态方法的区别
字节输入流InputStream
Q:说一下以下这些特点对应哪些InputStream类
A:
字节数组char[] 作为输入源的InputStream类是————ByteArrayInputStream
用文件作为输入源的InputStream类是?————FileInputStream
用字符串作为输入源的是?————StringBufferInputStream
用于多线程之间管道通信的输入源是————PipeInputStream
Q: FilterInputStream是什么?
A: 用于装饰上面这些输入流的,可以叠加,每装饰一层就相当于增加了1个功能。
InputStream inputStream = new FilterInputStream(InputStream)
以下这些特点分别对应哪些FilterInputStream?
- DataInputStream:装饰后,不仅可读字符串,还可读取例如int、long等java基本类型的是。DataInputStream里面会支持readInt、readLong等方法。
- BufferedInputStream:装饰后,支持分批缓冲读取读取的是。创建BufferedInputStream时,我们会通过它的构造函数指定某个输入流为参数。BufferedInputStream会将该输入流数据分批读取,每次读取一部分到缓冲中;操作完缓冲中的这部分数据之后,再从输入流中读取下一部分的数据。
其他:
- PushbackInputStream: 具有1个能回退上一个字节的缓冲区
- ObjectInputStream : 一般用于反序列化读入
- LineNumberInputStream: 可跟踪输入流中的行号
字节输出流OutputStream
Q: OutputStream包含哪些实现?
- ByteArrayOutputStream 输出到缓冲区
- FileOutputStream 写到文件
- PipedOutputStream 写入管道
- FilterOutputStream
而FilterOutputStream 包含
- DataOutputStream:可以out.writexxx各种类型的数据,writeDouble, writeUTF,reader也一样,可以读想要的数据类型
- PringtStream:输出到文件用这个, 该类.println(str)即可写入文件
- BufferOutputString
Q:new FileOutputStream(name, true),这个构造里的true参数是做什么用的?
A:
public FileOutputStream(String name, boolean append) throw FileNotFoundException {
this(name != null ? new File(name) : null, append);
}
是否支持在文件末追加的意思。
默认是false,指的是覆盖整个文本。
如果设置成true,会在要写入的文件后面追加本次写入的内容。
Q:BufferOutputStream相关概念(其实是考缓冲区是否需要刷新之类的问题)
- BufferOutputStream里的flush()方法是做什么的?
- BufferOutputStream调用close后,会触发flush()来刷新缓冲区吗?
- BufferOutputStream调用close可能会丢数据吗?
- BufferOutputStream多次调用close会报错吗?
flush把缓冲区里的数据写入文件,并刷新缓冲区
close关闭此输出流并释放与此相关联的任何系统资源, 会调用flush,除了flushBuffer,还会调用父类的flush。
不会丢数据,因为上面这条原因。
多次调用不会报错。
Reader和Writer
Q: Reader/Writer和InputStream/OutputStream的区别?
A:
- InputStream是表示 字节输入流 的所有类的超类。InputStream提供的是字节流的读取,而非文本读取,这是和Reader类的根本区别。使用InputStream读取出来的是byte数组
- Reader是用于读取 字符流 的抽象类,Reader读取出来的是char数组或者String
- Reader/Writer提供兼容Unicode、面向字符的IO功能,为了国际化
用reader读取标准输入:
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
用Writer进行标准输出:
BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));
如何设置设置编码:
InputStreamReader isr = new InputStreamReader(new FileInputStream(file), "UTF-8");
BufferedReader read = new BufferedReader(isr);
序列化问题
Q: java的序列化一般是做什么的?
A:
- 永久的保存对象数据(将对象数据保存在文件当中,或者是磁盘中
- 通过序列化操作将对象数据在网络上进行传输(由于网络传输是以字节流的方式对数据进行传输的.因此序列化的目的是将对象数据转换成字节流的形式)
- 将对象数据在进程之间进行传递(Activity之间传递对象数据时,需要在当前的Activity中对对象数据进行序列化操作.在另一个Activity中需要进行反序列化操作讲数据取出)
- Java平台允许我们在内存中创建可复用的Java对象,但一般情况下,只有当JVM处于运行时,这些对象才可能存在,即,这些对象的生命周期不会比JVM的生命周期更长(即每个对象都在JVM中)但在现实应用中,就可能要停止JVM运行,但有要保存某些指定的对象,并在将来重新读取被保存的对象。这是Java对象序列化就能够实现该功能。(可选择入数据库、或文件的形式保存)
- 序列化对象的时候只是针对变量进行序列化,不针对方法进行序列化.
- 在Intent之间,基本的数据类型直接进行相关传递即可,但是一旦数据类型比较复杂的时候,就需要进行序列化操作了
Q: 对某对象进行序列化时, 如何让里面某个敏感成员不被序列化?
A:
- 方法一:可使用transient关键字处理那个敏感成员
- 方法二:可以通过覆盖Serializable接口的writeObject和readObject来实现序列化,但是方法签名必须是private void writeObject(ObjetOutputStream stream) throw IOException;
- 方法三: 实现Externalizable接口,可自定义实现writeExternal以及readExternal方法
Q: Externalizable和Serializable哪个快? 原因是什么?
A: Externalizable更快。
原因:
- Java序列化写入不仅是完整的类名,也包含整个类的定义,包含所有被引用的类。
类定义可以是相当大的,也许构成了性能和效率的问题,当然这是编写一个单一的对象。如果您正在编写了大量相同的类的对象,这时类定义的开销通常不是一个大问题。另一件事情是,如果你的对象有一类的引用(如元数据对象),那么Java序列化将写入整个类的定义,不只是类的名称,因此,使用Java序列化写出元数据(meta-data)是非常昂贵的 - 通过实现Externalizable接口,这是可能优化Java序列化的。实现此接口,避免写出整个类定义,只是类名被写入
Q: Externalizable需要产生序列化ID吗?
A: 采用Externalizable无需产生序列化ID(serialVersionUID),而Serializable接口则需要
本博客文章除特别声明外,均可自由转载与引用,转载请标注原文出处:http://www.yelbee.top/index.php/archives/226/