IO (Input Output)流
IO流用来处理设备之间的数据传输;
JAVA对数据的操作是通过流的方式;
JAVA对于操作流的对象都在IO包中;
流按操作数据分为两种:字节流和字符流;
流按流向分为输入流和输出流。
IO流常用基类
字节流的抽象基类:
InputStream ,OutputStream
字符流的抽象基类:
Reader , Writer
注:由这4个类派生出的子类名称都是以其父类名作为子类明的后缀。
如:InputStream 的子类 FileInputStream。
如:Reader 的子类 FileReader。
既然IO流是用于操作数据的,
那么数据最常见的体现形式是:文件。
需求:在硬盘上,创建一个文件并写入一些文字数据。
找到一个专门操作文件的Writer子类对象。FileWriter。后缀名是父类名,前缀名是该流对象的功能。
import java.io.*;
class FileWriterDemo
{
public static void main(String[] args) throws IOException
{
//创建一个FileWriter对象。该对象一被初始化就必须要明确被操作的文件。
//该文件会被创建到指定的目录下。如果该目录下已有同名文件,将被覆盖。
//其实该步骤就是在明确数据要存放的目的地。
FileWriter fw = new FileWriter("D:\\test.txt");
//调用write方法,将字符串写入到流中。
fw.write("abcdfeg");
//刷新流对象中的缓冲区中的数据。
//将数据刷新到目的地中。
fw.flush();
//关闭流资源,但是在关闭之前会刷新一次内部的缓冲中的数据,将数据刷新到目的地。
//和flush的区别:flush刷新之后,流可以继续使用,close刷新后,将会关闭流。
fw.close();
}
}
对流的异常操作
import java.io.*;
class FileWriterDemo2
{
public static void main(String[] args)
{
//把变量放在try代码块外面,这样在finally代码块环境中也能使用
FileWriter fw = null;
try
{
fw = new FileWriter("k:\\text.txt");
fw.write("aaaaaaa");
}
catch(IOException e)
{
System.out.println(e.toString());
}
finally
{
try
{
//判断资源对象是否存在
if(fw != null)
fw.close();
}
catch(IOException e)
{
System.out.println(e.toString());
}
}
}
}
读取文件内容
import java.io.*;
class FileReaderDemo
{
public static void main(String[] args)
{
FileReader fr = null;
try
{
fr = new FileReader("D:\\test.txt");
int ch = 0;
while((ch=fr.read()) != -1)
{
System.out.print((char)ch);
}
}
catch(IOException e)
{
System.out.println(e.toString());
}
finally
{
try
{
if(fr != null)
fr.close();
}
catch(IOException e)
{
System.out.println(e.toString());
}
}
}
}
用数组参数读取文件
import java.io.*;
class FileReaderDemo2
{
public static void main(String[] args) throws IOException
{
FileReader fr = null;
try
{
fr = new FileReader("F:\\java\\FileReaderDemo.java");
char[] buf = new char[1024];//创建一个临时数组
int num = 0;
while((num = fr.read(buf)) != -1)//把读取的数据存入字符数组中
{
System.out.print(new String(buf,0,num));//把数组转成字符串并且打印出来
}
}
catch(IOException e)
{
System.out.println(e.toString());
}
finally
{
try
{
if(fr != null)
fr.close();
}
catch(IOException e)
{
System.out.println(e.toString());
}
}
}
}
文件的拷贝:
import java.io.*;
class FileCopyDemo2
{
public static void main(String[] args)
{
copy();
}
public static void copy()
{
FileWriter fw = null;
FileReader fr = null;
try
{
fw = new FileWriter("F:\\java\\xin.txt",true); //创建输入流
fr = new FileReader("F:\\java\\new.txt"); //创建输出流
char[] buf = new char[1024]; //定义容器
int len = 0; //定义长度
while((len=fr.read(buf)) != -1)
{
fw.write(buf,0,len); //把字符数组中的内容存入指定区域
}
}
catch(IOException e)
{
System.out.println(e.toString());
}
finally
{
try
{
if(fw != null)
fw.close();
}
catch(IOException e)
{
System.out.println(e.toString());
}
finally
{
try
{
if(fr != null)
fr.close();
}
catch(IOException e)
{
System.out.println(e.toString());
}
}
}
}
}
字符流的缓冲区
缓冲区的出现提高了对数据的读写效率;
对应类
BufferedWriter , BufferedReader
缓冲区要结合流才能使用;
在流的基础上对流的功能进行了增强。
利用缓冲的文件拷贝
import java.io.*;
class BufferedCopyDemo
{
public static void main(String[] args) throws IOException
{
BufferedWriter bufw = null;
BufferedReader bufr = null;
try
{
bufw = new BufferedWriter(new FileWriter("FileWriterDemo_copy.txt"));
bufr = new BufferedReader(new FileReader("FileWriterDemo.java"));
String line = null;
while((line = bufr.readLine()) != null)
{
bufw.write(line);
bufw.newLine();
}
}
catch(IOException e)
{
System.out.println(e.toString());
}
finally
{
try
{
if(bufr != null)
bufr.close();
}
catch(IOException e)
{
System.out.println(e.toString());
}
try
{
if(bufw != null)
bufw.close();
}
catch(IOException e)
{
System.out.println(e.toString());
}
}
}
}
转载于:https://blog.51cto.com/tinsin/1639880