IO流

1. 下面哪个流类属于面向字符的输入流?

A. BufferedWriter
B. FileInputStream
C. ObjectInputStream
D. InputStreamReader

答案:D

解析:Java 的 IO 操作中有面向字节(Byte)和面向字符(Character)两种方式。

面向字节的操作为以 8 位为单位对二进制的数据进行操作,对数据不进行转换,这些类都是 InputStream 和 OutputStream 的子类。

面向字符的操作为以字符为单位对数据进行操作,在读的时候将二进制数据转为字符,在写的时候将字符转为二进制数据,这些类都是 Reader 和 Writer 的子类。

总结:以 InputStream(输入)/OutputStream(输出)为后缀的是字节流;以Reader(输入)/Writer(输出)为后缀的是字符流。

扩展:Java 流类图结构,一目了然,解决大部分选择题:

stream

2. 阅读 Shape 和 Circle 两个类的定义。在序列化一个 Circle 的对象 circle 到文件时,下面哪个字段会被保存到文件中?

class Shape {

       public String name;

}

class Circle extends Shape implements Serializable{

       private float radius;

       transient int color;

       public static String type = "Circle";

}

A. name B. radius C. color D. type

答案:B

解析:这里有详细的解释:http://www.cnblogs.com/lanxuezaipiao/p/3369962.html

3. 什么是 Java 序列化,如何实现 Java 序列化?

序列化就是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。

序列化的实现:将需要被序列化的类实现 Serializable 接口,该接口没有需要实现的方法, implements Serializable 只是为了标注该对象是可被序列化的,然后使用一个输出流(如:FileOutputStream)来构造一个ObjectOutputStream(对象流)对象,接着,使用ObjectOutputStream对象的writeObject(Object obj)方法就可以将参数为obj的对象写出(即保存其状态),要恢复的话则用输入流。

### Java IO概述 Java IO(Input/Output)用于处理数据输入和输出操作。它提供了多种类来实现文件、网络和其他设备的数据传输功能。这些类主要位于 `java.io` 包中。 #### 文件读写的两种基本方式 Java 中的 IO 分为两大类:字节字符流。 - **字节**:适用于二进制数据的操作,例如图片、音频等文件。 - **字符流**:专门针对文本文件设计,提供更方便的编码转换支持。 以下是常见的几种及其用途: | 类型 | 输入 | 输出 | |--------------|----------------------------------|-------------------------------| | 字节 | `InputStream` | `OutputStream` | | 字符流 | `Reader` | `Writer` | --- ### 示例代码展示 #### 1. 使用字节复制图片文件 下面是一个完整的例子,展示了如何通过字节完成图片文件的复制[^2]。 ```java import java.io.*; public class ByteStreamExample { public static void main(String[] args) { try (InputStream is = new FileInputStream("source_image.png"); OutputStream os = new FileOutputStream("destination_image.png")) { byte[] buffer = new byte[1024]; int length; while ((length = is.read(buffer)) > 0) { os.write(buffer, 0, length); } } catch (IOException e) { System.err.println("Error occurred during file copy: " + e.getMessage()); } } } ``` 此代码片段实现了从源路径到目标路径的文件拷贝过程。其中使用了缓冲区技术以提高性能。 #### 2. 缓冲字节的应用 为了进一步提升效率,可以引入带缓冲机制的子类——`BufferedInputStream` 和 `BufferedOutputStream`[^3]。 ```java import java.io.*; public class BufferedByteStreamExample { public static void main(String[] args) { try (BufferedInputStream bis = new BufferedInputStream(new FileInputStream("input.txt")); BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("output.txt"))) { int data; while ((data = bis.read()) != -1) { bos.write(data); } } catch (IOException e) { System.err.println("I/O error encountered: " + e.getMessage()); } } } ``` 上述程序利用缓冲特性减少了底层磁盘访问次数,从而加快了执行速度。 #### 3. 对象序列化与反序列化 如果需要保存复杂结构的对象至外部存储介质,则需要用到对象 `ObjectInputStream` 和 `ObjectOutputStream`[^1]。 ```java // 序列化对象 try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("object.ser"))) { MySerializableClass obj = new MySerializableClass(); oos.writeObject(obj); } catch (Exception ex) { System.out.println(ex.toString()); } // 反序列化对象 try (ObjectInputStream ois = new ObjectInputStream(new FileInputStream("object.ser"))) { MySerializableClass restoredObj = (MySerializableClass) ois.readObject(); System.out.println(restoredObj); } catch (Exception ex) { System.out.println(ex.toString()); } ``` 注意:要使某个类能够被序列化,该类需实现 `java.io.Serializable` 接口。 --- ### 总结 以上介绍了三种典型场景下的 Java IO 应用实例,分别是基于字节的基础文件操作、借助缓存优化后的高效版本以及面向对象持久化的高级技巧。每种情况都体现了不同层次的需求满足能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值