字符流

字符流

1.字符流是什么?

   字符流是可以直接读写字符的IO流    字符流读取字符, 就要先读取到字节数据, 然后转为字符. 如果要写出字符, 需要把字符转为字节再写出. 
   

2.IO流(什么情况下使用字符流)

* 字符流也可以拷贝文本文件, 但不推荐使用. 因为读取时会把字节转为字符, 写出时还要把字符转回字节.
* 程序需要读取一段文本, 或者需要写出一段文本的时候可以使用字符流
* 读取的时候是按照字符的大小读取的,不会出现半个中文
* 写出的时候可以直接将字符串写出,不用转换为字节数组

3.IO流(字符流是否可以拷贝非纯文本的文件)

* 不可以拷贝非纯文本的文件
* 因为在读的时候会将字节转换为字符,在转换过程中,可能找不到对应的字符,就会用?代替,写出的时候会将字符转换成字节写出去
* 如果是?,直接写出,这样写出之后的文件就乱了,看不了了

Writer:

举例:
在硬盘上,创建一个文件并写入一些文字数据

{
//创建一个FileWriter对象。该对象一被初始化就要明确被操作的文件。
//而且该文件会被创建到指定文件。如果该目录下已经有同名文件,会覆盖旧文件。
FileWriter fw = new FileWriter(“C:\Users\王旭\Desktop\JAVA笔记\12.IO流\\demo.txt”);

//传递一个ture参数,代表不覆盖已有的文件,并在已有文件的末尾处进行续写
FileWriter fw = new FileWriter("demo.txt",ture);

//调用write方法,将字符串写入到流中。 
fw.Write("nihao \r\n hhh");//换行

//将数据刷新到目的地中,也就是第一步中指定的路径。
fw.flush();

//关闭流资源,但是关闭之前,会刷新一次内部缓冲中的数据。
fw.close();

}


Reader

举例:read()方法
{
//创建一个文件读取流对象,和指定名称的文件相关联。
//要保证该文件已经存在,若不存在会发生FileNotFoundExcption异常。
FileReader fr = new FileReader(“demo.txt”);

//调用读取流对象的read方法,功能返回值是int,
//一次读一个字符,而且会自动往下读,如果到了末尾就返回-1。
int ch = 0;
while( (ch=fr.read()) != -1 )
{
System.out.println((char)ch);
}
}

其他方法:

  • read(char[] buf)//通过字符数组进行读取,返回的是读到的字符个数,到结尾返回-1
    举例: 假设文件中存储的是”abcd”
    char[] buf = new char[3];
    int num1 = fr.read(buf);
    System.out.println(new String(buf));
    int num2 = fr.read(buf);
    System.out.println(new String(buf));
    
    打印结果:abc
          dbc
    原因:到d之后就不能再录入了,所以数组的第二个和第三个没有变。
    
  • read(char[] buf, int num1,int num2);//从第num1个位置开始读,读 num2 个字符

IO异常的处理方式

标准例子:
{
FileWriter fw = null;//一定要在try代码块之前先定义fw,
//否则finally中使用不了close(),会报异常。
try
{
fw = new FileWriter(“K:\Demo.txt”);
fw.write(“abc”);
fw.close();
}
catch(IOException e)
{
System.out.println(e.toString());
}
finally
{
if(fw != null)//为了避免不必要的异常,先进行if判断是否指向成功
{
try
{
fw.close();//因为该句也会出现异常,所以也得用try代码块框起来。
}
catch(IOException e)
{
System.out.println(e.toString());
}
}
}
}