JAVA IO流
简介:基于流的JAVA IO是同步的,也就是BIO,这意味着:程序在请求一个流来读写一段数据的时候,需要等待读写运行完之后
才能进行其他操作。
1.按数据方向区分流主要分为两类:
输入流(InputStream\Reader)用于读数据,所有的输入流都使用一些共同的基本方法来读数据,不同的输入流用于读不同的数据源,例如FileInputStream
输出流(OutputStream\Writer)用于写数据,不同的输出流用于将数据写入不同的目的,所有的输出流都使用一些共同的基本方法来写数据,例如FileOutputStream
实例:FileInputStream和FileOutputStream配合使用达到复制文件的效果即:用FileInputStream将一个文件的内容读出来再用FileOutputStream写到另一个文件里去:
package cn.cauc.guowei;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class FileToFile {
public static void main(String[] args) throws Exception{
try(FileInputStream fis=new FileInputStream(new File("aaa.txt"));
FileOutputStream fos=new FileOutputStream(new File("bbb.txt")))
{
int a;
byte[] buff=new byte[1024];
while((a=fis.read(buff))!=-1)
{
fos.write(buff);
fos.flush();
}
}
}
}
需要注意的是fis调用的read(byte[])方法 其返回值为int ,当流没有结束也就是没有读完的时候其返回值是读入的byte个数,否则返回的是-1,这也标志读完了。flush方法是清空缓存的,一般的输出流我们输出之后最好flush一下,不然有可能会因为数据没有及时的写出缓冲区,从而造成数据丢失。
2.按操作对象区分主要分为两类:
字符流:
•Reader:字符输入流的基类
•Writer:字符输出流的基类
•InputStreamReader:以指定的编码方式将底层的字节输入流转换为字符输入流
Reader reader = new InputStreamReader(new FileInputStream("filename.txt"), "GBK");
•OutputStreamWriter:以指定的编码方式将底层的字节输出流转换为字符输出流
Writer writer = new OutputStreamWriter(new FileOutputStream("filename.txt"), "GBK");
实例:将键盘输入(System.in)的数据写到文件里去(因为键盘的输入都是纯文本 所以我们使用字符输入流来封装键盘输入)
然后写到文件的时候也是用字符输出流来输出:(下面例子用的是带Buffered的流可以加快速度)
package pre.guowei;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.InputStreamReader;
/**
* 将键盘输入写入文件
* @author 22116
*
*/
public class InToFile {
public static void main(String[] args) throws Exception{
try(BufferedReader bfr=new BufferedReader(new InputStreamReader(System.in));
//System是字节流输入 先封装成字符输入流(因为键盘输入都是纯文本) 然后再封装成缓冲流加快速的
BufferedWriter bfw=new BufferedWriter(new FileWriter("a.txt"))
//字符的文件输出流 然后封装缓冲输出
)
{
String line=null;
while(!(line=bfr.readLine()).equals("endup"))
{
bfw.write(line);
}
}
}
}
字节流:
InputStream和OutputStream:其特点是每次的数据操作是以字节或字节数组为单位。就像上面的第一个例子文件输入输出流一样。
最后再介绍一对流:
Scanner 和 PrintWrite 这两者搭配使用,处理字符串 文本很方便,很适用数据处理
package cn.cauc.guowei;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.io.Reader;
import java.io.Writer;
import java.util.Scanner;
public class FileToFilescharStream {
public static void main(String[] args) throws Exception{
try(
Scanner scanner=new Scanner(new File("bbb.txt"),"UTF-8");
PrintWriter printWriter=new PrintWriter(new File("ccc.txt"),"UTF-8")
)
{
String line=null;
while(scanner.hasNextLine())
{
line=scanner.nextLine();
//对字符串进行处理
printWriter.println(line);
}
}
}
}