黑马程序员 io中的字符流(毕向东)

来源:互联网 发布:苹果cms整合ck教程 编辑:程序博客网 时间:2024/06/05 19:11
字符流中有缓冲区,采用缓冲区的方式读取,比读一个输出一个读取的方式好。

1.    按照内容分为字节流和字符流

2.   //换行,不同的系统调用不同的换行符--通用。windows=\r\n  unix=\n

privatestatic final String LINE_SEPARATOR = System.getProperty("line.separator");通用

3.    fw.write("abcde"+LINE_SEPARATOR+"hahaha");换行输出

//需求:读取一个文本文件。将读取到的字符打印到控制台.public class FileReaderDemo2 {/** * @param args * @throws IOException  */public static void main(String[] args) throws IOException {FileReader fr = new FileReader("demo.txt");/* * 使用read(char[])读取文本文件数据。 *   * 先创建字符数组。 */char[] buf = new char[1024];int len = 0;while((len=fr.read(buf))!=-1){System.out.println(new String(buf,0,len));}/*int num = fr.read(buf);//将读取到的字符存储到数组中。System.out.println(num+":"+new String(buf,0,num));int num1 = fr.read(buf);//将读取到的字符存储到数组中。System.out.println(num1+":"+new String(buf,0,num1));int num2 = fr.read(buf);//将读取到的字符存储到数组中。System.out.println(num2+":"+new String(buf));*/fr.close();}}



2.不如上面的代码好,不建议,效率低

//需求:读取一个文本文件。将读取到的字符打印到控制台.public class FileReaderDemo {/** * @param args * @throws IOException  */public static void main(String[] args) throws IOException {//1,创建读取字符数据的流对象。/* * 在创建读取流对象时,必须要明确被读取的文件。一定要确定该文件是存在的。  *  * 用一个读取流关联一个已存在文件。  */FileReader fr = new FileReader("demo.txt");int ch = 0;while((ch=fr.read())!=-1){System.out.println((char)ch);}/*//用Reader中的read方法读取字符。int ch = fr.read();System.out.println((char)ch);int ch1 = fr.read();System.out.println(ch1);int ch2 = fr.read();System.out.println(ch2);*/fr.close();}}

3.复制文件

/* * 需求:作业:将c盘的一个文本文件复制到d盘。 *  * 思路: * 1,需要读取源, * 2,将读到的源数据写入到目的地。 * 3,既然是操作文本数据,使用字符流。  *  */public class CopyTextTest {/** * @param args * @throws IOException  */public static void main(String[] args) throws IOException {//1,读取一个已有的文本文件,使用字符读取流和文件相关联。FileReader fr = new FileReader("IO流_2.txt");//2,创建一个目的,用于存储读到数据。FileWriter fw = new FileWriter("copytext_1.txt");//3,频繁的读写操作。int ch = 0;while((ch=fr.read())!=-1){fw.write(ch);}//4,关闭流资源。 fw.close();fr.close();}}


4.复制文件第二种方式,比上面的效率高

public class CopyTextTest_2 {private static final int BUFFER_SIZE = 1024;/** * @param args */public static void main(String[] args) {FileReader fr = null;FileWriter fw = null;try {fr = new FileReader("IO流_2.txt");fw = new FileWriter("copytest_2.txt");//创建一个临时容器,用于缓存读取到的字符。char[] buf = new char[BUFFER_SIZE];//这就是缓冲区。 //定义一个变量记录读取到的字符数,(其实就是往数组里装的字符个数 )int len = 0;while((len=fr.read(buf))!=-1){fw.write(buf, 0, len);}} catch (Exception e) {//System.out.println("读写失败");throw new RuntimeException("读写失败");}finally{if(fw!=null)try {fw.close();} catch (IOException e) {e.printStackTrace();}if(fr!=null)try {fr.close();} catch (IOException e) {e.printStackTrace();}}}}

5.输入流和输出流相对于内存设备而言.


将外设中的数据读取到内存中:输入
将内存的数写入到外设中:输出。




字符流的由来:
其实就是:字节流读取文字字节数据后,不直接操作而是先查指定的编码表。获取对应的文字。
在对这个文字进行操作。简单说:字节流+编码表 


---------------------------------------


字节流的两个顶层父类:
1,InputStream  2,OutputStream.


字符流的两个顶层父类:
1,Reader 2,Writer


这些体系的子类都以父类名作为后缀。 
而且子类名的前缀就是该对象的功能。

就从熟悉的文字开始字符流,


//需求:将一些文字存储到硬盘一个文件中。
记住;如果要操作文字数据,建议优先考虑字符流。
而且要将数据从内存写到硬盘上,要使用字符流中的输出流。Writer
硬盘的数据基本体现是文件。 希望找到一个可以操作文件的Writer.


找到了FileWriter


//需求:读取一个文本文件。将读取到的字符打印到控制台.
同上,找到了FileReader






7.复制文件图例






























0 0