Lang:简体中文

java的io面试题

日期:2025-09-08 / 来源:面试宝典

掌握 java io,轻松应对面试

在 java 开发的面试中,io 相关的问题是经常被问到的。下面就为大家详细介绍一些常见的 java io 面试题。

java io 流的分类

java io 流主要分为字节流和字符流。字节流以字节为单位进行数据传输,包括 inputstream 和 outputstream 及其子类;字符流以字符为单位进行数据传输,包括 reader 和 writer 及其子类。例如,fileinputstream 是字节输入流,用于从文件中读取字节数据;filereader 是字符输入流,用于从文件中读取字符数据。下面是一个简单的使用 fileinputstream 读取文件的例子:

java

import java.io.fileinputstream;

import java.io.ioexception;

public class fileinputstreamexample {

public static void main(string[] args) {

try (fileinputstream fis = new fileinputstream("test.txt")) {

int data;

while ((data = fis.read()) != -1) {

system.out.print((char) data);

}

} catch (ioexception e) {

e.printstacktrace();

}

}

}

字节流和字符流的区别

字节流和字符流的主要区别在于处理的数据单位不同。字节流处理的是字节数据,适用于处理二进制文件,如图片、视频等;字符流处理的是字符数据,适用于处理文本文件。另外,字节流在操作时不会用到缓冲区,而字符流在操作时会用到缓冲区。例如,在使用字节流写入数据时,数据会直接写入到目标文件;而使用字符流写入数据时,数据会先写入到缓冲区,当缓冲区满或者调用 flush 方法时,才会将数据写入到目标文件。

bufferedinputstream 和 bufferedoutputstream 的作用

bufferedinputstream 和 bufferedoutputstream 是缓冲字节流,它们的主要作用是提高 io 操作的效率。bufferedinputstream 内部有一个缓冲区,当调用 read 方法时,会先从缓冲区中读取数据,如果缓冲区中没有数据,再从输入流中读取一批数据到缓冲区;bufferedoutputstream 同样有一个缓冲区,当调用 write 方法时,会先将数据写入到缓冲区,当缓冲区满时,再将缓冲区中的数据一次性写入到输出流中。下面是一个使用 bufferedinputstream 和 bufferedoutputstream 复制文件的例子:

java

import java.io.bufferedinputstream;

import java.io.bufferedoutputstream;

import java.io.fileinputstream;

import java.io.fileoutputstream;

import java.io.ioexception;

public class bufferedstreamexample {

public static void main(string[] args) {

try (bufferedinputstream bis = new bufferedinputstream(new fileinputstream("source.txt"));

bufferedoutputstream bos = new bufferedoutputstream(new fileoutputstream("destination.txt"))) {

int data;

while ((data = bis.read()) != -1) {

bos.write(data);

}

} catch (ioexception e) {

e.printstacktrace();

}

}

}

序列化和反序列化

序列化是指将对象转换为字节序列的过程,反序列化是指将字节序列转换为对象的过程。在 java 中,要实现序列化,需要让类实现 serializable 接口。例如,下面是一个简单的序列化和反序列化的例子:

java

import java.io.fileinputstream;

import java.io.fileoutputstream;

import java.io.ioexception;

import java.io.objectinputstream;

import java.io.objectoutputstream;

import java.io.serializable;

class person implements serializable {

private string name;

private int age;

public person(string name, int age) {

this.name = name;

this.age = age;

}

public string getname() {

return name;

}

public int getage() {

return age;

}

}

public class serializationexample {

public static void main(string[] args) {

person person = new person("john", 25);

// 序列化

try (objectoutputstream oos = new objectoutputstream(new fileoutputstream("person.ser"))) {

oos.writeobject(person);

} catch (ioexception e) {

e.printstacktrace();

}

// 反序列化

try (objectinputstream ois = new objectinputstream(new fileinputstream("person.ser"))) {

person deserializedperson = (person) ois.readobject();

system.out.println("name: " + deserializedperson.getname());

system.out.println("age: " + deserializedperson.getage());

} catch (ioexception | classnotfoundexception e) {

e.printstacktrace();

}

}

}

randomaccessfile 的使用

randomaccessfile 可以在文件的任意位置进行读写操作。它有一个文件指针,通过 seek 方法可以移动文件指针的位置。例如,下面是一个使用 randomaccessfile 读取文件指定位置数据的例子:

java

import java.io.ioexception;

import java.io.randomaccessfile;

public class randomaccessfileexample {

public static void main(string[] args) {

try (randomaccessfile raf = new randomaccessfile("test.txt", "r")) {

raf.seek(10); // 移动文件指针到第 10 个字节的位置

int data;

while ((data = raf.read()) != -1) {

system.out.print((char) data);

}

} catch (ioexception e) {

e.printstacktrace();

}

}

}

以下为推荐内容

微信二维码