范例1:使用字节流不关闭执行
package org.lxh.demo12.byteiodemo;
import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
public class OutputStreamDemo05 {
public static void main(String[] args) throws Exception {
File f = new File("d:" + File.separator + "test.txt");
OutputStream out = null;
out = new FileOutputStream(f);
String str = "Hello World!!!";
byte b[] = str.getBytes();
out.write(b);
//out.close();
}
}
程序运行结果:Hello World!!!
范例2:使用字符流不关闭执行
package org.lxh.demo12.chariodemo;
import java.io.File;
import java.io.FileWriter;
import java.io.Writer;
public class WriterDemo03 {
public static void main(String[] args) throws Exception {
File f = new File("d:" + File.separator + "test.txt");
Writer out = null;
out = new FileWriter(f);
String str = "Hello World!!!";
out.write(str);
// out.close();
}
}
程序运行结果:
结论:字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作文件。
什么叫做缓冲区???
首先可以简单的把缓冲区理解为一段特殊的内存。某些情况下,如果一个程序频繁的操作一个资源(如文件或数据库),则性能会很低,此时为了提升性能,就可以将一部分数据暂时读入到内存的一块区域之中,以后直接从此区域中读取数据即可,因为读取内存速度会比较快,这样可以提升程序的性能。
在字符流的操作中,所有的字符都是在内存中形成的,在输出前会将所有的内容暂时保存在内存之中,所以使用了缓冲区暂存数据。
如果不想关闭时也可以将字符流的内容全部输出,则可以使用Writer类中的flush()方法完成。
使用字节流好还是字符流好???
所有的文件在硬盘或在传输时都是以字节的方式进行的,包括图片等都是按字节的方式存储的,而字符是只有在内存中才会形成,所以在开发中,字节流使用较为广泛。
流分类:
1.Java的字节流:InputStream是所有字节输入流的祖先,而OutputStream是所有字节输出流的祖先。
2.Java的字符流:Reader是所有读取字符串输入流的祖先,而writer是所有输出字符串的祖先。
注意:InputStream,OutputStream,Reader,Writer都是抽象类,所以不能直接new。
字节流是最基本的,所有的InputStream和OutputStream的子类都是,主要用在处理二进制数据,它是按字节来处理的。但实际中很多的数据是文本,又提出了字符流的概念,它是按虚拟机的encode来处理,也就是要进行字符集的转化。
这两个之间通过 InputStreamReader,OutputStreamWriter来关联,实际上是通过byte[]和String来关联。
在实际开发中出现的汉字问题实际上都是在字符流和字节流之间转化不统一而造成的。
在从字节流转化为字符流时,实际上就是byte[]转化为String时,public String(byte bytes[], String charsetName)有一个关键的参数字符集编码,通常我们都省略了,那系统就用操作系统的lang。而在字符流转化为字节流时,实际上是String转化为byte[]时,byte[]String.getBytes(String charsetName)也是一样的道理至于java.io中还出现了许多其他的流,按主要是为了提高性能和使用方便,如BufferedInputStream,PipedInputStream等。