简述Java I/O中字节流和字符流的区别。
时间: 2024-01-25 19:03:42 浏览: 74
Java I/O 中,字节流和字符流是两种不同的 I/O 操作方式。字节流用于读写的数据以字节(8 位)为单位,能够读写任何类型的数据,包括文本、图像、音频、视频等;而字符流则是以字符(16 位)为单位读写数据,主要用于读写文本文件。在字符流中,字符按照指定的字符集进行编码和解码。由于字符流可以处理 Unicode 字符,因此通常用于国际化程序的开发。
相关问题
1、 简述Java I/O流中,DataInputStream与DataOutputStream的使用。 2、 简述Java I/O中,如何实现对象的串行化。(涉及到ObjectInputStream与ObjectOutputStream)
1. Java中的DataInputStream和DataOutputStream是数据输入输出流,用于读取和写入基本数据类型,如int,double,boolean等。使用DataInputStream时,可以通过readByte()、readInt()等方法读取不同类型的数据,而使用DataOutputStream时,可以通过writeByte()、writeInt()等方法将不同类型的数据写入输出流中。这些方法是面向字节的,因此在读取和写入时需要注意字节顺序的问题。
2. Java中的对象序列化是指将Java对象转换为字节序列的过程,以便在网络上传输或保存到文件中。实现Java对象的序列化需要使用ObjectInputStream和ObjectOutputStream。ObjectOutputStream可以将Java对象写入输出流中,而ObjectInputStream则可以从输入流中读取Java对象。在进行对象的序列化和反序列化时,需要注意对象的类必须实现Serializable接口,否则会抛出NotSerializableException异常。同时,如果对象中包含了其他对象的引用,则这些引用指向的对象也必须是可序列化的。
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关键字。
阅读全文