20170831 - A - Java IO操作
1 当需要将对象转化为字节用什么?
对象流
Person p = new Person("苍老师",18,"男" ,list);
System.out.println(p);
FileOutputStream fos = new FileOutputStream("person.obj");
ObjectOutputStream oos = new ObjectOutputStream(fos);
oos.writeObject(p);
oos.close();
2 使用对象流字节化对象时需要注意什么?
被字节的对象必须实现serialzable
3 如何将字节化的对象转换为文件数据?
使用对象输入流加载连接字节化对象的文件流,用于将一组字节(通过对象输出流写出对象而转换的一组字节)读取并转换为相应的对象
//unicode存的话就是两个字节。
FileInputStream fis = new FileInputStream("person.obj");
ObjectInputStream ois = new ObjectInputStream(fis);
Person p = (Person)ois.readObject();
System.out.println(p);
ois.close();
4 什么是对象序列化,对象反序列化?
对象输出流将对象写出时转换为一组字节的过程称为:对象序列化
对象输入流将这组字节读取并还原成对象的过程称为:对象反序列化
5 对象反序列化返回的是二进制的数据还是对象?
直接是Object型的对象,因为OIS已经将读取的二进制数据进行了转换。
5 一旦实现了serializable接口,就需要?
维护serial..UID,提高类的兼容性。
类在反序列化时会先检查两者的UID是否一致,因此若不维护,靠系统自动生成,而一旦再修改类,UID便会自行变化,因此需要在实现接口时便维护。
6 如何选择性写出对象属性?何时需要使用?
使用transient关键字,一旦使用该关键字,该属性的值为null。当需要对对象进行瘦身的时候。
(private transient String gender;)
7 按单位分流,字节流,字符流。
8 java内字符皆是char型数据?
9 用什么读取字符?
/**
* java根据流读写数据的单位划分为:字节流,字符流
* 字节流以字节为单位读写数据。
* 字符流以字符(unicode)为单位读写数据,但是底层本质上还是读写字节,只是字节与字符的转换工作由字符流完成
*
* Write与Reader是所有字符流的父类,他们是一对抽象类,
* 规定了所有字符流都要具备的读写字符方法。
*
* 转换流
* OutputStreamWriter与InputStreamReader是字符流的一对常见实现类
* @author admin
*
*/
10 可以用字符流复制mp3文件吗?
不行,字符流只能操作字符。
11 用什么流可以直接写入字符串?
OutputStreamWriter
FileOutputStream fos = new FileOutputStream("osw.txt");
OutputStreamWriter osw = new OutputStreamWriter(fos);
osw.write("在光滑的路上,摩擦");
osw.write(",摩擦,摩擦。");
osw.close();
12 如何制定字符输入流的字符编码模式?
OutputStreamWriter osw = new OutputStreamWriter(fos,"UTF-8");
13 如何输出获取的字符串?
FileInputStream fis = new FileInputStream("osw.txt");
InputStreamReader isr = new InputStreamReader(fis,"gbk");
int d = -1;
while((d = isr.read()) != -1){
System.out.println((char)d);
}
char[] data = new char[100];
int len = isr.read(data);
String str = String.valueOf(data, 0, len);
System.out.println(str);
isr.close();
使用isr的read()或read(char[])方法
同样可以指定
InputStreamReader isr = new InputStreamReader(fis,"gbk");
read返回int型数组的低八位(即对应unicode值)
read(char[])会存入数组指定数量的字符。因此一个需要转换,一个不需要。
字符流只接在字节流上。
14 如何按行写入字符串?
PrintWriter pw = new PrintWriter("pw.txt");
15 PrintWriter是否可以指定写出字符编码模式?
不可以,所以当必须指定时,连接到转换流上,所以必须新建字节流(只省了一步BW)
FileOutputStream fos = new FileOutputStream("pw2.txt");
OutputStreamWriter osw = new OutputStreamWriter(fos, "utf-8");
16 参数中的csn是什么意思?
charset name
17 缓冲字符流有哪些?
* 缓冲字符流内置缓冲区,可以提高读写字符效率,
* 并且缓冲字符流的特点是可以按行读写字符串
* java.io.BufferedWrite
* java.io.BufferedReader
*
* java.io.PrintWrite是常用的缓冲字符输出流,
* 并且还提供了自动行刷新功能。由于创建PrintWrite时
* 期内嵌了BufferedWriter,所以实际的缓冲操作是BufferedWriter实现。
17 PW的工作原理是?
/*
* PW支持对文件的操作的构造方法
*
* PW内部原理:
* PW嵌套了BW——加快读写,且PW可以换行,可自动行刷新
* PW内的BW再嵌套了OSW——字符转换成字节
* PW内的BW的OSW嵌套了F0S——写入字节
*/
PW内嵌了BW加快读写,BW连接了字符转换流OSW,OSW再连接了字节流获取字节数据。
18 如果文件不关闭,读写能否完成?
不能,因为文件还存储在缓冲区中(除非大于缓存区缓存)。
19 什么是自动行刷新?
使用PW的println时,会自动在每次输入后flush(),即文件不关闭,也完成读写。
原本需要close才会调用flush()
PrintWriter(OutpuStream out,boolean autoflush)
PrintWriter(Writer out,boolean autoflush)
20 如何一次性读取一行字符串。
public class BufferedReader_readLine {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
FileInputStream fis = new FileInputStream
("src"+File.separator+
"day08"+File.separator+
"BufferedReader_readLine.java");
InputStreamReader isr = new InputStreamReader(fis);
BufferedReader br = new BufferedReader(isr);
/*
* BufferedReader提供方法:
* String readLine()
* 连续读取若干字符,知道读取了换行符为止,
* 将之前的所有字符以一个字符串形式返回。
* 注意:返回的字符串不包含换行符
* 若返回值为null,则表示已到文件末尾
*/
String line = null;
while((line = br.readLine()) != null){
System.out.println(line);
}
br.close();
}
}
PW BR
OSW ISW
FOS FIS
22 所有异常的父类是什么,有什么子类?
Throwable,其下有两个子类——
程序错误:Exception
Java运行环境错误:Error
23 发生错误时会抛出给?
调用代码的代码块
24 Java如何处理错误?
try{
String str = null;
System.out.println(str.length());
}catch(NullPointerException e){//捕获异常实例
System.out.println(e);
String str = "123";
System.out.println(str.length());
}
25 如果错误处理代码块内出现错误会怎样?如何处理?
26 可否捕捉不同的错误?
try{
System.out.println(str.charAt(3));
System.out.println(str.length());
}catch(NullPointerException e){
System.out.println(e);
}catch(Exception e){
System.out.println(e);
}
27 finally中的代码什么情况系会执行?
任何情况,不管是否报错,
甚至try中return了,也在执行finally中的代码块才会跳出。
28 实例化的IO对象,最后必须关闭,在finally中关闭时,必须判断是否为null值。
FileOutputStream fos = null;
try {
fos = new FileOutputStream("fos.txt");
fos.write("你好"<br />.getBytes());
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally{
try {
if(fos != null){
fos.close();
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
29 finalize是什么?
object类中定义的方法,当一个对象即将被GC释放前,GC会调用该对象的finalize方法,调用后该对象即被释放。