字符流
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”
打印结果:abcchar[] 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));
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());
}
}
}
}