简述Java I/O中字节流和字符流的区别。
时间: 2024-01-25 16:03:42 浏览: 78
Java I/O 中,字节流和字符流是两种不同的 I/O 操作方式。字节流用于读写的数据以字节(8 位)为单位,能够读写任何类型的数据,包括文本、图像、音频、视频等;而字符流则是以字符(16 位)为单位读写数据,主要用于读写文本文件。在字符流中,字符按照指定的字符集进行编码和解码。由于字符流可以处理 Unicode 字符,因此通常用于国际化程序的开发。
相关问题
1、 简述Java I/O流中,DataInputStream与DataOutputStream的使用。 2、 简述Java I/O中,如何实现对象的串行化。(涉及到ObjectInputStream与ObjectOutputStream)
1. Java I/O流中的DataInputStream和DataOutputStream分别用于读写基本数据类型和字符串。DataInputStream可以从输入流中读取Java基本数据类型和字符串,而DataOutputStream则可以将基本数据类型和字符串写入到输出流中。这两个类的方法都是以字节为单位进行操作,因此需要使用字节流(如FileInputStream和FileOutputStream)或者字符流(如FileReader和FileWriter)与之配合使用。
2. Java中实现对象的串行化需要使用ObjectInputStream和ObjectOutputStream。对象的串行化是将Java对象转换为字节流的过程,可以将其保存到本地文件或者通过网络传输。ObjectOutputStream可以将Java对象转换为字节流并写入输出流中,而ObjectInputStream则可以从输入流中读取字节流并将其转换为Java对象。对象的串行化需要保证对象中的所有成员变量都是可以序列化的,否则会抛出NotSerializableException异常。同时,需要注意的是,对象的串行化是基于Java的反射机制实现的,因此对于不同的Java版本,可能会有一些兼容性问题。
1、 简述Java I/O流中,DataInputStream与DataOutputStream的使用。 2、 简述Java I/O中,如何实现对象的串行化。(涉及到ObjectInputStream与ObjectOutputStream)
1、DataInputStream和DataOutputStream是Java I/O流中的两个类,用于读写基本数据类型和字符串。DataInputStream提供了readInt()、readDouble()等方法,可以从输入流中读取相应类型的数据;DataOutputStream提供了writeInt()、writeDouble()等方法,可以把相应类型的数据写入输出流中。同时,DataOutputStream还提供了writeUTF()方法,可以把字符串写入输出流中。
使用方法如下:
```java
try (DataOutputStream dos = new DataOutputStream(new FileOutputStream("data.txt"));
DataInputStream dis = new DataInputStream(new FileInputStream("data.txt"))) {
dos.writeInt(123);
dos.writeDouble(3.14);
dos.writeUTF("hello world");
int i = dis.readInt();
double d = dis.readDouble();
String s = dis.readUTF();
System.out.println(i);
System.out.println(d);
System.out.println(s);
} catch (IOException e) {
e.printStackTrace();
}
```
2、Java中的对象是存储在内存中的,如果要把对象写入文件或网络传输,就需要使用对象的串行化。对象的串行化是指将一个对象转换为一个字节序列,以便存储在文件或网络中,或者在Java虚拟机之间传递。
Java提供了ObjectInputStream和ObjectOutputStream类,用于实现对象的串行化。要实现对象的串行化,需要让对象所属的类实现Serializable接口。Serializable接口是一个标记接口,没有任何方法,只是用来标记这个类可以被串行化。
使用方法如下:
```java
class Person implements Serializable {
private String name;
private int age;
public Person(String name, int age) {
this.name = name;
this.age = age;
}
@Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
}
try (ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("person.obj"));
ObjectInputStream ois = new ObjectInputStream(new FileInputStream("person.obj"))) {
Person person = new Person("Tom", 18);
oos.writeObject(person);
Person p = (Person) ois.readObject();
System.out.println(p);
} catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}
```
需要注意的是,如果一个对象的成员变量也是对象,那么这个成员变量所属的类也必须实现Serializable接口。如果一个成员变量不想被串行化,可以在它前面加上transient关键字。
阅读全文