1、Java中有几种类型的流?
A: Java中按流的类型划分为:输入流(InputStream) 和 输出流(OutpuStream)、按实现功能划分为:节点流(可以从或向一个地方读取数据。eg :FileReader)和处理流(对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据的读取。eg:BufferReader),一般处理流的构造方法总是要带上一个其他流对象作为参数,一个流对象经过其他流的多次封装,则称为流的链接。按处理流的单位划分为:字节流和字符流,字节流继承于InputStream和OutputStream,字符流继承于InputStreamReader和OutputStreamWriter。
2、字节流如何转化为字符流,以及字节流和字符流的区别?
A: 字节输入流转字符输入流通过InputStreamReader实现,构造参数传入InputStream对象,字节输出流转字符输出流通过OutputStreamWriter,构造参数传入OutputStream对象。a:字节流在读取时是读取到一个字节就返回一个字节,而字节流则是读取到一个或多个字节时,会先查指定的编码表(中文对应的字节时2个,在UTF-8码表中时3个字节),将查到的字符返回。字节流可以处理所有类型的数据,而字符流只能处理字符数据。只要处理数据时纯文本数据,就要优先考虑使用字符流,除此都用字节流。字节流主要操作byte类型的数据,以byte数组为准,主要操作OutputStream和InputStream。字符处理的单位为2个字节的Unicode字符,分别操作字符、字符数组和字符串,而字节流处理的单位为1个字节,所以处理国际化多语言支持,读取音频文件、图片、视频文件等用字节流读取,读取文本类的数据,可使用字符流,比如使用Reader 和 Writer专门操作字符流的类。
3、如何将一个Java对象序列化到文件中或者将序列化的对象存储的文件读取出来?
A: 主要使用到两个类ObjectOutputStream和ObjectInputStream,在序列化对象的时候,对象的类必须实现Serializable接口,作为可序列化的标示。读取代码如下:
// 写入序列化对象到文件中
ObjectOutputStream outputStream = null;
try {
outputStream = new ObjectOutputStream(new FileOutputStream(new File("D://test.txt")));
// Object
outputStream.writeObject(new Object());
} catch (IOException e) {
e.printStackTrace();
}finally {
if(outputStream!=null){
try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
// 读取序列化文件中被序列化的对象
ObjectInputStream inputStream = null;
try {
inputStream = new ObjectInputStream(new FileInputStream(new File("D://test.txt")));
Object obj = inputStream.readObject();
// ...todo
} catch (Exception e) {
// IOException or ClassNotFoundException
e.printStackTrace();
} finally {
if(inputStream != null){
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}