面向字节的操作为以8位为单位对二进制的数据进行操作,对数据不进行转换,这些类都是InputStream和OutputStream的子类.
面向字符的操作为以字符为单位对数据进行操作,在读的时候将二进制数据转为字符,在写的时候将字符转为二进制数据,这些类都是Reader和Writer的子类.
下面是JAVA示例代码:
public class ByteCharStreamTest {
private static void readBytes(BufferedInputStream bis,int buffSize) throws Exception{
byte[] readBytes = new byte[buffSize];
int len;
while((len=bis.read(readBytes)) !=-1){
for(int i=0; i<len;i++){
System.out.print(readBytes[i] + " ");
}
System.out.println("-----one group --------");
}
}
public static void testInPutStream(String fileName) throws Exception {
File file = new File(fileName);
FileInputStream fis = new FileInputStream(file);
BufferedInputStream bis = new BufferedInputStream(fis);
readBytes(bis,10);
bis.close();
fis.close();
}
public static void testOutPutStream() throws Exception {
File file = new File("D:/temp/outpututf8");
FileOutputStream fos = new FileOutputStream(file);
BufferedOutputStream bos = new BufferedOutputStream(fos);
bos.write("abcdefg\r\n".getBytes("UTF-8"));
bos.write("中\r\n".getBytes("UTF-8"));
bos.write("1234567\r\n".getBytes("UTF-8"));
bos.write("中".getBytes("UTF-8"));
bos.close();
fos.close();
}
private static void readcharBychar(BufferedReader br ) throws Exception{
char[] chbf = new char[10];
int len;
while ((len=br.read(chbf) )!= -1){
for(int i=0;i<len;i++){
System.out.print(chbf[i]);
}
}
}
private static void readcharLines(BufferedReader br ) throws Exception{
String line;
while ((line=br.readLine()) != null){
System.out.println(line);
}
}
public static void testInPutReader(String fileName,String charset) throws Exception {
File file = new File(fileName);
FileInputStream fis = new FileInputStream(file);
InputStreamReader fr = new InputStreamReader(fis,charset);
BufferedReader br = new BufferedReader(fr);
readcharBychar(br);
//readcharLines(br);
br.close();
fr.close();
fis.close();
}
public static void testOutputWriter() throws Exception {
File file = new File("D:/temp/outputgb2312");
FileOutputStream fos = new FileOutputStream(file);
OutputStreamWriter fwr = new OutputStreamWriter(fos,"GB2312");
BufferedWriter bwr = new BufferedWriter(fwr);
bwr.write("abcdefg\r\n");
bwr.write("中\r\n");
bwr.write("1234567\r\n");
bwr.write("中");
bwr.close();
fwr.close();
fos.close();
}
public static void main(String[] args) throws Exception {
testInPutStream("C:/D/charset/gb2312.txt");
//testOutPutStream();
//testInPutReader();
//testInPutReader("C:/D/charset/gb2312.txt","gb2312");
//testOutputWriter();
//testStreamSource();
}
}
我们先来看对InputStream以字节流的方式处理,字节流的方式不需要指定编码,
操作的是8bit的字节.InputStream提供的read()方法返回的是这8bit代表的int值.
read(byte b[])将8bit的多个数据读入byte数组中.注意,同一个字节用int和byte表示的值是不同的.
byte的范围是-128到127,超过127的用负数表示.
如下面这个例子文件是UTF8的编码
abcdefg
中
1234567
中
其16进制的表示如下:a的16进制表示为61,"中"的16进制为E4 B8 AD
运行testInPutStream输出如下:97为a的10进制表示,16进制的61和10进制的97转为二进制是相等的.
"中"的10进制为228 184 173,用byte表示为-28 -72 -83.
97 98 99 100 101 102 103 13 10 -28 -----one group --------
-72 -83 13 10 49 50 51 52 53 54 -----one group --------
55 13 10 228 184 173
InPutStream有以下的read方法.

不要被本例的bos.write("中\r\n".getBytes("UTF-8"));所误导,这里指定编码是将"中"转成
以UTF8表示的byte数组.对同一个字符,不同的编码转换成的二进制数组可能是不一样的.
bos.write("中\r\n".getBytes("GB2312"));得到"中"的16进制表示为D6 D0.如下图,"中"在utf8中占用3个字节,在gb2312中占有两个字节.

InputStreamReader需要指定编码,reader安照编码将二进制的多个字节转成一个字符.
InputStreamReader有下面的一些read方法.

OutputStreamWriter安照指定编码将字符转成二进制数据保存.
OutputStreamWriter有下面的一些方法:
做JAVA IO操作的时候,我们通常都是将多个对象重叠在一起,提供自己期望的功能的.
通常是在Stream外套上一个Buffered类来提高IO效率和提供更方便的操作方法.
InputStream的作用是标志那些从不同起源地产生输入的类.这些起源地包括(每个都有一个相关的InputStream子类):
(1)字节数组:ByteArrayInputStream(byte buf[])
(2)String对象:StringBufferInputStream(String s)
(3)文件:FileInputStream(file)
(4)其他起源,如InputStream socketIn = socket.getInputStream();
OutputStream的作用是标志输出到不同的目的地.这些目的地包括(每个都有一个相关的OutputStream子类):
(1)字节数组:ByteArrayOutputStream bos = new ByteArrayOutputStream();
ByteArrayOutputStream在内存中创建一个缓冲区.我们发送给流的所有数据都会置入这个缓冲区.
(2)文件:FileOutputStream(file)
(3)其他起源,如OutputStream socketOut = socket.getOutputStream();