【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();
else
sb.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();
}
}