字节流和字符流:
* 字节流的两个基类 :InputSream OutputSream
* 字符流的两个基类:Reader Writer
* 先学习下字符流的特点 :
* 既然IO流适用于操作数据的,那么数据的最常见的体现形式是:文件
(1) 读取流 演示:
import java.io.*;
class FileReaderDemo {
public static void main(String[] args) throws IOException
{
//创建一个文件读取流对象,和指定名称的文件相关联。要保证该文件
// 是已经存在的,如果不存在,会发生FileNotFoundException .
FileReader fr = newFileReader("d:\\IOstream\\demo.txt");
//第一种 方式:
//调用读取流对象的read 方法。
/*int ch1 = fr.read();
System.out.println("ch1="+(char)ch1);
//read()返回的是读取到得字符对应的int 型数据。因此需要强转。
//read():一次会读取一个字符,而且会自动向下读。
int ch2 = fr.read();
System.out.println("ch2="+(char)ch2);
*/
// 循环方法2
// while(true)
// {
// int ch=fr.read();
// if (ch==-1)
// break;
// System.out.println("ch="+(char)ch);
// }
/* 循环方法3
int ch = 0;
while((ch=fr.read())!=-1)
{
System.out.println((char)ch);
}*/
//fr.close();
// 第二种方式:通过字符数组进行读取。
//定义一个字符数组,用于存储读到的字符,该read(char[])返回的是读取的字符的个数。
char [] buf = new char[3];
int num =fr.read(buf);//把流关联的数据,读一个存到数组中。
System.out.println("num="+num+"...."+new String(buf));
//看看num 是多少和将buf变成字符串打印
int num1 =fr.read(buf);
System.out.println("num1="+num1+"...."+new String(buf));
int num2 =fr.read(buf);
System.out.println("num2="+num2+"...."+new String(buf));
/*
char [] buf3= new char[10];//一个字符占两个字节。 10个字符在内存占用20个字节空间。
int num3= 0,count=0;
while((num3=fr.read(buf3))!=-1)
*/
/*此句意思是把流关联的数据读一个存到数组中去。
由于数组本身指针自增操作,流会自动读下一个数据存到数组中。
//当数组长度较小时,读入其中的字符超出数组大小,该流的读硬盘文件操作停止,看看流返回的是不是-1;
不是-1,执行 while循环内部语句。之后有判断条件,调用并执行num=fr.read(buf),该流从停止的位置继续读硬盘。
重新向数组的开始位置依次读入数据。
//当数组长度较大时,流读完了全部的硬盘数据还没有超出数组大小,则该流停止读,返回
已读取的字符数,不是-1,执行 while循环内部语句。之后判断条件,执行num=fr.read(buf),由于
已经到了硬盘数据末尾,num=-1;不再执行 while循环内部语句。
*/
/*
{
System.out.println("count= "+count++);// 看看究竟循环了多少次?
System.out.println(newString (buf3,0,num3));
//new String 是将数组变成字符串,方便打印。
}
*/
class FileWriterDemo {
public static void main(String[] args) throws IOException
{
//创建一个FileWriter对象,该对象一被初始化就必须要明确被操作的文件。
//而且如果没有这文件, 该文件会被创建到指定目录下;如果该目录有同名文件会被覆盖。
//其实该步就是在明确数据要存放的目的地。
FileWriter fw = newFileWriter("D:\\IOstream\\demo.txt");
//调用write 方法,将字符串写入到流中。
fw.write("abcde");
//刷新流对象中的缓冲的数据。将数据刷到目的地中。
fw.flush();
//关闭流资源,但是关闭之前会刷新一次内部的缓冲中的数据,将数据刷到目的地中。
// 和flush的区别:flush刷新后,流可以继续使用,close刷新后,会将流关闭。
fw.close();// close其实也是为了 释放 Windows 系统的资源
//fw.write("+++哈哈哈++");
}
}
(2) 写出流 演示
class FileWriterDemo {
public static void main(String[] args) throws IOException
{
//创建一个FileWriter对象,该对象一被初始化就必须要明确被操作的文件。
//而且如果没有这文件, 该文件会被创建到指定目录下;如果该目录有同名文件会被覆盖。
//其实该步就是在明确数据要存放的目的地。
FileWriter fw = newFileWriter("D:\\IOstream\\demo.txt");
//调用write 方法,将字符串写入到流中。
fw.write("abcde");
//刷新流对象中的缓冲的数据。将数据刷到目的地中。
fw.flush();
//关闭流资源,但是关闭之前会刷新一次内部的缓冲中的数据,将数据刷到目的地中。
// 和flush的区别:flush刷新后,流可以继续使用,close刷新后,会将流关闭。
fw.close();// close其实也是为了 释放 Windows 系统的资源
//fw.write("+++哈哈哈++");
}
}