非套接字节流

时间:2021-03-03 11:03:46
非套接字节流知识点:

1、声音和图像只能用字节流来传输

2、InputStream中都是抽象方法,具体功能由子类实现

3、int n = in.read()方法:1、读取一个字节
 2、返回值--读取的字节所对应的ASCII码
   ——(对于该方法,读取的字节在返回值n中,由于是int型,所以不能强制转换成char型)

4、byte buf[] = new byte[512];
   int len = in.read();
   ——该方法:1、读取的内容放在buf[]数组中
      2、返回值:读取字节的个数
      (外加小知识点:空白符对应的ASCII码 — 空格:32/回车:13/换行:10)

5、String str = new String(buf);
   String的构造方法,可以将很多类型转换成String类型,这里只演示byte[],具体见API

6、InputStream:
   InputStream in = new XXXInputStream("d:/in/in.txt");
   若“in.txt”不存在,不会自己帮你建文件,需手动建立
   
   OutputStream:
   OutputStream out = new XXXOutputStream("d:/out/out.txt");
   若“out.txt”不存在,out流会自动帮你建立(只会帮你建立文件)
   ——注意:上面两种,若文件夹不存在,程序都会出异常

7、键盘输入:
   InputStream in = System.in;//System.in的返回值就是InputStream
     //System.out的返回值是PrintStream—打印流

8、while( (len=in.read(buf))!=-1 ){//字符也有这种方法,返回的是字符个数
out.write(buf);
//若是这样写,则每次读/写 512 
//若最后一次文件中已经没有512个字节,
//in.read(buf)还是读取512个字节---即又多读取了文件最前面的内容了
//out.write(buf)也写入512个字节,因此最后多写入了数据,因此该方法不好
    out.write(buf,0,len);//应该用这个方法,从位置 0 写到 len-1的位置
   }

9、if(in.available()>0){
......;//返回字节数,字符也有这个方法,
      //注意:ObjectInputStream流不能用这个方法来判断是否读取完
   }

其它:1、流只是用来传输数据的,而不是处理数据的

      2、流是有方向的,且都是单向的


代码Demo:

——以FileIn/OutputStream为例:

package cn.hncu.old.stream;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

/**
 * 文件内容:青春若有张不老的脸
 */
public class FileInOuttStreamDemo {

	public static void main(String[] args) {
//		ReadDemo();
		WriteDemo();
	}
	
	public static void WriteDemo(){
		try {
			FileOutputStream out = new FileOutputStream("e:/a/b.txt");
			byte buf[] = {32,97,98,99,100,101,13,10};  //byte类型——范围:-128~127
			//windows中回车=\r\n  Linux中回车=\n;
			//\r:13  \n:10     空格:32
			out.write(buf);
			String str = "Oracle从入门到精通";
			out.write(str.getBytes());  //getBytes()函数,将字符串转化成byte数组
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	public static void ReadDemo(){
		try {
			FileInputStream in = new FileInputStream("E:/a/a.txt");
			byte buf[] = new byte[512];
			int len = in.read(buf);//返回值:读取字节的长度
			/*
			 * 注意:由于文件中内容是汉字,所以要考虑编码问题,
			 * 因为系统默认存储编码是gbk,每个汉字两个字节,
			 * 所以len=18,若存储编码为utf-8,则len=30,
			 * 因为utf-8中一个汉字对应的字节长度为1~4个字节不等,
			 * 但大多数是3个字节
			 */
			System.out.println("len="+len);
			for(int i=0;i<len;i++){  
				System.out.print(buf[i]+" "); //输出每个字节对应的ASCII码
			}
		} catch (IOException e){
			e.printStackTrace();
		}
	}
}