DataOutputStream dos = new DataOutputStream(new BufferedOutputStream(new FileOutputStream("a.txt"))); dos.writeInt(5); dos.writeBoolean(true); dos.flush(); dos.close(); DataInputStream dis = new DataInputStream(new BufferedInputStream(new FileInputStream("a.txt"))); System.out.println(dis.readInt()); System.out.println(dis.readBoolean()); dis.close(); //学习怎样关闭流 BufferedReader br = null; InputStreamReader in = null; try { in = new InputStreamReader(FileStreamTest.class.getResourceAsStream("a.txt"), "UTF-8"); br = new BufferedReader(in); //按行进行读 br.readLine() } catch (Exception e) { e.printStackTrace(); } finally{ if (br != null) { try { br.close(); //为什么in.close()没写入进去,防止br.close()抛出异常,in.close()得不到关闭。 } catch (Exception e) { e.printStackTrace(); } } if (in !=null){ try { in.close(); } catch (Exception e) { e.printStackTrace(); } } } }
Java全部的流类位于java.io包中,都分别继承字下面四种抽象流类型。
字节流 | 字符流 | |
输入流 | InputStream | Reader |
输出流 | OutputStream | Writer |
1.继承自InputStream/OutputStream的流都是用于向程序中输入/输出数据。且数据的单位都是字节(byte=8bit),如图。深色的为节点流,浅色的为处理流。
2.继承自Reader/Writer的流都是用于向程序中输入/输出数据,且数据的单位都是字符(2byte=16bit),如图。深色的为节点流。浅色的为处理流。
节点流类型常见的有:
对文件操作的字符流有FileReader/FileWriter,字节流有FileInputStream/FileOutputStream。
处理流类型常见的有:
缓冲流:缓冲流要“套接”在对应的节点流之上,对读写的数据提供了缓冲的功能,提高了读写效率,同事添加了一些新的方法。
字节缓冲流有BufferedInputStream/BufferedOutputStream,字符缓冲流有BufferedReader/BufferedWriter,字符缓冲流分别提供了读取和写入一行的方法ReadLine和NewLine方法。
对于输出地缓冲流,写出的数据,会先写入到内存中。再使用flush方法将内存中的数据刷到硬盘。
所以。在使用字符缓冲流的时候,一定要先flush,然后再close,避免数据丢失。
转换流:用于字节数据到字符数据之间的转换。
仅有字符流InputStreamReader/OutputStreamWriter。当中,InputStreamReader须要与InputStream“套接”。OutputStreamWriter须要与OutputStream“套接”。
数据流:提供了读写Java中的基本数据类型的功能。
DataInputStream和DataOutputStream分别继承自InputStream和OutputStream,须要“套接”在InputStream和OutputStream类型的节点流之上。
对象流:用于直接将对象写入写出。
流类有ObjectInputStream和ObjectOutputStream,要求写出的对象必须实现Serializable接口,来声明其是能够序列化的。否则,不能用对象流读写。
另一个keyword比較重要,transient。修饰实现了Serializable接口的类内的属性,在以对象流的方式输出的时候,该字段会被忽略。