javaIO 流学习总结
今天学习了java的流操作,流操作的类有很多,在这里总结一下最常用的和最通用的类,以便以后使用时查找。这个总结是预防以后不能得心应手的应用IO流的时候能通过这篇博客回忆起IO流的基本操作,至少能实现基本功能。
现总结如下:
一、字节流
字节流是功能最强大的流,具有最好的通用性,能传输任意格式的文件。由于字节流每次传输的数据大小是以字节为单位的,所以容易出现乱码。
1、字节输入流InputStream
1)文件字节输入流 FileInputStream
不带缓存的文件字节输入流:
private static void m4() throws IOException {
InputStream in = new FileInputStream("E:/aaa.txt");
byte [] b = new byte [4096];
in.read(b);
String str = new String(b);
System.out.println(str);
in.close();
}
文件字节流是可以带缓存的,一般带缓存的流效率更高,CPU占用率较低。并且在java中使用带缓存的输入流还有更多的方法可以被调用,所以在实际开发中一般多用带缓存的文件字节输入流。
带缓存的文件字节输入流:
<pre name="code" class="java"> private static void m2() throws IOException {
InputStream in new FileInputStream("E:/saaa.txt"); BufferedInputStream bin = new BufferedInputStream(in); byte [] b = new byte [4096]; bin.read(b); String str = new String(b); System.out.println(str); bin.close(); in.close(); }
2)对象字节输入流ObjectInputStrream
对象流又称为对象的序列化,对象字节输入流的作用是将存储在硬盘上的java对象读取出来,并保存到内存中,等同于在内存中创建一个对象的副本。这个副本与我们在代码中创建的对象不一样的地方在于这个对象中可能已经存储了一些初始化以外的信息。在java处理一些特殊任务的时候可能将一个堆中已经存在的对象保存到硬盘中。对象字节流的作用就是将存到硬盘中的对象取出来重新使用。存储对象与取对象的java代码可以不是同一个,甚至可以不再一个平台。
对象输入字节流:
private static void m2() throws IOException, Exception {
InputStream in = new FileInputStream("e:/out.tmp");
ObjectInput ois = new ObjectInputStream(in);
Stu s = (Stu) ois.readObject();
System.out.println(s.toString());
ois.close();
in.close();
}
对象字节输入流还没有发现可以带缓存,可能是我孤陋寡闻,如果有待以后补充。
2、字节输出流OutoutStream
1)文件字节输出流 FileOutputStream
文件字节输出流是将内存中的数据写入到硬盘。
文件字节输出流:
private void m3() throws IOException {
OutputStream out = new FileOutputStream("aaa.txt");
byte [] buffer = "hello world".getBytes();
out.write(buffer);
out.close();
}
带缓存的文件字节输出流:
private static void m1() throws IOException {
OutputStream out = new FileOutputStream("E:/aaa.txt");
BufferedOutputStream bout = new BufferedOutputStream(out);
byte[] b = "hello world".getBytes();
bout.write(b);
bout.close();
out.close();
}
我们看到,在文件字符流中带缓存的字节流只需要一个带缓存的流对输入输出流进行包装就可以了,在操作流的时候只需要使用带缓存的流就能完成输入输出
流的操作,并且带缓存的字节流还自己包装了一些方法。
2)对象字节输出流ObjectOutputStrream
对象字节输出流是将当前程序中已有的对象输出到文件,输出到硬盘的对象跟当前程序中的对象是一样的。这种技术可以将本程序中的对象保存到硬盘供其他程序调用,或者作为一个备份。当下次程序启动的时候可以读取这个对象,这个对象保存了上次执行时保留的结果。
对象字节输出流:
private static void m1() throws IOException {
OutputStream out = new FileOutputStream("e:/out.tmp");
ObjectOutput oot = new ObjectOutputStream(out);
oot.writeObject(new Stu(11,"mmass"));
oot.close();
out.close();
}
二、字符流
字符流的特点是每次传输的数据是两个字节,一般只用于传文本文件,效率比字节流快,不容易出现乱码。但是一般不能传输二进制文件等特殊文件。
1、字符输入流
1)不带缓存的字符输入流
字符流将文本读入到内存。
文件字符输入流:
private static void m5() throws IOException {
Reader read = new FileReader("E:/test.txt");
char[] buffer = new char[4069];
read.read(buffer);
String str = new String(buffer);
System.out.println(str);
read.close();
}
2)带缓存的字符输入流
<pre name="code" class="java">private static void m6() throws IOException {
Reader read = new FileReader("E:/test.txt");
BufferedReader br = new BufferedReader(read);
char[] buffer = new char[4069];
while(br.read(buffer) != -1){
String str = new String(buffer);
System.out.println(str);
}
br.close();
read.close();
}
2、字符输出流
1)不带缓存的字符输出流
private static void m7() throws IOException {
Writer write = new FileWriter("E:/test.txt",true);
write.write("hello");
write.close();
}
2)带缓存的字符输出流
private static void m8() throws IOException {
Writer wr = new FileWriter("E:/test.txt",true);//追加模式
BufferedWriter bwr = new BufferedWriter(wr);
bwr.write("hello");
bwr.close();
wr.close();
}
注意:
在带缓存的流中如果不关闭流,流里面的数据可能不能刷出来。可以用flush方法刷出缓冲区数据。不关闭流可能造成内存泄露。