按照不同分类,大致可以分为输入流,输出流;字节流,字符流;包装流,基本流。
其中输入流大致可以看做InputStream,基本方法为read(),read(byte []),read(byte [],int off ,int len).
需要特别注意:read()返回下一个数据字节;如果到达流的末尾,则返回 -1。
read(byte [])返回读入缓冲区的总字节数;如果因为已经到达流末尾而不再有数据可用,则返回 -1。
read(byte [],int ,int)返回读入缓冲区的总字节数;如果因为已到达流末尾而不再有数据可用,则返回 -1。
off - 数组 b 中将写入数据的初始偏移量。len - 要读取的最大字节数。
输出流大致可以看做OutputStream ,基本方法为write(int b), write(byte [] b) , write(byte []b,int off ,int len).注意当使用输出流时最好flash,以免数据未输出成功。
字节流:以字节为单位进行输入输出,有FileInputStream(用于传输文件);ObjectInputStrea(用于序列化或反序列化对象),;PipedInputStream(管道流,多用于线程中,并相互连接);ByteArrayInputStream(使用字节数组传输)DataInputStream(使用基本数据类型传输);BufferedInputStream(缓冲流,缓冲区默认为4K)。输出流与之类似。
字节流每次传输只传输低八位,其中DataInputStream的底层实现为下:
对象序列化时可以加transient关键字来使属性透明化,不序列化该属性。
out.write((v >>> 24) & 0xFF); //分4次传输32位,每次8位
out.write((v >>> 16) & 0xFF);
out.write((v >>> 8) & 0xFF);
out.write((v >>> 0) & 0xFF);
字符流:以字符为单位进行传输,有PIpedReader(管道流);BufferedReader(缓冲流,可以逐行读取);CharArrayStream(字节数组流);StringReader(字符串流);FileReader(文件流)。InputStreamReader(是一种转化流,可以将字节流转化为字符流传输);PreintWriter(可以整行输入)
另外有RandomAcessFile可以来输入输出。父类为Object,不属于输入输出流,也不是字节字符流。
但是可以直接输入输出,可字节,可字符。
// txt默认UTF-8读取
//而randomacessfile则是iso-8859-1
//控制台则是虚拟机设置的编码,默认是GBK,但已改为UTF-8
// 所以乱码
RandomAccessFile in =new RandomAccessFile("src/笔记.txt", "r");
String str =null;
while((str=in.readLine())!=null){
//getBytes转化时会默认使用UTF-8编码,把读取的字符转化为UTF-8的数组字节
//必须要使用ISO-8859-1编码,把读取的ISO-8859-1字符转化为原始的字节数据
//然后在将原始的字节数据转化为UTF-8。这样才能正确输出本来UTF-8的字符。
String str_utf =new String(str.getBytes("ISO-8859-1"),"UTF-8");
System.out.println(str_utf);
}
in.close();
另有一种特殊文件格式为properties。可以直接读取到map中。文件内格式为key=value形式。
` Properties p=new Properties();
p.put(2, 4);
p.load(new FileInputStream(“src/abc.properties”));
Set keys=p.keySet();
for(Object o:keys){
System.out.println(o+":"+p.get(o));
}`