------ <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.comtarget="blank">
java培训</a>、期待与您交流! ---------
引言
IO流用来处理设备之间的数据传输
java对数据的操作是通过流的方式
java 用于操作流的对象都在IO包中
流按操作数据分为两种,字节流与字符流,
流按流向分为:输入流, 输出流
将外设中的数据读取到内存中:输入。
将内存的数写入到外设中:输出。
IO流常用基类
字节流的抽象基类:InputStream,OutputStream。
字符流的抽象基类:Reader,Writer。
由这四个类派生出来的子类名称都是以其父类名作为子类名的后缀。
如:InputStream的子类FileInputStream。
如:Reader的子类FileReader。
例子:将文件写入指定目录下:
import java.io.FileWriter;
public class IoDemos {
public static void main(String[] args) throws Exception
{
med();
}
private static void med() throws Exception
{
//创建一个FileWriter对象,该对象一被初始化就必须要明确被操作的文件,
//而且该文件会被创建到指定目录下,如果该目录下已有同名文件,将被覆盖
//实际上就是明确数据要存放的目的地
FileWriter fw = new FileWriter("E:\\java.txt");
//调用方法将字符串写入到流中
fw.write("ssasdwa");
//刷新流对象中的缓冲中的数据,将数据刷到目的地中去
fw.flush();
//关闭流资源,但是关闭之前会刷新一次内部的缓冲中的数据,将数据刷到目的地中
fw.close();
}
程序运行后,后在E盘目录下创建一个名为java的txt文档
}
注:close只可以调用一次,调用后,不可能再写入数据
如果在构造函数中写入true 则可以实现文件的续写,否则,将会覆盖前一个同名文件
public class IoDemos {
public static void main(String[] args) throws Exception
{
med1();
}
private static void med1()
{
FileWriter fw = null;
try
{
fw = new FileWriter("E:\\java.txt",true);
fw.write("4578954");
fw.flush();
}
catch(IOException e)
{
System.out.println(e.toString());
}
finally
{
try
{
if(fw!=null)
fw.close();
}
catch(IOException
e)
{
System.out.println(e.toString());
}
}
}
运行程序后;
--------------------------------------------------------------------------------------------------------------
close 和 flush 的区别
是:flush刷新后,流可以继续使用,close刷新后,会关闭流
----------------------------------------------------------------------------------------------------------------------------------------------
IO中异常处理方式:
-------------------------------------------------------------------------------------------------------
private static void med1() {
try
{
FileWriter fw = new FileWriter("E:\\java.txt",true);
fw.write("4578954");
fw.flush();
}
catch(IOException e)
{
System.out.println(e.toString());
}
finally
{
try
{
if(fw!=null)
fw.close();
}
catch(IOException e)
{
System.out.println(e.toString());
}
}
}
这样创建是 错误的,因为fw是局部变量,不可以在try以外使用,所以可以改写成在外建立引用,在内部初使化
----------------------------------------------------------------------------------------------------------------
运行程序会发生异常:
----------------------------------------------------------------------------------------------------------------
那么改写程序:
private static void med1() {
// TODO Auto-generated method stub
FileWriter fw = null;
try
{
fw = new FileWriter("E:\\java.txt",true);
fw.write("4578954");
fw.flush();
}
catch(IOException e)
{
System.out.println(e.toString());
}
finally
{
try
{
if(fw!=null)
fw.close();
}
catch(IOException e)
{
System.out.println(e.toString());
}
}
}
运行程序,程序会正常运行
注: 为防止异常运行时程序无法关闭,因此关闭流应该在finally中运行
----------------------------------------------------------------------------------------------------------------
读取某指定文件:
编写相关代码:
private static void med2()throws IOException
{
// 创建一个文件读取流对象,和指定名称的文件相关联
//要保证该文件是已经存在的,如果不存在,会发生FileNotFoundException异常
FileReader fr = new FileReader("E:\\java.txt");
//调用读取流对象的read方法
int a = fr.read();
System.out.println((char)a);//s
//read()方法一次只可以读一个字符,而且会自动往下读
while(true)
{
int b = fr.read();
System.out.print((char)b);
if(b==-1)
break;
}
//或者第二种写法
while((fr.read())!=-1)
{
int b = fr.read();
System.out.println((char)b);
}
}
注:
创建一个文件读取流对象,和指定名称的文件相关联
要保证该文件是已经存在的,如果不存在,会发生FileNotFoundException异常
read()方法一次只可以读一个字符,而且会自动往下读
读取文件的第二种方式,通过字符数组
private static void med3()throws IOException {
// 创建一个文件读取流对象,和指定名称的文件相关联
//要保证该文件是已经存在的,如果不存在,会发生FileNotFoundException异常
FileReader fr = new FileReader("E:\\IoDemos.java");
char[] arr = new char[1024];
//调用读取流对象的read方法
int num = 0;
while((num=fr.read(arr))!=-1)
{
System.out.print(new String(arr,0,num));
}
//read()方法一次只可以读一个字符,而且会自动往下读
fr.close();
}
其中read(arr)返回的是读到的字符个数
----------------------------------------------------------------------------------------------------------------------------------------------
读取文件练习:
读取E盘中的文件IoDemoes.java
private static void med3()throws IOException {
// 创建一个文件读取流对象,和指定名称的文件相关联
//要保证该文件是已经存在的,如果不存在,会发生FileNotFoundException异常
FileReader fr = new FileReader("E:\\IoDemos.java");
char[] arr = new char[1024];
//调用读取流对象的read方法
int num = 0;
while((num=fr.read(arr))!=-1)
{
System.out.print(new String(arr,0,num));
}
//read()方法一次只可以读一个字符,而且会自动往下读
fr.close();
}
----------------------------------------------------------------------------------------------------------------
拷贝文件
将E盘中的文件IoDemoes.java拷贝一个复件到当前目录下
第一种方式
private static void med4() throws IOException
{
// 创建一个文件读取流对象,和指定名称的文件相关联
//要保证该文件是已经存在的,如果不存在,会发生FileNotFoundException异常
FileReader
fr = new FileReader("E:\\IoDemos.java");
//创建 个写入的目的地
FileWriter fw =
new FileWriter("E:\\IoDemos_rr.txt");
int num = 0;
//读一个数据,写一个数据
while((num = fr.read())!=-1)
{
fw.write(num);
}
fr.close();
fw.close();
}
第二种方式
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class IoDemos {
public static void
main(String[] args) throws Exception
{
med5();
}
private static void
med5() {
// 拷贝文件的第二种方式
// 创建一个文件读取流对象,和指定名称的文件相关联
//要保证该文件是已经存在的,如果不存在,会发生FileNotFoundException异常
FileReader fr =
null;
FileWriter fw =
null;
try
{
fr = new FileReader("E:\\IoDemos.java");
//创建 个写入的目的地
fw = new FileWriter("E:\\IoDemos_rr.txt");
int num = 0;
char[] arr = new char[1024];
while((num = fr.read(arr))!=-1)
{
fw.write(arr);
}
}
catch(Exception e)
{
System.out.println(e.toString());
}
finally
{
try
{
if(fr!=null)
fr.close();
}
catch(Exception
e)
{
System.out.println(e.toString());
}
try
{
fw.close();
}
catch(Exception
e)
{
System.out.println(e.toString());
}
}
}
------------------------------------------------------------------------------------------------------------------------------------
字符缓冲区
<1>缓冲区出现提高了对数据的读写效率
<2> 对应类: BufferedWriter
BufferedReader
<3> 缓冲区结合流才可以使用
<4>在流的基础上,对流的功能进行了增强
使用缓冲区写入指定目录下文件:
private static void med6() throws Exception
{
//创建一个字符定稿流对象
FileWriter fw = new FileWriter("E:\\BufferDemos.txt");
//为了提高字符写入流效率,加入缓冲技术
BufferedWriter bufw = new BufferedWriter(fw);
bufw.write("dddddd");
bufw.flush();
fw.close();
bufw.close();
}
运行程序后会得到
注:使用到缓冲区,就必须刷新
缓冲区中的换行方法 newLine() 具有跨平台的换行符
使用缓冲技术读取文件
要读取的文件为 BufferDemos.txt
设计程序代码
private static void med7() throws Exception
{
// 创建一个读取流对象与文件相关联
FileReader fr = new FileReader("E:\\BufferDemos.txt");
//加入缓冲技术
BufferedReader burd= new BufferedReader(fr);
String num = null;
//该缓冲区提供了一个一次读一行的方法readLine 方便于对文本数据的获取
//当返回null时,表示读到了文件末尾
while((num=burd.readLine())!=null)
{
String s = burd.readLine();
System.out.println(s);
}
burd.close();
}
注: //该缓冲区提供了一个一次读一行的方法readLine 方便于对文本数据的获取
//当返回null时,表示读到了文件末尾
------------------------------------------------------------------------------------------------------------------------------------
使用缓冲区拷贝文件
private static void med8() {
//
BufferedWriter bufw = null;
BufferedReader bufr = null;
FileReader fr = null;
FileWriter fw = null;
try
{
fr = new FileReader("E:\\BufferDemos.txt");
bufr = new BufferedReader(fr);
fw = new FileWriter("E:\\myjava.txt");
bufw = new BufferedWriter(fw);
String num = null;
char[] arr=new char[1024];
while((num=bufr.readLine())!=null)
{
bufw.write(num);
bufw.newLine();
}
}catch(Exception e)
{
System.out.println(e.toString());
}
finally
{
try
{
if(bufr!=null)
bufr.close();
}
catch(Exception e)
{
System.out.println(e.toString());
}
try
{
if(bufw!=null)
bufw.close();
}
catch(Exception e)
{
System.out.println(e.toString());
}
}
}
------------------------------------------------------------------------------------------------------------------------------------
自定义一个读出一行数据的方法
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
class MyBufferedReader
{
private FileReader fil;
MyBufferedReader(FileReader fil)
{
this.fil = fil;
}
//提供一个可以一次读一行的方法
public String myReadLine() throws Exception
{
//定义一个临时容器,原BufferReader封装的是字符数组
//这里可以使用一个StringBuilder容器
StringBuilder sb = new StringBuilder();
int ch = 0;
while((ch=fil.read())!=-1)
{
if(ch==‘\r‘)
continue;
if(ch==‘\n‘)
return sb.toString();
else
sb.append((char)ch);
}
if(sb.length()!=0)
{
return sb.toString();
}
return null;
}
}
建立一个测试类
public class IoDemos {
public static void main(String[] args) throws Exception
{
med10();
}
private static void med10() throws Exception
{
FileReader fr = new FileReader("E:\\BufferDemos.txt");
MyBufferedReader my = new MyBufferedReader(fr);
System.out.println(my.myReadLine());
System.out.println(my.myReadLine());
}
LineNumberReader
import java.io.FileReader;
import java.io.LineNumberReader;
public class LineNumberReaderDemos {
public static void main(String[] args) {
med1();
}
private static void med1() {
FileReader fr;
LineNumberReader lnr ;
try{
fr = new FileReader("E:\\IoDemos.java");
lnr = new LineNumberReader(fr);
String line = null;
lnr.setLineNumber(100);
while((line = lnr.readLine())!=null)
{
System.out.println(lnr.getLineNumber()+" "+line);
}
lnr.close();
}catch(Exception e)
{
System.out.println(e.toString());
}
}
}