Java的IO流
概念
- IO流:数据从外部介质(磁盘、键盘)输入到内存为输入流,反之为输出流。
- 文件的存储方式:所有的文件在硬盘或在传输时都是以字节的方式进行的,字符是只有在内存中才会形成。读取字节流后,不直接操作,而是查询指定编码表,就可以转化为字节流(如文字)。
- Java的字节流和字符流
- 字节流:按字节处理,直接操作文件本身,主要用于处理二进制数据、视频、图片、文件等。
- 字符流:按虚拟机的encode来处理,要进行字符集转化。主要用来处理文本。
- 父类:InputStream、OutputStream是所有字节IO流的祖先,Reader、Writer是所有字符IO流的祖先。他们r都是抽象类,写代码不能能直接new,需要使用多态方式转化。
- 字节流和字符流的区别:字节流不使用缓冲区
操作举例
字节流举例
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"); // 声明File对象
//通过子类实例化父类对象
OutputStream out = null;
out = new FileOutputStream(f); //多态实例化
String str = "Hello World!!!";
byte b[] = str.getBytes();
out.write(b);
out.close(); //因为字节流不用缓冲区,所以即使不关闭流,也会输出结果
}
}
字符流举例
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();//只有关闭字符流或者使用out.flush()强制清空缓冲区,才会输出结果
}
相互转化
从字节流转化为字符流时,实际上就是byte[]转化为String
String(byte bytes[], String charsetName)
字符流转化为字节流时,实际上是String转化为byte[]
byte[] String.getBytes(String charsetName)