您的位置:首页 > 职场人生

黑马程序员_日记02(IO)

2013-09-21 16:32 267 查看
------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------

字节流:InputStream,OutputStream

字符流:Reader,Writer

一:FileWriter和FileReader

FileWriter:

1,

//指定文件会被创建到指定的目录下,如果有重名的文件则会被覆盖

//可以用FileWriter fw = new FileWriter("text.txt",true);则不覆盖原有文件,在文件结尾续写

FileWriter fw = new FileWriter("test.txt");

//写到内存中(既流中),

fw.write("abc");

//要用fw.fluse();刷新缓冲区,将数据写到目的地

fw.fluse();

2,IO异常处理

public static void main(String args[]) {

FileWriter fw = null;

try {

fw = new FileWriter("test.txt");

fw.write("avd");

} catch(IOException e) {

} finally {

try {

if(fw != null) //如果上面有异常,fw为null,会出现空指针异常

fw.close();

} catch(IOException e) {

}

}

}

FileReader:

1,

//创建一个文件读取流对象,若文件不存在会发生异常

FileReader fr = new FIleReader("test.txt");

//读一个字符,读到流末尾返回-1

char ch = fr.read();

int ch = 0;

while((ch=fr.read()) != -1) {

System.out.println((char)ch);

}

//读取一个字符数组

//通常数组的大小事1024的整数倍

char[] buf = new char[1024];

int num = 0;

while((num = fr.fead(buf)) != -1) {

System.out.print(new String(buf,0,num));

}

fr.close();

示例:将C盘的文本文件拷贝到D盘

1,

public void copy_1() throws IOException {

FileWriter fw = new FileWriter("");

FileReader fr = new FileReader("");

int ch = 0;

while((ch = fr.read()) != -1) {

fw.writ(ch);

}

fw.close();

fr.close();

}

疑问:这种方式会产生磁头在源地址与目的地址之间频繁的移动?

fw.writ(ch)是将数据写入内存中的流中,等调用flush()或close()

的时候才写入磁盘

是fw.write()调用windows的底层资源还是fw.flush()?

2,

public void copy_2() {

FileWriter fw = null;

FileReader fr = null;

try {

fw = new FileWriter("");

fr = new FIleReader("");

char[] buf = new char[1024];

int len = 0;

while((len = fr.read(buf)) != -1) {

fw.write(buf,0,len);

}

} catch(IOException e) {

} finally {

if(fw != null) {

try {

fw.close();

} catch(IOException e) {

}

}

if(fr != null) {

try {

fr.close();

} catch(IOException e) {

}

}

}

}

二:字符流的缓冲区(为了提高流的读写效率):BufferedWriter,BufferReader

创建缓冲区之前必须先有流对象

BufferedWriter:

BufferedWriter bw = new BufferedWriter(fw);

bw.write("adsf");

bw.flush();//使用缓冲区必须要使用flush()刷新

bw.close();//关闭缓冲区就是关闭缓冲区中的流对象,所以不必有fw.close();

//fw.close();

BufferedReader:

BufferedReader br = new BufferedReader(fr);

String line = null;

while((line = br.readLine()) != null) {

}

//readLine()返回值不包含任何行终止符

创建自己的缓冲区:

class MyBufferedReader extends Reader {

private Reader r = null;

public MyBufferedReader(Reader r) {

this.r = r;

}

publci String MyReadLine() threws IOException {

StringBuilder sb = new StringBuilder();

int ch = 0;

while((ch=fr.read())!=-1) {

if(ch=='\r')

continue;

if(ch=='\n')

return sb.toString();

sb.append((char)ch);

}

if(sb.length()!=0)

return sb.toString();

return null;

}

//要覆盖父类的方法

public int read(char[] cbuf, int off, int len) threws IOException {

r.read(cbuf,off,len);

}

public void close() threws IOException {

r.close();

}

public void MyClose() threws IOException {

r.close();

}

}

装饰设计模式:对已有对象进行功能增强,可以定义类,

将已有对象传入(构造方法)基于已有的功能提供加强的功能。

该类称为装饰类。

装饰与继承的区别:F:\java图片\j2se\IO流\装饰与继承.png

三:字节流

字节流不用刷新

定义字节流的缓冲区

public class MyBufferedInputStream {

private InputStream in;

private byte[] ch = new byte[1024];

private int count = 0,pre = 0;

private byte b;

MyBufferedInputStream(InputStream in) {

this.in = in;

}

public int MyRead() throws IOException {

if(count ==0) {

count = in.read(ch);

pre = 0;

if(count < 0 ) {

return -1;

}

b = ch[pre];

pre++;

count--;

return b&255;

}

else {

b = ch[pre];

pre++;

count--;

return b&255;

}

}

public void MyClose() throws IOException {

in.close();

}

}

四:转换流

(InputStreamReader是字节流通向字符流的桥梁)

(OutPutStreamWriter是字符流通向字节流的桥梁)

class TranStream{

public static void main(String args[]) {

//获取键盘录入对象

InputStream in = System.in;

//将字节流对象转换为字符流,使用转换流InputStreamReader

InputStreamReader isr = new InputStreamReader(in);

BufferedReader bufr = new BufferedReader(isr);

//以上三句可以合并为下面一句

BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));

//BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));

/*

//BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));

BufferedReader bufr = new BufferedReader(new InputStreamReader(new FileInputStream("e:\\test\\01.txt")));

BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));

//BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream("e:\\test\\01.txt")));

*/

String line = null;

while((line = bufr.readLine() != null) {

if("over".equals(line))

break;

System.out.println(line);

/*

bufw.write(line.toUpperCase());

bufw.newLine();

bufw.flush();

*/

}

bufr.close();

}

}

转换流:字符和字节之间的桥梁,通常,涉及到字符编码转换时使用

五:流操作的基本规律

1,明确源和目的

源:输入流:InputStream Reader

目的:输出流:OutputStream Writer

2,明确操作的数据是否是纯文本

是:字符流

不是:字节流

3,再明确要使用哪个具体对象

通过设备来区分:

源设备:内存,硬盘,键盘

目的设备:内存,硬盘,控制台

4,是否需要提高效率(可以利用缓冲区技术提高效率)

六:File

1,4个构造方法

2,File类的常见方法

创建:boolean createNewFile()

boolean mkdir()

boolean mkdirs()

删除:boolean delete()/void deleteOnExit()在虚拟机终止时,请求删除此抽象路径名表示的文件或目录。

判断: boolean exists()测试此抽象路径名表示的文件或目录是否存在。

boolean isFile()

boolean isDirectory()

获取信息:getName()/getAbsolutePath()/getPath()/lastModified()

getParent();返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null。

七:Properties

是集合中和IO技术相结合的集合容器

该对象可以用于键值对形式的配置文件
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: