---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------
1、IO流: java中对数据的操作都是通过流的方式,用来处理设备(硬盘,控制台,内存)间的数据。
2、IO流常用子类:
字节流
OutputStream:字节写入流抽象类
|--->FileOutputStream: 字节写入流
|--->BufferedOutputStream:字节写入流缓冲区
|--->PrintStream:打印流
InputStream:字节读取流抽象类
|--->FileInputStream: 字节读取流
|--->BufferedInputStream:字节读取流缓冲区
字符流
Writer:字符写入流的抽象
|--->FileWriter:字符写入流
|--->BufferedWriter:字符写入流缓冲区
|--->OutputStreamWriter:字符通向字节的转换流(涉及键盘录入时用)
|--->OutputStreamWriter: 打印流,可处理各种类型的数据
Reader: 字符读取流的抽象类
|--->FileReader: 字符读取流
|--->LineNumberReader: 跟踪行号的缓冲字符读取流
|--->BufferedReader:字符读取流缓冲区
|--->InputStreamReader:字节通向字符的转换流(涉及键盘录入时用)
例
在硬盘上创建一个文件并写入信息
用字符写入流:FileWriter
FileWriter fw = new FileWriter("d:\\filewriter.txt");
fw.write("输入信息");
fw.write("也可以写入字符数组".toCharArray());
fw.flush();
fw.close();
在原有文件上续写数据
FileWriter fw = new FileWriter("d:\\filewriter.txt",true);
fw.write("还可以续写信息");
fw.write("也可以写入字符数组".toCharArray());
fw.flush();
fw.close();
读取硬盘上的文本文件,并将数据打印在控制台
FileReader fr = new FileReader("d:\\filewriter.txt");
一个一个字节的读
int ch =0;
ch =fr.read();
sop((char)ch);
fr.close();
利用数组来提高效率
char[] buf= new char[1024];
int len =0;
while((len= fr.read(buf))!=-1) {
sop(new String(buf,0,len));
fr.close();
拷贝文本文件
利用缓冲区提高数据读写效率
(无缓冲区就相当于一滴一滴的喝水,有缓冲区就相当于一杯一杯的喝水)
BufferedReader bufr = new BufferedReader(new FileReader("d:\\filewriter.txt"));
BufferedWriter bufw = new BufferedWriter(new FileWriter("d:\\copyfilewriter.txt"));
Stringline = null;
while((line= bufr.readLine())!=null) {
burw.write(line);
bufw.newLine();
bufw.flush();
}
bufr.close();
bufw.close();
字节流:字节流写入时没有刷新
在硬盘上创建一个文件并写入信息
FileOutputStream fos = new FileOutputStream("d:\\filestream.txt");
fos.write(97);//写入一个字节,int:97代表写入char:a
fos.write("也可以写入字节数组".getBytes());
fos.close();
在硬盘已有文件上续写数据
FileOutputStream fos = new FileOutputStream("d:\\filestream.txt",true);
fos.write(" ".getBytes());fos.close();
读取硬盘上的文件
FileInputStream fis = new FileInputStream("d:\\filestream.txt");
一个字节一个字节的读
int ch =0;
while((ch= fis.read())!=-1){
sop((char)ch);
}
利用字节数组读(提高效率)
byte[] buf = new byte[1024];
int len =0;
while((len= fis.read())!=-1) {
sop(newString(buf,0,len));
}
拷贝字节文件,如图片或者MP3或者电影
不带缓冲区
FileInputStream fis = new FileInputStream("d:\\1.mp3");
FileOutputStream fos = new FileOutputStream("d:\\copy1.mp3");
byte[] buf = new byte[1024];
int len =0;
while((len = fis.read(buf))!=-1) {
fos.(buf,0,len);//字节流写入不需刷新
}
fis.close();
fos.close();
带缓冲区,高效
BufferedInputStream bufi = new BufferedInputStream(new FileInputStream("d:\\1.mp3"));
BufferedOutputStream bufo = new BufferedOutputStream(new FileOutputStream("d:\\copy1.mp3"));
int ch =0;
while((ch= bufi.read())!=-1) {
bufo.write(ch);
}
bufi.close();
bufo.close();
流操作的规律:
流操作的难点:流对象很多,不知道具体用哪个
第一步:先明确源和目的
源:
文本:用Reader
字节:用InputStream
目的:
文本:用Writer
字节:用OutputStream
第二步:明确是不是纯文本
是:用字符流;
不是:用字节流
第三步:明确流体系后,通过设备来明确具体使用哪个流对象
源设备:
键盘:System.in
硬盘:文件流File
内存:数组流ArrayStream
目的设备:
键盘:System.out
硬盘:文件流File
内存:数组流ArrayStream
IO中的其他流:
打印流:
PrintWriter:字符打印流
构造方法:
PrintWriter(String fileName),创建具有指定文件名称且不带自动刷新的新 PrintWriter。
PrintWriter(File file),使用指定文件创建不具有自动行刷新的新 PrintWriter。
PrintWriter(Writer out),创建不带自动刷新的新 PrintWriter。
PrintWriter(Writer out, boolean autoFlush),自动刷新
PrintWriter(OutputStream out),根据现有的OutputStream创建不带自动刷新的新 PrintWriter。
PrintWriter(OutputStream out, boolean autoFlush),自动刷新
方法:
PrintWriter append(char c),将指定字符添加到此 writer。
void close() ,关闭该流并释放与之关联的所有系统资源。
void flush(),刷新该流的缓冲。
void print(Object obj),打印对象。
void print(String s), 打印字符串。
void println(),通过写入行分隔符字符串终止当前行。
PrintStream:字节打印流
构造方法:
PrintStream(String fileName),创建具有指定文件名称且不带自动刷新。
PrintStream(File file), 创建具有指定文件且不带自动刷新。
PrintStream(OutputStream out),创建新的打印流。
PrintStream(OutputStream out, boolean autoFlush), 创建新的打印流。
方法:
PrintWriter append(char c),将指定字符添加到此 writer。
void close(), 关闭该流并释放与之关联的所有系统资源。
void flush(),刷新该流的缓冲。
void print(Object obj),打印对象。
void print(String s), 打印字符串。
void println(), 通过写入行分隔符字符串终止当前行。
管道流:
PipedInputStream
PipedOutputStream
随机访问文件:RandomAccess
通过skipByte(intx)和seek(int x)来达到随机访问文件, 该类不是IO体系子类,而是直接继承Object,但它是IO包中的成员,该类内部封装了数组,而且通过指针对数组的元素进行操作,可以通过getFilePoint获取指针位置,同时可以通过seek改变指针位置,该类内部封装了字节输入输出流,该类只能操作文件;
"r":只读
"rw":读写
构造方法:
RandomAccessFile(File file, String mode),创建从中读取和向其中写入(可选)的随机访问文件流,该文件由 File参数指定。
RandomAccessFile(String name, String mode),创建从中读取和向其中写入(可选)的随机访问文件流,该文件具有指定名称。
方法:
void write(byte[] b),将b.length个字节从指定 byte数组写入到此文件,并从当前文件指针开始。
void write(byte[] b, int off, int len),将 len个字节从指定 byte数组写入到此文件,并从偏移量 off处开始。
void write(int b) ,向此文件写入指定的字节。
int read(),从此文件中读取一个数据字节。
int read(byte[] b) ,将最多b.length个数据字节从此文件读入 byte数组。
int read(byte[] b, int off, int len) ,将最多len个数据字节从此文件读入 byte数组。
String readLine(),从此文件读取文本的下一行。
long getFilePointer() ,返回此文件中的当前偏移量。
long length(),返回此文件的长度。
void seek(long pos) ,设置到此文件开头测量到的文件指针偏移量,在该位置发生下一个读取或写入操作。
操作基本数据类型的流对象:DateStream
操作字节数组流:
ByteArrayInputStream
ByteArrayOutputStream
---------------------- <a href="http://edu.csdn.net"target="blank">ASP.Net+Android+IOS开发</a>、<a href="http://edu.csdn.net"target="blank">.Net培训</a>、期待与您交流! ----------------------详细请查看:<a href="http://edu.csdn.net" target="blank"> http://edu.csdn.net </a>