JAVA之io流
一、概念:
1、字节流和字符流:
一次处理一个字节byte的,叫字节流;一次处理一个字符char的,叫字符流。
- 在处理中文的时候,经常会用到字符流。
- 字符流在使用时会有编码问题。
- 字节流和字符流可以相互转换,有专门的通道,编码就是在通道中完成的。
2、节点流和过滤流:
原始流的开始或结束的地方,叫节点流;提供对流进行功能扩充的流,叫过滤流,比如:文件的压缩、加密、解密等。
3、缓冲流:
buffer。可以解决字节流读取速度慢的问题,可以一字节一字节的读入到缓冲流中,再一次性写出到磁盘。
4、输入流是读,输出流是写。
- 读和写是针对于内存来说的,从磁盘读入到内存,是输入;从内存写入到磁盘,是输入出。
- 对应于字符流的是抽象类Reader和Writer。
- 对应于字节流的是抽象类InputStream和OutputStream
二、应用:
1、字节流的应用:配置文件的处理。
输出流使用.write()方法写出,输入流使用.read()方法读入。
输出流使用.flush()方法将内容刷入到磁盘里,目前java的.close()方法中自带有flush()方法,因此.flush()方法不写也可以。
- 输出流FileOutputStream:如果文件不存在,会自动创建;
- 输入流FileInputStream:如果文件不存在,不会创建。
import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; public class StreamDemo { public static void main(String[] args) throws Exception { FileOutputStream fos = new FileOutputStream("b.txt"); fos.write(1); fos.flush(); //用于将内容刷入到磁盘里 fos.close(); //java的close()自带flush(),不写flush()也可以。 FileInputStream fis = new FileInputStream("b.txt"); int x = fis.read(); //.read()是一个字节一个字节的读 System.out.println(x); //由于字节流读入的都是二进制字节,不会显示成数字或字母,而是乱码
} }
2、字符流的应用:
import java.io.*; public class CharStreamDemo { public static void main(String[] args) throws IOException { PrintWriter out = new PrintWriter("test1.txt"); out.println("大家好"); out.println("haha"); out.close(); // BufferedReader是PrintWriter的初级版 PrintWriter out2 = new PrintWriter("test1.txt"); out2.println("你也好"); out2.println("hi"); out2.close(); } } //使用这种方式写的文件,文件内容会覆盖,最终只会留下 "你也好""hi"
3、字符流与字节流结合使用:
使用字符流与字节流结合的方式,解决两个问题:1、可以设置编码类型 2、可以对文件内容进行追加写,而不会覆盖。
import java.io.*; public class CharStreamDemo { public static void main(String[] args) throws IOException { PrintWriter out3 = new PrintWriter( new OutputStreamWriter( //OutputStreamWriter是字节流和字符流中间的通道 new FileOutputStream("test1.txt",true), //true为是否追加 "utf-8")); //这里设置编码类型 out3.println("都好"); out3.close();
使用.readLine()方法,可以一行一行读入。
import java.io.*; public class CharStreamDemo { public static void main(String[] args) throws IOException { BufferedReader in = new BufferedReader( new InputStreamReader( //InputStreamReader是字符流和字节流的通道 new FileInputStream("test1.txt"))); String str = in.readLine(); //一行一行读 System.out.println(str); System.out.println("==================="); //全部读取 String str1 = null; while ((str1 = in.readLine())!=null){ //这样写的好处是避免二次读入占用内存 System.out.println(str1); } in.close(); } } //结果: // 你也好 // =================== // hi // 都好
每天进步一点点,快乐生活多一点。