您的位置:首页 > 编程语言 > Java开发

java13-IO输入输出流

2013-04-19 01:19 357 查看
------- android培训java培训、期待与您交流!
----------

(Input  Output)流

用来处理设备之间的数据传输。java对数据的操作是通过流的方式。java用于操作流的对象都在IO包中。

按操作数据类型分为两种:字节流与字符流。

按流向分为:输入流,输出流。

IO流常用基类

字节流抽象基类

InputStream,OutputStream

字符流抽象基类

Reader,Writer

这四个类派生出来的子类名称都是以父类名作为子类名的后缀。功能为前缀。

如:InputStream的子类FileInputStream

Reader的子类FileReader

2.字符流

Reader,Writer

/*

使用文件操作的Writer子类对象FileWriter。

建立对象,明确数据存放的目的地。

write方法,将字符串写入到流中

flush将数据刷到目的地中

close刷新后流关闭

和flush区别是,flush只是刷新,流还在。close刷新后流关闭刷新后流关闭

*/

import java.io.*;
class FileWriterDemo
{
public static void main(String[] args) throws IOException//建立对象时可能会有异常

{
/*创建一个FileWriter对象,这个对象一被初始化就必须要明确被操作的文件。
该文件会被创建到指定目录下,目录下若有同名文件,会被覆盖。
就是明确数据存放的目的地。
*/
FileWriter fw = new FileWriter("demo.txt");

//调用方法write,将字符串写入到流中
fw.write("adc");
//刷新流对象中缓冲中的数据,将数据刷到目的地中。
//fw.flush();

/*关闭流资源,但关闭前会刷新一次内部缓冲中的数据
将数据刷到目的地中
和flush区别是,flush只是刷新,流还在。
close刷新后流关闭*/
fw.close();
}
}


3.IO异常基本处理

/*

IO异常的基本处理

1,创建空对象在成员位置,以便作用于类中。
2,try对象初始化,开始输入,以便处理异常。

3,对异常处理。

4,finally关闭缓存。先判断对象是否为空,然后确是否关闭,关闭要try,catch处理。

*/

import java.io.*;
class EWriter
{
public static void main(String[] args)
{
FileWriter fw = null;
try
{
fw = new FileWriter("w:\\demo.txt");
//win中\\反转字符
fw.write("cabadd");
}
catch(IOException e)
{
System.out.println("io"+e.toString());
//处理异常
}
finally
{
if(fw!=null)
//判断close是否需要执行
try
{
fw.close();
}
catch(IOException e)
{
System.out.println(e.toString());
}
}
}
}

4.对已经存在的文件续写
import java.io.*;
class XxWriter
{
public static void main(String[] args)
{
FileWriter fw = null;
try
{
fw = new FileWriter("demo.txt",true);
//通过传递一个true,使文件不被覆写,并在文件结尾续写
fw.write("cbn");
}
catch(IOException e)
{
System.out.println(e.toString());
}
finally
{
if(fw!=null)
try
{
fw.close();
}
catch(IOException e)
{
System.out.println(e.toString());
}
}
}
}

5.读取文件

FileReader
和FileWriter相似。
创建对象,与文件相关联。要保证文件存在,不然会文件不存在异常。
读取方法read()
一次读一个字符,自动往下读,到文件末尾会自动返回-1.
int ch =0;
while((ch=对象.rese())!=-1)
{}
------
read(char[])
返回的是读到的字符个数
定义一个字符数组,存储读到的字符
char[] buf = new char[1024整数倍];
int num = 0;
while((num=fr.read(buf))!=-1)
{
new String(buf,0,num)
// 返回 char 数组参数的特定子数组的字符串表示形式。
}

练习:复制文件
1,确定要复制文件位置,存储位置
2,建立数组,读取文件数据存入数组,数组中文件写入
3,关闭流

import java.io.*;
class Filerw
{
public static void main(String[] args)
{
//建立流对象变量,初始化为空
FileReader fr = null;
FileWriter fw = null;
try
{
//确定位置
fr = new FileReader("F:\\JAVA学习\\javalx\\MapDemo.java");
fw = new FileWriter("F:\\MapDemo.java");
//建立字符数组,确定数组长度,用于存储数据
char[] ch = new char[1024];
//读取文件数据存入数组,并把数组中数据传入写入流
//定义变量确定读取的个数
int len = 0;
while((len=fr.read(ch))!=-1)
{
fw.write(ch,0,len);
}
}
catch(IOException e)
//处理异常
{
throw new RuntimeException("读写失败");
}
//关闭流
finally
{
if(fr!=null)
try
{
fr.close();
}
catch(IOException e)
{
throw new RuntimeException("关闭流失败");
}
if(fw!=null)
try
{
fw.close();
}
catch(IOException e)
{
throw new RuntimeException("关闭流失败");
}

}
}
}

字符流的缓冲区

继承了字符流接口,加了自己的方法。

缓冲区的出现提高了对数据的读写效率。

对应类有

BufferedWriter

BufferedReader

缓冲区要结合流才能使用,对流的功能进行了增强。

建立流对象,建立缓冲区对象bufw(写入),bufr(读取),并把流对象作为参数传入缓冲区的构造函数。

调用缓冲区方法操作文件,

bufw.write("ddd");//写入

bufw.newLine();//换行,不区分系统

bufw.flush();//只要使用缓冲区,就要刷新。

bufw.close();//关闭缓冲区,就是关闭缓冲区中的流对象。

bufr.read();

bufw.readLine();//读取一行;结尾时返回空

bufw.close();//关闭缓冲区

/*

自己写一个BufferedReader

因为缓冲区是给流调用的,异常不能try,只能throws.

1,设置构造函数要有字符流对象参数。

2,定义读取方法,一次一行

3,定义关闭方法,关闭流对象

FileReader

*/
import java.io.*;

class MyBufferedReader
{
//设置私有参数FileReader
private FileReader r;
//MyBufferedReader(){}
//设置构造参数
MyBufferedReader(FileReader r)
{
this.r = r;
}
//设置myReadLine
public String myReadLine()throws IOException
{
//设置数据存储容器,偷懒不用字符数组,直接用字符串容器
StringBuilder sb= new StringBuilder();
//读取字符并存入容器,直到换行
int ch = 0;

while((ch=r.read())!=-1)
{
//
if(ch=='\r')
continue;
if(ch=='\n')
return sb.toString();
else
sb.append((char)ch);
}
//没有数据时返回null;
if(sb.length()!=0)
return sb.toString();
return null;

}
//定义关闭流对象方法
public void myClose()throws IOException
{
r.close();
}

}

class MyBufferedReaderDemo
{
public static void main(String[] args)
{
//定义读取流对象
FileReader fr =null;
MyBufferedReader myBuf = null;
try
{
fr = new FileReader("TreeSet.java");
//建立缓冲区对象
myBuf = new MyBufferedReader(fr);
//读取
String line = null;
while((line=myBuf.myReadLine())!=null)
{
//换行没有存入,输出时要加上换行
System.out.println(line);
}
}
catch(IOException e)
{
throw new RuntimeException("读取错误");
}
finally
{
if(myBuf!=null)
try
{
myBuf.myClose();
}
catch(IOException e)
{
throw new RuntimeException("关闭异常");
}
}
}
}

LineNumberReader
BufferedReader的子类
多了设置和获取行号的功能。也是装饰类。
setLineNumber();
getLineNumber();//设置在哪开始

------- android培训java培训、期待与您交流!
----------
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  基础