在Java中,经常使用字节或是字符数组临时存储数据,这些数组又经常是数据的来源或是目的地。我们可以直接通过索引值来使用数组中的数据,也可以通过流来使用这些数组。
ByteArrayInputStream与ByteArrayOutputStream
ByteArrayInputStream与ByteArrayOutputStream封装字节数组,然后就可以通过流来使用数组中的数据了。
ByteArrayInputStream简单示例如下:
byte[] bytes = new byte[16];
bytes[0] = 't';
bytes[1] = 'e';
bytes[2] = 's';
bytes[3] = 't';
bytes[4] = '0';
InputStream inputStream = new ByteArrayInputStream(bytes);
int data = inputStream.read();
while (data != '0') {
char ch = (char) data;
System.out.println(ch);
data = inputStream.read();
}
运行结果:
t
e
s
t
向字节数组中赋值字母,其实在字节数组中存储的是数字,那我们直接在数组中存储数字,转换后读出来的是不是就是字母呢?答案是肯定的。
// 新建字节数组
byte[] bytes = new byte[16];
// 数组中索引值0-3中,存储的是ASCII码,分别是116->'t',101->'e',115->'s'
bytes[0] = 116;
bytes[1] = 101;
bytes[2] = 115;
bytes[3] = 116;
// 此处简单的将0视为结束符,实际0在ASCII码中也是有其含义的
bytes[4] = 0;
InputStream inputStream = new ByteArrayInputStream(bytes);
int data = inputStream.read();
while (data != 0) {
// 本地默认编码规则为UTF-8,兼容ASCII码
char ch = (char) data;
System.out.println(ch);
data = inputStream.read();
}
运行结果与字节数组中存储字母的代码一致。
ByteArrayOutputStream简单示例如下:
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
// 将数据"test"以UTF-8的编码格式输出到输出流中
outputStream.write("test".getBytes(StandardCharsets.UTF_8));
// 将流中数据输出到字节数组中
byte[] bytes = outputStream.toByteArray();
for (byte b : bytes) {
System.out.println((char) b);
}
运行结果:
t
e
s
t
CharArrayReader与CharArrayWriter
CharArrayReader与ByteArrayInputStream功能类似,只不过它是用来封装字符数组的。
CharArrayReader简单示例如下:
char[] chars = new char[16];
chars[0] = 't';
chars[1] = 'e';
chars[2] = 's';
chars[3] = 't';
chars[4] = '测';
chars[5] = '试';
chars[6] = '文';
chars[7] = '本';
chars[8] = '0';
CharArrayReader charArrayReader = new CharArrayReader(chars);
int data = charArrayReader.read();
while (data != '0') {
char ch = (char) data;
System.out.println(ch);
data = charArrayReader.read();
}
运行结果:
t
e
s
t
测
试
文
本
CharArrayReader中的read()返回的是int类型。那我们直接在字符数组中存储数字,读出来转换后是不是也会是字符?答案依然是肯定的。
代码示例如下:
// 新建字符数组
char[] chars = new char[16];
// 数组中索引值0-3中,存储的是ASCII码(Unicode编码兼容),分别是116->'t',101->'e',115->'s'
chars[0] = 116;
chars[1] = 101;
chars[2] = 115;
chars[3] = 116;
// 数组中索引值4-7中,存储的是16进制的Unicode编码
// 分别是0x6d4b->'测',0x8bd5->'试',0x6587->'文',0x672c->'本'
chars[4] = 0x6d4b;
chars[5] = 0x8bd5;
chars[6] = 0x6587;
chars[7] = 0x672c;
// 此处简单的将0视为结束符
chars[8] = 0;
CharArrayReader charArrayReader = new CharArrayReader(chars);
int data = charArrayReader.read();
while (data != 0) {
// 本地默认编码规则为UTF-8
char ch = (char) data;
System.out.println(ch);
data = charArrayReader.read();
}
运行结果与字符数组中存储字符的结果一致。
要注意,程序的默认编码格式为UTF-8。关于Unicode与UTF-8的关系看此篇文章:Unicode与UTF-8
CharArrayWriter简单示例如下:
CharArrayWriter charArrayWriter = new CharArrayWriter();
// 将字符串输出到输出流中
charArrayWriter.write("test测试文本");
// 将流中数据输出到字符数组中
char[] chars = charArrayWriter.toCharArray();
for (char ch : chars) {
System.out.println(ch);
}
运行结果:
t
e
s
t
测
试
文
本