黑马程序员_日记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技术相结合的集合容器
该对象可以用于键值对形式的配置文件
字节流: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技术相结合的集合容器
该对象可以用于键值对形式的配置文件
相关文章推荐
- 黑马程序员_IO_02
- JAVA高级视频02_IO输入与输出日记3(02-06到10)
- JAVA高级视频02_IO输入与输出日记4(02-11到12)
- 黑马程序员 IO的学习日记
- 黑马程序员_学习日记十_IO二
- 黑马程序员--Java学习日记之IO(异常处理与finally)
- 黑马程序员_IO回顾02
- JAVA高级视频02_IO输入与输出日记1(02-01到02—03)
- JAVA高级视频02_IO输入与输出日记5(02-13到15)
- 黑马程序员_学习日记九_IO一
- 黑马程序员-java自学笔记02之IO字节流写入和读取
- JAVA高级视频02_IO输入与输出日记2(02-04到05)
- 黑马程序员 学习日记(十)
- 黑马程序员_学习日记8_HTML
- 黑马程序员学习日记--多线程
- 黑马程序员——学习日记之--Java全面基础
- 黑马程序员——IO(Input Output)流(一)
- 黑马程序员——基础学习--- Io异常处理方法
- 黑马程序员--第二阶段Java高级IO--第19天
- 黑马程序员————IO_字符流_指定编码表读取字符