【IO】流 Input Output
流按操作数据分为:字节流和字符流
流按流向分为:输入流和输出流
GBK---GB2312---18030---unicode---UTF-8
通用字节流【字符流】
字节流有两个抽象基类:InputStream读, OutputStream写
字符流有两个抽象基类:Reader , Writer
既然IO流是用于操作数据的,那么数据的最常见体现形式是:文件。
需求:在硬盘上,创建一个文件并写入一些文字数据。
用于操作文件的Writer子类对象。FileWriter。后缀名是父类名。 前缀名是该流对象的功能。
import java.io.*;
class FileWriterDemo
{
public static void main(String[] args) throws IOException{
//创建一个FileWriter对象。该对象一被初始化就必须要明确被操作的文件。//而且该文件会被创建到指定目录下。如果该目录下已有同名文件,将被覆盖。//其实该步就是在明确数据要存放的目的地。FileWriter fw = new FileWriter("demo.txt");//调用write方法,将字符串写入到流中。fw.write("abcde");//刷新流对象中的缓冲中的数据。//将数据刷到目的地中。//fw.flush();//关闭流资源,但是关闭之前会刷新一次内部的缓冲中的数据。//将数据刷到目的地中。//和flush区别:flush刷新后,流可以继续使用,close刷新后,会将流关闭。fw.close();
}
}【文件的续写】
演示对已有文件的数据续写。
import java.io.*;
class FileWriterDemo3
{
public static void main(String[] args) throws IOException{
//传递一个true参数,代表不覆盖已有的文件。并在已有文件的末尾处进行数据续写。FileWriter fw = new FileWriter("demo.txt",true);fw.write("nihao\r\nxiexie");//在win下,换行是两个字符fw.close();
}
}【拷贝文本文件】
将C盘一个文本文件复制到D盘。
复制的原理:
其实就是将C盘下的文件数据存储到D盘的一个文件中。
步骤:
1,在D盘创建一个文件。用于存储C盘文件中的数据。
2,定义读取流和C盘文件关联。
3,通过不断的读写完成数据存储。
4,关闭资源。
import java.io.*;
class CopyText
{
public static void main(String[] args) throws IOException
{
copy_2();
}
//2
public static void copy_2()
{
FileWriter fw = null;FileReader fr = null;
try
{
fw = new FileWriter("SystemDemo_copy.txt");fr = new FileReader("SystemDemo.java");char[] buf = new char[1024];int len = 0;while((len=fr.read(buf))!=-1){
fw.write(buf,0,len);
}
}
catch (IOException e)
{
throw new RuntimeException("读写失败");
}
finally
{
if(fr!=null)try{
fr.close();
}catch (IOException e){}
if(fw!=null)
try{
fw.close();
}catch (IOException e){}
}【BufferedWriter】
}
缓冲区的出现是为了提高流的操作效率而出现的。
所以在创建缓冲区之前,必须要先有流对象。
该缓冲区中提供了一个跨平台的换行符:newLine();它是缓冲区里的方法
import java.io.*;
class BufferedWriterDemo
{
public static void main(String[] args) throws IOException{
//创建一个字符写入流对象。FileWriter fw = new FileWriter("buf.txt");//为了提高字符写入流效率。加入了缓冲技术。//只要将需要被提高效率的流对象作为参数传递给缓冲区的构造函数即可。BufferedWriter bufw = new BufferedWriter(fw);//bufw.write("ab\r\ncd");//\r\n在linux下\r就是多余的,newLine是跨平台的//bufw.newLine();//换行for(int x=1; x<5; x++)//只是为了多写点数据{bufw.write("abcd"+x);bufw.newLine();//换行方法bufw.flush();//缓冲区在内存里边,停电了缓冲区就没了,所以要刷}//记住,只要用到缓冲区,就要记得刷新。//bufw.flush();//其实关闭缓冲区,就是在关闭缓冲区中的流对象。bufw.close();
}
}【BufferedReader】
字符读取流缓冲区:
该缓冲区提供了一个一次读一行的方法 readLine,方便于对文本数据的获取。
当返回null时,表示读到文件末尾。
readLine方法返回的时候只返回回车符之前的数据内容。并不返回回车符。
import java.io.*;
class BufferedReaderDemo
{
public static void main(String[] args) throws IOException{
//创建一个读取流对象和文件相关联。FileReader fr = new FileReader("buf.txt");//为了提高效率。加入缓冲技术。将字符读取流对象作为参数传递给缓冲对象的构造函数。BufferedReader bufr = new BufferedReader(fr);String line = null;while((line=bufr.readLine())!=null){
System.out.print(line);
}bufr.close();
}
}