学习导航
第二节:IO流之字节流http://blog.csdn.net/bobo8945510/article/details/52958491
IO流之基础讲解
一、什么是IO流?
二、字节流和字符流的区别?
三、IO流的分叉图!
四、字符流InputStreamReader和OutputStreamWriter!
一。InputStreamReader 是字符流Reader的子类,是字节流通向字符流的桥梁。你可以在构造器重指定编码的方式,如
果不指定的话将采用底层操作系统的默认编码方式,例如 GBK 等1、要启用从字节到字符的有效转换,可以提前从底层流读取更多的字节,使其超过满足当前读取操作所需的字节。
2、为了达到最高效率,可要考虑在 BufferedReader 内包装 InputStreamReader。例如:
3、BufferedReader in = new BufferedReader(new InputStreamReader(System.in));二。OutputStreamWriter 是字符流Writer的子类,是字符流通向字节流的桥梁。
1、每次调用 write() 方法都会导致在给定字符(或字符集)上调用编码转换器。在写入底层输出流之前,得到的这些字节将在缓冲区中累积
2、为了获得最高效率,可考虑将 OutputStreamWriter 包装到 BufferedWriter 中,以避免频繁调用转换器。例如:
3、BufferedWriter out = new BufferedWriter(new OutputStreamWriter(System.out));
四—1:字符流之:使用InputStreamReader读取一个txt文档到控制台
前提你创建好了这个文档
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class TextRWByteStream04 {
/*
* 使用字符流,读取一个txt文档到控制台
* */
public static void main(String[] args) {
try {
//指定我次路径的一个txt文档
File file = new File("d://data//newhello.txt");
FileInputStream fin = new FileInputStream(file);
//我们需要把子节流转换为字符流
InputStreamReader ird = new InputStreamReader(fin,"gbk");
//创建一个数组,注意,字符数组用的是char存放每次读取的字节
char input[] = new char[200];
//有时候当你剩余字节,不足100的时候,如果不定义偏移量,在读取文件的时候就容易多出
int num = 0;
while ((num = ird.read(input))!=-1) {
//这样就能表示,数组中有多少读取多少。而不会当【200】不满的时候用空字符代替
System.out.println(new String(input,0,num));
}
System.out.println("读取完毕");
ird.close();
fin.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
运行结果
四—2: 字符流之:使用字符流复制文件(InputStreamReader和InputStreamReader)
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
public class TextRWByteStream05 {
/*
* 使用字符流,读取一个txt文档到控制台并复制一份新的txt文档,
* */
public static void main(String[] args) {
try {
//创建一个字符流,指定我次路径的一个txt文档
FileInputStream fin = new FileInputStream(new File("d://data//newhello.txt"));
FileOutputStream outf= new FileOutputStream("d://data//newhello_two.txt");
//我们需要把子节流转换为字符流
InputStreamReader ird = new InputStreamReader(fin,"GBK");
//字符流通向字节流的桥梁。
OutputStreamWriter iwd = new OutputStreamWriter(outf,"GBK");
//创建一个数组,注意,字符数组用的是char存放每次读取的字节
char input[] = new char[200];
//有时候当你剩余字节,不足100的时候,如果不定义偏移量,在读取文件的时候就容易多出
int num = 0;
while ((num = ird.read(input))!=-1) {
//这样就能表示,数组中有多少读取多少。而不会当【200】不满的时候用空字符代替
System.out.println(new String(input,0,num));
iwd.write(input,0,num);
}
System.out.println("复制完毕");
iwd.close();
outf.close();
ird.close();
fin.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
运行结果:
四—3: 字符流之:使用字符流复制文件带缓存(InputStreamReader和InputStreamReader)
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
public class TextRWByteStream06 {
/*
* 使用带缓冲的字符流,读取一个txt文档并复制到一个新的txt文档
* */
public static void main(String[] args) {
try {
//创建一个字符流,指定我次路径的一个txt文档
FileInputStream fin = new FileInputStream(new File("d://data//newhello.txt"));
FileOutputStream outf= new FileOutputStream("d://data//newhello_two.txt");
//InputStreamReader 是字符流Reader的子类,是字节流通向字符流的桥梁。
InputStreamReader ird = new InputStreamReader(fin,"GBK");
//OutputStreamWriter 是字符流Writer的子类,是字符流通向字节流的桥梁。
OutputStreamWriter iwd = new OutputStreamWriter(outf,"GBK");
//用BufferedReader 和 BufferedWriter 可以提高读写的效率
//但是有一个弊端,就是写入到新txt文件的时候,他不会自动换行。所以这里大多建议使用
BufferedReader bfd = new BufferedReader(ird);
BufferedWriter bw = new BufferedWriter(iwd);
String value = "";
while ((value =bfd.readLine())!=null) {
System.out.println(value);
//添加“\r\n”才可以换行
bw.write(value);
}
System.out.println("复制完毕");
bfd.close();
bw.close();
iwd.close();
outf.close();
ird.close();
fin.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
结果也是复制成功,下面我没有添加“\r\n”,所以没有换行
四—4: 字符流之:打印流PrintWriter 好处,就是可以更简便的处理缓存区的内容
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
public class TextRWByteStream07 {
/*
* 使用带缓冲的字符流,读取一个txt文档并复制到一个新的txt文档
* //用BufferedReader 和 BufferedWriter 可以有效的提高读写的效率
*
* 但是BufferedWriter有一个弊端,就是写入到新txt文件的时候,他不会自动换行。!
* 所以这里大多建议这里使用打印流,所以这里大多建议这里使用打印流,PrintWriter
* */
public static void main(String[] args) {
try {
//创建一个字符流,指定我次路径的一个txt文档
FileInputStream fin = new FileInputStream(new File("d://data//newhello.txt"));
FileOutputStream outf= new FileOutputStream("d://data//newhello_two.txt");
InputStreamReader ird = new InputStreamReader(fin,"GBK");
OutputStreamWriter iwd = new OutputStreamWriter(outf,"GBK");
BufferedReader bfd = new BufferedReader(ird);
// BufferedWriter bw = new BufferedWriter(iwd);
//这里大多建议这里使用打印流,因为他比BufferedWriter 更有用些,
//后面跟一个true表示,当缓存区没有填满数据是,不调用true,剩下的数据就会被遗漏。造成复制内容不全。
PrintWriter pw = new PrintWriter(iwd,true);
String value ;
while ((value =bfd.readLine())!=null) {
System.out.println(value);
// bw.write(value);
pw.write(value+"\r\n");
}
System.out.println("复制完毕");
pw.close();
bfd.close();
// bw.flush();
// bw.close();
iwd.close();
outf.close();
ird.close();
fin.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
运行结果:成功
五、FileReader与FileWriter纯文本操作,直接操作文件数据流,并包装为缓冲流进行文件拷贝
如果在进行文本操作的时候,有乱码出现。请查看自己的eclipse编码配置,或者留言给我
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
public class TextRWByteStream08 {
/*
* 如果是纯文本操作,我们一般会用到FileReader与FileWriter
* 他们的好处就是,相对于使用字节流或字符流。更简单
* */
public static void main(String[] args) {
try {
FileReader fReader = new FileReader("d://data//newhello.txt");
BufferedReader bf = new BufferedReader(fReader);
FileWriter fWriter =new FileWriter("d://data//newhello_two.txt");
BufferedWriter bw = new BufferedWriter(fWriter);
String ling ;
while ((ling = bf.readLine())!=null) {
System.out.println(ling);
bw.write(ling+"\r\n");
}
System.out.println("写入完毕");
bw.flush();
bw.close();
bf.close();
fWriter.close();
fReader.close();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
运行结果:成功
demo地址:http://download.csdn.net/detail/bobo8945510/9667082
作者:bobo8945510 发表于2016/10/28 17:05:25 原文链接
阅读:23 评论:0 查看评论