---------------------- <ahref="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<ahref="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ----------------------
I/O流:分为字符流和字节流
字节流:
|--InputSystem
|--OutputSystem
字符流:
|--Reader
|--writer
先以操作文件为主要演示:
需求:在硬盘上,创建一个文件写入一些数据
找到一个专门操作文件的Writer子类对象。FileWriter 。后缀名是父类名 前面是功能名
//创建一个filewriter对象,该对象一被初始化就必须要明确被操作的文件。
//而且该文件会被创建到指定目录下,如果该目录下已有同名文件,将被覆盖
//其实该步就是在明确数据要存放的位置
FileWriterfw = new FileWriter("demo.txt");
//调用writer的方法将字符串写入流中。
fw.write("abcd");
//刷新流对象中的缓冲数据 将数据存入目的地中
fw.flush();
//关闭流资源,但是在关闭之前会刷新一次内部的缓冲的数据。将数据刷新到目的地中。
//和flush 的区别:flush刷新后 流可以继续使用。 close刷新后 流关闭。
fw.close();
I/O异常处理方式:
FileWriterfw =null
try{
fw = newFileWriter("demo.txt");
fw.write("abddasdas");
fw.flush();
} catch (IOException e )
{
//异常处理
}
finally
{
try{
if(fw!=null)
fw.close();
}catch(IOException e)
{
//异常处理
}
}
对已有文件的数据的续写: FileWriter fw= newFileWriter("demo.txt",true);
\r 和\n 为换行
Reader:
//创建一个文件读取流对象,和指定名称的文件想关联。
//要保证该文件已经存在的,要不存在,会发生异常FliesNotFoundException
FileReader fr= newFileReader("demo.txt");
//调用读取流对象的方法的read():是一次读一个字符,而且会自动想下读
//第一种方式读取
intch=0;
while((ch=fr.read())!=-1)
{
System.out.println((char)ch);
}
//第二种方式:通过字符数组进行读取。
FileReaderfr = new FileReader("demo.txt");
//定义一个字符数组,用于存储读到的字符
//该read(char []) 返回的是读到的字符的个数;
char [] buf = new char[1024];
int num=0;
while((num=fr.read(buf))!=-1)
{
System.out.println(new String (buf,0,num));
}
fr.close();
//缓冲区的出现是为了提高流的操作效率而出现的所以在创建缓冲区的之前必须先有流对象
//创建一个字符写入流对象:FileWriter fw =newFileWriter("buf.txt");
//为了提高字符写入流效率 加入了缓冲技术
//只有将需要被提高的流对象作为参数传递给缓冲区的构造函数即可
BufferedWriterbufw = new BufferedWriter(fw);
for(int x=1;x<5;x++)
{
bufw.writer("abcd"+x);
bufw.newLine();//换行
bufw.flush();//写完就存入硬盘,防止断电,buff里面内容丢失
}
//记住,只有用到缓冲区就要记得刷新
//bufw.flush();
bufw.flush();
//其实关闭缓冲区,就是在关闭缓冲区中的流对象。
bufw.close();
/*字符读取流缓冲区: 该缓冲区提供了一个一次读一行的方法 readLine,方便于对文本数据的获取,当返回null时,表示读到文件末尾。
readLine()返回的是换行之前的数据。所以需要自己手动换行。
*/
//创建一个读取流对象,和文件相关联
FileReaderfr = newFileReader("buf.txt");
//为了提高字符读取效率,加入了缓冲技术,将字符读取流对象作为参数传递给缓冲区构造函数
BufferedReaderbufr = new BufferedReader(fr);
Stringline = null;
while((line=bufr.readLine())!=null)
{
System.out.println(line);
}
bufr.close();
readLine方法的原理:无论是读一行 获取多个字符,其实最终都是在硬盘上一个一个读取,所以最终使用的还是readLine方法一次读一个的方法。
字节流:InputStream OutputSystem
//存
FileOutputSystem fos = new FileOutputSystem("fos.txt");
fos.write("abcde".getBytes());
//不需要刷新就可以存入文件
//必须关资源
fos.close();
//读
FileInputSystem fis= new FileInputSystem("fis.txt");
byte[] buf = new byte[fis.available()] //定义一个刚刚好的缓冲区,不用在循环了... 用于缓冲区较小的方法
fis.read(buf);
fis.close();
/*
循环使用缓冲区
byte[] buf = new byte[1024];
int len= 0;
while((len=fis.read(buf))!=1)
{
system.out.printl(buf,0,len);
}
*/
转换流:InputSystemRead; 字节转换成字符
OutputSystemWrite;字节转换成字符;
键盘录入:BufferedReader bufr = newBufferedReader(new InputStreamRead(System.in))
打印输出:bufferedWriter bufw = newBufferedWriter(new OutStreamWrite(System.out));
从键盘录入的数据存储到文件中:
源:键盘; 目的:文件;
//输出
bufferedWriterbufw = new BufferedWriter(new OutStreamWrite(new FileOutputStream(out.txt)));
流操作的基本规律:
最痛苦的是流对象很多 ,不知道该用哪一个
通过两个,明确来确定;
1.明确源和目的:
源:输入流:InputStream Reader
目的:输出流 OUtputSystem Writer
2.操作的数据是不是纯文本。
是:字符流
否:字节流
3.当体系明确后,在明确要使用哪个具体的对象:通过设备来进行区分:
源设备:内存,硬盘。键盘;
目的设备:内存,硬盘控制台
1.将一个文本文件中的数据存储到另一个文件中:复制文件
源: 因为是源所以选择读取流InputStream reader,是不是操作文本文件? 是就可以选择reader 这样体系就可以明确了
接下来明确要使用该体系中的哪个对象
明确设备:硬盘。上一个文件。Reader体系中可以操作文件的对象是FileReader
是否需要提高效率? 是! 加入Reader体系中缓冲区BufferedReader
目的:OutputSystem Writer 是否纯文本?
是 Writer
设备:硬盘;一个文件
Writer体系中可以操作文件的对象WriterWriter
是否需要提高效率?是! 加入Writer体系中缓冲区BufferedWriter
---------------------- <ahref="http://www.itheima.com"target="blank">ASP.Net+Unity开发</a>、<ahref="http://www.itheima.com"target="blank">.Net培训</a>、期待与您交流! ----------------------
详细请查看:<a href="http://www.itheima.com"target="blank">www.itheima.com</a>