------- android培训、java培训、期待与您交流! ----------
一、打印流:该流提供打印方法,可以将各种数据类型都原样打印
printstream,字节打印流,可以直接操作文件
构造函数可以接收的参数类型:1.file对象,2.字符串路径,3.字节输出流outputstream
printwriter字符打印流:
构造函数可以接收的参数类型:1.file对象,2.字符串路径,3.字节输出流outputstream,4.字符输出流,更加常用
BufferedReaderbufr=new BufferedReader(new InputStreamReader(System.in));
// PrintWriter pw=new PrintWriter(System.out,true);
PrintWriter pw=new PrintWriter(new FileWriter("file.txt",true),true);
//true,自动刷新,只针对流而言,而system。out可以换为newfilewriter(file.txt)
//第一个true,表示文件续写,第二个true表示文件自动刷新
String s=null;
while((s=bufr.readLine())!=null){
if("over".equals(s))
break;
pw.println(s);
}
pw.close();
bufr.close();
二、序列流(合并流)SequenceInputStream
可以将多个流对象拼接成一个流对象,多个源对应一个目的
Vector<FileInputStream>v=new Vector<FileInputStream>();
v.add(new FileInputStream("1.txt"));
v.add(new FileInputStream("2.txt"));
v.add(new FileInputStream("3.txt"));
Enumeration<FileInputStream> elements = v.elements();
SequenceInputStream sis=new SequenceInputStream(elements);
FileOutputStream fos=new FileOutputStream("4.txt");
byte[] b=newbyte[1024];
int len=0;
while((len=sis.read(b))!=-1){
fos.write(b,0,len);
}
fos.close();
sis.close();
合并流第二种方式:采用arraylist转换为enumeration类
public static void merge() throws IOException {
ArrayList<FileInputStream> al=new ArrayList<>();
for(int i=0;i<=3;i++){
al.add(new FileInputStream("c:\\file||"+i+".part"));
}
final Iterator<FileInputStream>it=al.iterator();
新建一个enumeration来装arraylist里面的元素
Enumeration<FileInputStream> en=new Enumeration<FileInputStream>(){
@Override
public boolean hasMoreElements() {
return it.hasNext();
}
@Override
public FileInputStream nextElement() {
return it.next();
}
};
SequenceInputStream sis=new SequenceInputStream(en);
}
三、随机访问读取文件randomaccessfile
读写都可以,通过指针操作,它不是IO体系中的子类,它直接继承Object,它是IO包中的成员,它具备读写功能,内部封装了数组,而且通过指针对数组的元素操作,可以通过getfilepointer获取指针位置,同时可以通过SEEK改变指针的位置,完成读写的原理,自己内部封装了输入流和输出流
通过构造函数可以看出,该类只能操作文件,而且操作文件还有模式
RandomAccessFileraf=new RandomAccessFile("ran.txt","rw");
raf.seek(8);//调整指针
raf.skipBytes(8);//跳过指定的字节,只能往后跳
byte[] b=newbyte[8];
raf.read(b);
String name=new String(b);
int age=raf.readInt();
raf.close();
RandomAccessFile raf=new RandomAccessFile("ran.txt","rw");//new的时候不覆盖文件
raf.seek(8*3);
raf.write("周期".getBytes());
如果模式为只读r,则不会创建文件,如果模式为rw的话,则可以自动创建
所以它可以实现数据的分段写入:可以一个线程写入一段,比如多线程的下载
四、操作基本数据类型的DataStream
用于操作基本数据类型的流对象
DataOutputStreamdos=new DataOutputStream(new FileOutputStream("data.txt"));
dos.writeInt(356);
dos.writeBoolean(true);
dos.close();
DataInputStreamdis=
new DataInputStream(new FileInputStream("data.txt"));
int a=dis.readInt();
booleanbo=dis.readBoolean();
dis.close();
总结,操作基本数据类型就可以用这个流
五、操作字节数组
ByteArrayInputStream在构造的时候需要接收数据源,而且数据源是一个字节数组
ByteArrayOutputStream在构造的时候不用定义数据目的,因为该对象内部已经封装了可变长度的字节数组
因为这两个流对象都操作数组,没有使用系统资源,所以不用关闭流
流操作规律为:
源设备:
键盘system.in 硬盘filestream内存arraystream
目的设备
键盘system.out 硬盘filestream内存arraystream
这就是用流的读写思想来操作数组
六、操作字符数组和字符串
CharArrayReader 和CharArrayWriter
StringReader和StringWriter