面向字节的操作为以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();
- }
- }
操作的是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();