【Java基础】IO流(1) —— 简介
【Java基础】IO流(2) —— 字符流
【Java基础】IO流(3) —— 字节流
【Java基础】IO流(4) —— 转换流、打印流
【Java基础】IO流(5) —— 序列流、内存流
【Java基础】IO流(6) —— 随机访问文件流、数据流
字符流
文件流
文件输出流
FileWriter
write(String str)
文件输入流
FileReader
从文本文件中读取数据:因为是文本文件所以使用字符流,又因为是读取,所以使用字符读取流
因为是文件,所以使用Reader的子类FileReader
int read( ) 一次读一个字符
int read(char [] arr) 返回的是读取的字符的个数
复制文件
import java.io.*; class Demo9{public static void main(String[] args){FileWriter fw=null;FileReader fr=null;try{fr=new FileReader("Demo3.java");fw=new FileWriter("Demo3_copy.java");char[] arr=new char[1024];int num;while((num=fr.read(arr))!=-1){fw.write(arr,0,num);}}catch (IOException e){e.printStackTrace();}finally{if (fr!=null)try{fr.close();}catch (IOException e){e.printStackTrace();}if (fw!=null)try{fw.close();}catch (IOException e){e.printStackTrace();}}System.out.println("Hello World!");} }
字符缓冲流
是为了提高读或写的效率,缓冲流本身不具备读或写的功能,使用缓冲流必须结合读流或写流使用。
BufferedReader(Reader r):字符缓冲输入流
BufferedWriter(Writer w):字符缓冲输出流
字符缓冲输出流
newLine() 跨平台的写入换行符
//使用字符缓冲输出流向文本文件中输出数据
//1. 创建文件输出流对象和文件向关联
FileWriter fw=new FileWriter("tt.txt");
//2. 为了提高输出效率,使用字符缓冲输出流
//把需要提高效率的输出流对象作为参数传递给
BufferedWriter bw=new BufferedWriter(fw);
for (int i=1;i<=3;i++)
{bw.write("abc"+i);bw.newLine();bw.flush();
}
bw.close();//关闭缓冲流其实就是关闭写入流
字符缓冲输入流
readLine() 一次读一行,返回的一行不包括换行符
//使用字符缓冲输入流实现读取文本文件
//1. 创建文件读取流对象和文件相关联
FileReader fr=new FileReader("tt.txt");
//2.为了提高读的效率,把文件读取流对象作为参数传递给BufferedReader
BufferedReader br=new BufferedReader(fr);
String line=null;
while ((lin=br.readLine())!=null){System.out.println(line);
}
br.close();
行号LineNumberReader
FileReader fr=new FileReader("tmp.txt");
LineNumberReader bnr =new LineNumberReader(fr);
String line=null;
while((line=bnr.readLine())!=null){System.out.println(bnr.getLineNumber()+":"+line);
}
bnr.close();
模拟
模拟BufferedReader,自定义一个MyBufferedReader
提高效率,提供一个缓冲区
class MyBufferedReader{private char[] arr=new char[1024]; //缓冲区private int index; //记录缓冲区使用的下标private int count; //记录缓冲区中字符的个数private Reader r; //具备读功能的流MyBufferedReader(Reader r){this.r=r;}//一次读一个字符的功能public int myRead()throws IOException{//判断缓冲区中是否有字符if(count==0){//读取一批count = r.read(arr);index=0;}if(count<0)return -1;int num = arr[index];index++;count--;return num;}//一次读一行的功能public String myReadLine()throws IOException{//反复调用一次读一个字符的功能,当够一行时返回StringBuilder sb=new StringBuilder();int num;while((num=myRead())!=-1){if(num=='\r')continue;else if(num=='\n')return sb.toString();elsesb.append((char)num);}return null;}public void myClose()throws IOException {r.close();}
}class Demo1 {public static void main(String[] args) throws IOException{FileReader fr=new FileReader("tmp.txt");MyBufferedReader mbr=new MyBufferedReader(fr);String line=null;while((line=mbr.myReadLine())!=null){System.out.println(line);}mbr.myClose();}
}