黑马程序员技术交流社区
标题:
IO流对象梳理
[打印本页]
作者:
熊永标
时间:
2013-1-14 12:26
标题:
IO流对象梳理
IO流是InputStream和Outputstream的缩写,即输入输出流。
java流分为字节流和字符流。
字节流。即用于操作字节数据流,用于处理此流的对象有:inputStream体系和OutputStream体系,其下常用的类有:
1)、文件处理类:FileInputStream,FileOutputStream
2)、字节缓冲区类:ByteArrayInputStream,ByteArrayOutputStream。
字符流。即读取字节数据时不操作,而是将其缓存起来,在查编码表得到字符后再进行基于字符的处理叫字符流。字符流有Reader体系和Writer体系,其下最常用的类有:
1)文件处理类:FileReader,FileWriter.
2) 字符缓冲区类:BufferedReadr,BufferedWriter
转换流。字节流转换为字符流或相反就是统称:转换流。转换流是属于字符流的体系,通过转换流,就可以将有效的数据中进行数据流的转换。还可以将数据编解码。转换流是字
节流和字符流的桥梁。常用的类有:
1)InputstreamReader,OutputStreamWriter。他们的构造函数中接受字节流对象。
作者:
jonn
时间:
2013-1-14 13:48
既然LZ梳理IO流对象,这里我也学习学习,补通java文件流读写文件需要注意的几点....
1.Reader/Writer 读写二进制文件有问题 下面我写个代码示例下
<div class="blockcode"><blockquote>public void copy{
File src = new File("d:"+File.separator+"a.txt");
File dst = new File("d:"+File.separator+"b.txt");
BufferedReader in = null;
BufferedWriter out = null;
try {
in = new BufferedReader(new FileReader(src));
out = new BufferedWriter(new FileWriter(dst));
String line = null;
while((line = in.readLine()) != null) { // 一行一行的读取文件a.txt
out.write(line+"/r/n"); //把读取的数据写入到b.txt
} // 问题就这这里,需要注意,若文件a.txt 是ASCII编码格式,则内容能够正确读取,若文件是二进制,读写后的文件与读写前的文件
}catch (Exception e) { // 有很大的区别,我把 readLine() 改写 read(char[]) 仍然不能正确读写二进制文件,下面又是需要注意的几点,看代码实例
e.printStackTrace();
}finally {
if(in != null) {
try {
in.close(); //关闭流
}catch (Exception e) {
e.printStackTrace();
}
}
if(out != null) {
try {
out.close(); //关闭流
}catch (Exception e) {
e.printStackTrace();
}
}
}
复制代码
2. read[byte[] b,int offset,int length] ,注意offset 不是指全文件的全文,是字节数组b的偏移量,相当于c语言的文件指针
现在晓得Reader/Writer不能读取二进制文件,Reader/Writer是字符流,只能用BufferInputStream/BufferOutputStream
上面的代码改了 一下,请看....
public void copy{
File src = new File("d:"+File.separator+"a.txt");
File dst = new File("d:"+File.separator+"b.txt");
BufferedInputStream in = null;
BufferedOutStream out = null;
try {
in = new BufferedInputStream(new FileReader(src));
out = new BufferedOutputStream(new FileWriter(dst));
byte[] b=new byte[1024];
int offset=0;
int length=-1;
while((length=in.read(b,offset,1024))!=-1) { // 一行一行的读取文件a.txt,每次读取1024字节,然后写入1024字节
复制代码
3. 在用length=(read,b,0,1024) 读取数据时候,应该使用write(b,0,length)来写最好 上面修改部分代码
int len=-1;
byte[] b=new byte[10];
while((len=in.read(b))!=-1){
out.wirte(b,0,len);
}
4. flush() 和 close
写入缓冲区后,很多内容停留在内存里,而不是在文件里,数据有可能丢失,再用close()中调用flush(),文件一旦写完后关闭文件流close().
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2