字节流和字符流

字节流和字符流的区别与联系

Java中的字节流和字符流是用于处理输入和输出的两种不同的流。

区别

1. 数据类型:字节流以字节为单位进行读写,而字符流以字符为单位进行读写。字节流可以处理任意类型的数据,包括文本、图像、音频等,而字符流主要用于处理文本数据。

2. 编码方式:字节流是以字节的形式直接读写数据,不关心数据的具体编码方式。而字符流是以字符的形式读写数据,会根据指定的字符编码将字符转换为字节进行处理。

3. 处理效率:字节流的处理效率通常比字符流高,因为字节流直接操作底层的字节数据,不需要进行字符编码的转换。

4. 使用场景:字节流适用于处理二进制数据,如文件的复制、网络传输等。字符流适用于处理文本数据,如文件的读写、文本的处理等。

联系

1. 继承关系:字节流和字符流都是抽象类InputStreamOutputStream的子类,以及ReaderWriter的子类。
2. 使用方式:字节流和字符流都提供了类似的读写方法,如read()write()方法。
3. 转换:可以通过InputStreamReaderOutputStreamWriter类将字节流转换为字符流,以便处理文本数据。
4. 字符流是建立在字节流的基础上的。在字符流中,使用了字符编码来处理字符数据,而字符编码又是通过字节流来实现的。因此,字符流可以看作是字节流的高级封装,提供了更方便的字符处理功能。

字节流相关的类:

1. InputStream:所有字节输入流的超类。

2. FileInputStream:从文件中读取数据的输入流。

3. BufferedInputStream:带有缓冲区的输入流,提高读取效率。

4. DataInputStream:可以从输入流中读取Java基本数据类型的输入流。

5. ObjectInputStream:可以从输入流中读取Java对象的输入流。

6. OutputStream:所有字节输出流的超类。

7. FileOutputStream:向文件中写入数据的输出流。

8. BufferedOutputStream:带有缓冲区的输出流,提高写入效率。

9. DataOutputStream:可以向输出流中写入Java基本数据类型的输出流。

10. ObjectOutputStream:可以向输出流中写入Java对象的输出流。

11. ByteArrayInputStream:是一个输入流,它从一个字节数组中读取数据

12. ByteArrayOutputStream:是一个输出流,它将数据写入一个字节数组中。

字符流相关的类:

1. Reader:所有字符输入流的超类。

2. FileReader:从文件中读取字符的输入流。

3. BufferedReader:带有缓冲区的输入流,提高读取效率。

4. InputStreamReader:将字节流转换为字符流的输入流。

5. Writer:所有字符输出流的超类。

6. FileWriter:向文件中写入字符的输出流。

7. BufferedWriter:带有缓冲区的输出流,提高写入效率。

8. OutputStreamWriter:将字符流转换为字节流的输出流。

字节流相关的类示例代码

  1. InputStream示例代码:
InputStream inputStream = new FileInputStream("example.txt");
int data = inputStream.read();
while (data != -1) {
    System.out.print((char) data);
    data = inputStream.read();
}
inputStream.close();

这段代码创建了一个文件输入流,读取了文件中的每一个字节,并将其转换为字符输出到控制台上。最后关闭了输入流。

  1. FileInputStream示例代码:
FileInputStream inputStream = new FileInputStream("example.txt");
int data = inputStream.read();
while (data != -1) {
    System.out.print((char) data);
    data = inputStream.read();
}
inputStream.close();

这段代码创建了一个文件输入流,读取了文件中的每一个字节,并将其转换为字符输出到控制台上。最后关闭了输入流。

  1. BufferedInputStream示例代码:
InputStream inputStream = new FileInputStream("example.txt");
BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);
int data = bufferedInputStream.read();
while (data != -1) {
    System.out.print((char) data);
    data = bufferedInputStream.read();
}
bufferedInputStream.close();

这段代码创建了一个文件输入流,并将其包装在一个带有缓冲区的输入流中。读取了文件中的每一个字节,并将其转换为字符输出到控制台上。最后关闭了输入流。

  1. DataInputStream示例代码:
InputStream inputStream = new FileInputStream("example.txt");
DataInputStream dataInputStream = new DataInputStream(inputStream);
int data = dataInputStream.readInt();
System.out.println(data);
dataInputStream.close();

这段代码创建了一个文件输入流,并将其包装在一个可以读取Java基本数据类型的输入流中。读取了文件中的一个整数,并将其输出到控制台上。最后关闭了输入流。

  1. ObjectInputStream示例代码:
InputStream inputStream = new FileInputStream("example.txt");
ObjectInputStream objectInputStream = new ObjectInputStream(inputStream);
Object object = objectInputStream.readObject();
System.out.println(object);
objectInputStream.close();

这段代码创建了一个文件输入流,并将其包装在一个可以读取Java对象的输入流中。读取了文件中的一个对象,并将其输出到控制台上。最后关闭了输入流。

  1. OutputStream示例代码:
OutputStream outputStream = new FileOutputStream("example.txt");
String data = "Hello, world!";
outputStream.write(data.getBytes());
outputStream.close();

这段代码创建了一个文件输出流,将一个字符串转换为字节数组,并将其写入到文件中。最后关闭了输出流。

  1. FileOutputStream示例代码:
FileOutputStream outputStream = new FileOutputStream("example.txt");
String data = "Hello, world!";
outputStream.write(data.getBytes());
outputStream.close();

这段代码创建了一个文件输出流,将一个字符串转换为字节数组,并将其写入到文件中。最后关闭了输出流。

  1. BufferedOutputStream示例代码:
OutputStream outputStream = new FileOutputStream("example.txt");
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream);
String data = "Hello, world!";
bufferedOutputStream.write(data.getBytes());
bufferedOutputStream.close();

这段代码创建了一个文件输出流,并将其包装在一个带有缓冲区的输出流中。将一个字符串转换为字节数组,并将其写入到文件中。最后关闭了输出流。

  1. DataOutputStream示例代码:
OutputStream outputStream = new FileOutputStream("example.txt");
DataOutputStream dataOutputStream = new DataOutputStream(outputStream);
int data = 42;
dataOutputStream.writeInt(data);
dataOutputStream.close();

这段代码创建了一个文件输出流,并将其包装在一个可以写入Java基本数据类型的输出流中。将一个整数写入到文件中。最后关闭了输出流。

  1. ObjectOutputStream示例代码:
OutputStream outputStream = new FileOutputStream("example.txt");
ObjectOutputStream objectOutputStream = new ObjectOutputStream(outputStream);
Object object = new Object();
objectOutputStream.writeObject(object);
objectOutputStream.close();

这段代码创建了一个文件输出流,并将其包装在一个可以写入Java对象的输出流中。将一个对象写入到文件中。最后关闭了输出流。

  1. ByteArrayInputStream示例代码:
byte[] byteArray = {1, 2, 3, 4, 5};
ByteArrayInputStream inputStream = new ByteArrayInputStream(byteArray);

int data;
while ((data = inputStream.read()) != -1) {
    System.out.println(data);
}

创建了一个ByteArrayInputStream对象,将一个字节数组传递给它。然后我们使用while循环从输入流中读取数据,并在控制台上打印出来。

  1. ByteArrayOutputStream示例代码:
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
outputStream.write(1);
outputStream.write(2);
outputStream.write(3);
outputStream.write(4);
outputStream.write(5);

byte[] byteArray = outputStream.toByteArray();
System.out.println(Arrays.toString(byteArray));

创建了一个ByteArrayOutputStream对象,并使用write方法向它写入数据。最后,我们使用toByteArray方法将数据转换为字节数组,并在控制台上打印出来。

扩展:

ByteArrayInputStream和ObjectInputStream的关系,并给出ByteArrayInputStream和ObjectInputStream结合使用的示例代码

ByteArrayInputStream和ObjectInputStream都是Java IO库中的输入流类,用于从字节数组和对象流中读取数据。它们的关系是,ObjectInputStream是建立在ByteArrayInputStream之上的,即ObjectInputStream需要一个InputStream对象作为参数来初始化,而ByteArrayInputStream正好是一种InputStream对象。

下面是一个示例代码,演示如何使用ByteArrayInputStream和ObjectInputStream结合使用来读取Java对象:

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.util.ArrayList;

public class ObjectInputStreamExample {

    public static void main(String[] args) throws IOException, ClassNotFoundException {
        // 创建一个包含Java对象的字节数组
        byte[] objectBytes = createObjectBytes();

        // 创建一个ByteArrayInputStream对象
        ByteArrayInputStream bais = new ByteArrayInputStream(objectBytes);

        // 创建一个ObjectInputStream对象,将ByteArrayInputStream对象作为参数传入
        ObjectInputStream ois = new ObjectInputStream(bais);

        // 从ObjectInputStream中读取Java对象
        ArrayList<String> list = (ArrayList<String>) ois.readObject();

        // 打印读取到的Java对象
        System.out.println(list);
    }

    private static byte[] createObjectBytes() throws IOException {
        ArrayList<String> list = new ArrayList<>();
        list.add("hello");
        list.add("world");

        // 创建一个ByteArrayOutputStream对象
        ByteArrayOutputStream baos = new ByteArrayOutputStream();

        // 创建一个ObjectOutputStream对象,将ByteArrayOutputStream对象作为参数传入
        ObjectOutputStream oos = new ObjectOutputStream(baos);

        // 将Java对象写入ObjectOutputStream中
        oos.writeObject(list);

        // 返回ByteArrayOutputStream中的字节数组
        return baos.toByteArray();
    }
}

在上面的示例代码中,首先通过createObjectBytes方法创建了一个包含Java对象的字节数组。然后,创建了一个ByteArrayInputStream对象,并将这个字节数组作为参数传入。接着,创建了一个ObjectInputStream对象,并将ByteArrayInputStream对象作为参数传入。最后,通过ObjectInputStream对象读取了Java对象,并打印出来。

字符流相关的类示例代码

  1. Reader示例代码:
Reader reader = new FileReader("file.txt");
int data = reader.read();
while (data != -1) {
    System.out.print((char) data);
    data = reader.read();
}
reader.close();

代码含义:创建一个Reader对象,使用FileReader将文件"file.txt"作为输入流。然后使用read()方法读取字符,并将其打印出来,直到读取到文件末尾(返回-1)。最后关闭输入流。

  1. FileReader示例代码:
FileReader reader = new FileReader("file.txt");
int data = reader.read();
while (data != -1) {
    System.out.print((char) data);
    data = reader.read();
}
reader.close();

代码含义:创建一个FileReader对象,将文件"file.txt"作为输入流。然后使用read()方法读取字符,并将其打印出来,直到读取到文件末尾(返回-1)。最后关闭输入流。

  1. BufferedReader示例代码:
BufferedReader reader = new BufferedReader(new FileReader("file.txt"));
String line = reader.readLine();
while (line != null) {
    System.out.println(line);
    line = reader.readLine();
}
reader.close();

代码含义:创建一个BufferedReader对象,使用FileReader将文件"file.txt"作为输入流,并带有缓冲区。然后使用readLine()方法读取一行字符,并将其打印出来,直到读取到文件末尾(返回null)。最后关闭输入流。

  1. InputStreamReader示例代码:
InputStreamReader reader = new InputStreamReader(new FileInputStream("file.txt"), "UTF-8");
int data = reader.read();
while (data != -1) {
    System.out.print((char) data);
    data = reader.read();
}
reader.close();

代码含义:创建一个InputStreamReader对象,使用FileInputStream将文件"file.txt"作为字节流输入流,并将其转换为字符流输入流。指定字符编码为UTF-8。然后使用read()方法读取字符,并将其打印出来,直到读取到文件末尾(返回-1)。最后关闭输入流。

  1. Writer示例代码:
Writer writer = new FileWriter("file.txt");
writer.write("Hello, World!");
writer.close();

代码含义:创建一个Writer对象,使用FileWriter将字符写入到文件"file.txt"中。然后使用write()方法写入字符串"Hello, World!"。最后关闭输出流。

  1. FileWriter示例代码:
FileWriter writer = new FileWriter("file.txt");
writer.write("Hello, World!");
writer.close();

代码含义:创建一个FileWriter对象,将字符写入到文件"file.txt"中。然后使用write()方法写入字符串"Hello, World!"。最后关闭输出流。

  1. BufferedWriter示例代码:
BufferedWriter writer = new BufferedWriter(new FileWriter("file.txt"));
writer.write("Hello, World!");
writer.newLine();
writer.write("This is a new line.");
writer.close();

代码含义:创建一个BufferedWriter对象,使用FileWriter将字符写入到文件"file.txt"中,并带有缓冲区。然后使用write()方法写入字符串"Hello, World!“,使用newLine()方法写入一个新行,再使用write()方法写入字符串"This is a new line.”。最后关闭输出流。

  1. OutputStreamWriter示例代码:
OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream("file.txt"), "UTF-8");
writer.write("Hello, World!");
writer.close();

代码含义:创建一个OutputStreamWriter对象,使用FileOutputStream将字节流输出到文件"file.txt"中,并将其转换为字符流输出流。指定字符编码为UTF-8。然后使用write()方法写入字符串"Hello, World!"。最后关闭输出流。

  • 0
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值