IO流
字符流。因为文件编码的不同,而有了对字符进行高效操作的字符流对象
原理:基于字节流读取字节时,去查了指定的码表
字节流和字符流的区别
字节流读取的时候,读到一个字节就返回一个字节。字符流使用了字节流读到一个或多个
字节(中文对应的字节数是两个,UTF-8码表是3个字节)时,先去查指定的
编码表,将查到的字符返回
字节流可以处理所有类型数据,如图片,mp3.而字符流只能处理字符数据
处理纯文本数据,优先考虑使用字符流
类Reader-InputStreamReader-FileReader
类Writer-OutputStreamWriter-FileWriter
Writer常见方法:writer(ch)将一个字符写到流中,writer(char[]),writer(String)
flush()刷新流:将流中的数据刷新到目的地中,流还存在 close()
指定绝对路径两种方式
new FileWriter("c:\\demo.txt");
new FileWriter("c:/demo.txt");
对应的对象:BufferedWriter :newLine()换行符
BufferedReader:readLine()一次读一行
缓冲的存在是为了增强流的功能而存在
缓冲内部就是在使用流对象的方法,只不过加入了数组对数据进行临时存储
目的在于提高操作数据的效率
readLine()原理:
用的还是与缓冲区关联的流对象的read方法。在每读到一个字符的时候,先不
字节流
抽象基类:InputStream,OutputStream
字节流可以操作任何数据
字节流的read方法读取一个字节
InputStreamReader字节到字符
OutputStreamWriter字符到字节
流包括字符流,字节流。字符流包括Reader,Writer。
字节流包括InputStream,OutputStream
字符流。因为文件编码的不同,而有了对字符进行高效操作的字符流对象
原理:基于字节流读取字节时,去查了指定的码表
字节流和字符流的区别
字节流读取的时候,读到一个字节就返回一个字节。字符流使用了字节流读到一个或多个
字节(中文对应的字节数是两个,UTF-8码表是3个字节)时,先去查指定的
编码表,将查到的字符返回
字节流可以处理所有类型数据,如图片,mp3.而字符流只能处理字符数据
处理纯文本数据,优先考虑使用字符流
类Reader-InputStreamReader-FileReader
类Writer-OutputStreamWriter-FileWriter
Reader常见方法 read(),read(char[]),
close()读取字符用的是window系统功能,使用完毕要进行资源的释放
Writer常见方法:writer(ch)将一个字符写到流中,writer(char[]),writer(String)
flush()刷新流:将流中的数据刷新到目的地中,流还存在 close()
FileWriter该类没有特有的方法只有自己的构造函数。
特点: 用于处理文本文件,该类中有默认的编码表。该类中有临时缓冲
可能抛出IOException或其子类指定绝对路径两种方式
new FileWriter("c:\\demo.txt");
new FileWriter("c:/demo.txt");
public static void main(String[] args) {
FileReader reader=null;
try{
reader=new FileReader("c:/demo.txt");
char [] buffer=new char[1024];
int len=0;
while((len=reader.read(buffer))!=-1){
System.out.println(new String(buffer,0,len));
}
}catch(IOException ex){
ex.printStackTrace();
}finally{
try {
reader.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
字符流的缓冲区
缓冲区的出现提高了对流的操作效率
原理:就是将数组进行封装对应的对象:BufferedWriter :newLine()换行符
BufferedReader:readLine()一次读一行
缓冲的存在是为了增强流的功能而存在
缓冲内部就是在使用流对象的方法,只不过加入了数组对数据进行临时存储
目的在于提高操作数据的效率
public static void main(String[] args) throws IOException {
BufferedWriter bw=new BufferedWriter(new FileWriter("c:/demo.txt"));
bw.write("hello world");//将数据写入缓冲区
bw.flush();//刷新数据流,写入目的地
bw.close();//释放
}
public static void main(String[] args) throws IOException {
BufferedReader br=new BufferedReader(new FileReader("c:/demo.txt"));
String line=null;
while((line=br.readLine())!=null){
System.out.println(line);
}
br.close();
}
readLine()原理:
用的还是与缓冲区关联的流对象的read方法。在每读到一个字符的时候,先不
进行具体操作,先进行临时存储。在回车标记时,将临时容器中存储的数据一次性返回。
自定义一个缓存读取
import java.io.IOException;
import java.io.Reader;
public class MyBufferedReader {
private Reader r;
public MyBufferedReader(Reader r) {
this.r = r;
}
public String myReadLine() throws IOException {
StringBuilder sb = new StringBuilder();
int ch = 0;
while ((ch = r.read()) != -1) {
if (ch == '\r')
continue;
if (ch == '\n')
return sb.toString();
else
sb.append((char) ch);
}
if (sb.length() != 0) {
return sb.toString();
}
return null;
}
public void myClose() throws IOException {
r.close();
}
}
public class Test {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) throws IOException {
Reader r=new FileReader("c:/demo.txt");
MyBufferedReader br=new MyBufferedReader(r);
String line=null;
while((line=br.myReadLine())!=null){
System.out.println(line);
}
br.myClose();
}
}
字节流
抽象基类:InputStream,OutputStream
字节流可以操作任何数据
字节流的read方法读取一个字节
InputStreamReader字节到字符
OutputStreamWriter字符到字节