IO流(Input Output)
用来处理设备之间数据的传输。
Java处理数据的操作是通过流的方式
按照操作数据分为:字符流和字节流
字符流对象中融合了编码表,文字用字符流,图片用字节流。
通用的为字节流
IO流常用基类
1.字节流抽象基类: InputStream,OutputStream
2.字符流抽象基类: Reader Writer
一、字符流
Writer 写入字符流
既然IO流是用于操作数据的,
那么数据的最常见体现形式是文件。
需求:在硬盘上创建一个文件,并写入一些数据。
找到专门用于操作文件的Writer子类对象,FileWriter
1·创建一个FileWriter对象,该对象一被初始化就必须要明确被操作的文件。
·初始化的时候要抛异常IOException,
·在指定目录下会产生文件,如果该目录下已有同名文件,将被覆盖。
·构造函数就是为了明确数据存放的目的地。
2·主要使用write方法。
·write(String str)字符串写入到流中
·flush() 刷新该流的缓冲,将缓冲区的数据刷到目的地
·close() 关闭流资源,但是关闭之前会刷新一次内部的缓冲中的数据,将数据刷到目的地中。和flush的区别:flush刷新后流可以继续使用,close刷新后会将流关闭,close关闭此流,但要先刷新,最后必须要用到close
import java.io.*;
public class IODemo
{
public static void main(String[] args)throws IOException
{
FileWriter fw = new FileWriter("yusheng.doc");
fw.write("adfghjkk");
fw.flush();
fw.write("qwertyui");
fw.flush();
fw.write("sdfghjkl");
fw.close();
}
}
·IOException异常处理
凡是和设备上数据产生联系的都会发生IO异常,无论读写还是创建。
·在外面建立引用,在try内初始化。
·在finnally中嵌套一个try
·引用null的可能,要判断。
import java.io.*;
public class IODemo1
{
public static void main(String[] args)
{
FileWriter fw = null;
try
{
fw = new FileWriter("ys.txt");
fw.write("hello world!");
}
catch (IOException e)
{
System.out.println(e.toString());
}
finally
{
try
{
if(fw != null)
{
fw.close();
}
}
catch (IOException e1)
{
System.out.println(e1.toString());
}
}
}
}
·进行数据续写
FileWriter(url,append) append为true时,则续写内容
在Windows中,回车符是由两个字符表示的,\r\n
记事本不识别\n
在Linux中,回车符可以使用单个\n表示。
//需求: 在ys.txt文件末尾插入 “你好” 换行 “谢谢”
import java.io.*;
public class IODemo2
{
public static void main(String[] args)
{
FileWriter fw = null;
try
{
fw = new FileWriter("ys.txt",true);
fw.write("\r\n你好\r\n谢谢");
}
catch (IOException ioe)
{
System.out.println(ioe.toString());
}
finally
{
try
{
if(fw != null)
{
fw.close();
}
}
catch (IOException ioe)
{
System.out.println(ioe.toString());
}
}
}
}
Reader
·创建一个文件读取流对象,和指定名称的文件相关联。
·要保证该文件是已经存在的,如果不存在,会发生
FileNotFoundException异常
·调用读取流对象的read方法。
read方法一次读一个字符,而且会自动往下读。
import java.io.*;
public class IODemo3
{
public static void main(String[] args)
{
FileReader fr = null;
try
{
fr = new FileReader("ys.txt");
while(true)
{
int ch = fr.read();
if(ch == -1)
break;
System.out.print((char)ch);
}
}
catch (IOException e1)
{
System.out.println(e1.toString());
}
finally
{
try
{
if(fr != null)
fr.close();
}
catch (IOException e)
{
System.out.println(e.toString());
}
}
}
}
第二种读取方式: 通过字符数组进行读取
read(char[]) 返回的是读到字符个数。
import java.io.*;
public class IODemo3
{
public static void main(String[] args)
{
FileReader buf = null;
try
{
buf = new FileReader("ys.txt");
char[] ch = new char[1024];
int u = 0;
while((u = buf.read(ch))!= -1)
{
System.out.print(new String(ch,0,u));
}
}
catch (IOException ioe)
{
System.out.println(ioe.toString());
}
finally
{
try
{
if(buf != null)
buf.close();
}
catch (IOException ioe)
{
System.out.println(ioe.toString());
}
}
}
}
从C盘向D盘拷贝文件:
原理 就是将C盘下的文件数据存储到D盘下的一个文件中
步骤:
1.在D盘创建一个文件,用于存储C盘文件
2.定义读取流和C盘关联
3.通过不断的读写完成
4.关闭资源
//需求:将当前文件夹下的IODemo.java复制
import java.io.*;
public class IODemo4
{
public static void main(String[] args)
{
FileWriter fw = null;
FileReader fr = null;
try
{
fw = new FileWriter("IODemo_copy.txt");
fr = new FileReader("IODemo.java");
int len = 0;
char[] ch = new char[1024];
while((len = fr.read(ch)) != -1)
{
fw.write(new String(ch),0,len);
}
}
catch (IOException ioe)
{
throw new RuntimeException("读写失败");
}
finally
{
try
{
if(fw != null)
fw.close();
if(fr != null)
fr.close();
}
catch (IOException ioe)
{
System.out.println(ioe.toString());
}
}
}
}