字节的存储
内存中的存储
- 基本数据类型:
- 在Java中,
byte
类型占用 1 个字节(8 位)。它的取值范围是从 -128 到 127。 - 存储在内存中的
byte
数据可以直接操作,例如通过数组或变量访问。
- 数据结构:
byte
数组:在内存中,byte
数组是连续的字节序列。例如,byte[] bytes = new byte[10];
分配一个长度为10 的字节数组,在内存中连续存储 10 个字节。- 直接内存(Direct Memory):用于高性能 I/O 操作,可以通过
ByteBuffer.allocateDirect(int capacity)
分配。
文件系统中的存储
- 二进制文件:
- 字节数据可以直接写入文件。例如,使用
FileOutputStream
可以将字节数组写入文件。 - 文件读取时,可以通过
FileInputStream
读取字节数据。
byte[] data = {1, 2, 3, 4, 5};
try (FileOutputStream fos = new FileOutputStream("output.bin")) {
fos.write(data);
}
try (FileInputStream fis = new FileInputStream("output.bin")) {
byte[] buffer = new byte[5];
int bytesRead = fis.read(buffer);
}
字符的存储
内存中的存储
- 基本数据类型:
- 在Java中,
char
类型占用 2 个字节(16 位),使用 UTF-16 编码。它的取值范围是从 \u0000
到 \uFFFF
。 - 存储在内存中的
char
数据可以通过数组或变量访问。
- 数据结构:
char
数组:在内存中,char
数组是连续的字符序列。例如,char[] chars = new char[10];
分配一个长度为10 的字符数组,在内存中连续存储 10 个字符(20 个字节)。
- 字符串(String):
String
是一个不可变的字符序列,内部使用 char 数组存储数据。每个 String
对象有一个 char
数组和一个用于缓存哈希码的整型变量。
char[] chars = {'H', 'e', 'l', 'l', 'o'};
String str = new String(chars);
文件系统中的存储
- 文本文件:
- 字符数据可以通过字符流(例如
FileReader
和 FileWriter
)写入和读取文件。 - 字符编码(例如UTF-8、ISO-8859-1)决定了字符在文件中的存储方式。
String content = "Hello, world!";
try (FileWriter writer = new FileWriter("output.txt")) {
writer.write(content);
}
try (FileReader reader = new FileReader("output.txt")) {
char[] buffer = new char[20];
int charsRead = reader.read(buffer);
String contentRead = new String(buffer, 0, charsRead);
}
字节与字符之间的转换
- 字符编码:将字符转换为字节时,编码方式非常重要。例如 UTF-8 编码将字符映射为一个或多个字节,而 ISO-8859-1编码则将每个字符映射为单个字节。
String str = "Hello, world!";
byte[] bytes = str.getBytes(StandardCharsets.UTF_8);
String decodedStr = new String(bytes, StandardCharsets.UTF_8);
详细总结
- 字节(Byte):
- 基本数据类型
byte
占用 1 个字节,取值范围从 -128 到 127。 - 在内存中,字节可以通过数组或直接内存存储和访问。
- 在文件系统中,字节以二进制形式存储,常用于图像、音频和其他二进制数据。
- 字符(Character):
- 基本数据类型
char
占用 2 个字节,使用 UTF-16 编码。 - 在内存中,字符可以通过数组或字符串存储和访问。
- 在文件系统中,字符以文本形式存储,字符编码决定了字符的存储方式。