---------android培训、java培训、期待与您交流! ----------
一,字符流的缓冲区:提高对数据的读写效率
1.对应的类:BufferedReader、BulideredWriter,使用缓冲区之前,必须先有流对象
2.使用步骤:先创建流对象,再创建对应缓冲区,写入或读取内容,关闭缓冲区
写:①FileWriter fw = new FileWriter("buf.txt"); //指定路径文件如不存在会自动创建,若存在会覆盖该文件
②BufferedWriter bufw = new BufferedWriter(fw);
③bufw.write("abcdef"); //
bufw.newLine();//跨平台的换行方法
bufw.flush();//写一次,刷新一次
④bufw.close();//关闭缓冲区其实就是关闭流对象了
读:①FileReader fr = new FileReader("mudi.txt");//指定文件必须存在
②BufferedReader bufr = new BufferedReader(fr);
③String line = null;
while((line=bufr.readLine())!=null){
System.out.println(line);
}
④bufr.close();
3.复制文本文件
BufferedReader bufr = null ;
BufferedWriter bufw = null ;
try:bufr = new BufferedReader(new FileReader("buf.txt"));
bufw = new BufferedWriter(new FileWriter("copy.txt"));
String line =null;
while((line=bufr.readLine())!=null){
bufw.write(line);
bufw.newLine();
bufw.flush();
}
catch:IOException
finally:
try{
if(bufr!=null){
bufr.close();
}
}catch(IOException e){ ....}
try{
if(bufw!=null){
bufw.close();
}
}catch(IOException e){ ....}
4.装饰设计模式:自定义类,使用已有对象,基于已有功能,并提供加强功能,该类就称为装饰类
①装饰类通常通过构造函数接受被装饰对象,并基于被装饰对象,提供更强的功能
②装饰类和继承的区别:装饰模式比继承更灵活,避免了继承体系臃肿,而且还降低了类与类之间的联系
③自定义装饰类,继承Reader(实现Reader的抽象方法)
④带行号的装饰类:lineNumberReader类
5.字节流的读写:InputStream、OutputStream,操作步骤和字符流基本相符
用例:复制图片
操作步骤:
FileOutputStream fos = null;
FileInputStream fis = null;
try: fos = new FileOutputStream(new FileOutputStream("a.jpg"));
fis = new FileInputStream(new FileInputStream("b.jpg"));
byte[] buf = new byte[1024];
int num= 0;
while((num=fis.read(buf))!=-1){
fos.write(new String(buf,0,num));
}
catch:IOException e
finally: try{
if(fis!=null){
fis.close();
}
} catch(IOException e){......}
6.字节流的缓冲区(mp3的复制)
BufferedInputStream bufis = null;
BufferedOutputStream bufos = null;
try:bufis = new BufferedInputStream(new FileInputStream("a.mp3"));
bufos = new BufferedOutputStream(new FileOutputStream("b.mp3"));
int num =0;
while((num=bufis.read())!=-1){
bufos.write(num);
}
catch:IOException e
finally: try:bufis.close();
bufos.close();
7.自定义字符流缓冲区
read、write方法特点:read方法在提升,避免了-1,write方法在强转,保证源数据不变。
8.读取键盘录入
System.out:对应的标准输出设备,控制台; System.in:对应的标准输入设备,键盘。
BufferedWriter bufw = new BufferedWriter(new InputStreamReader(System.in));//源
BufferedReader bufr = new BuferedReader(new OutputStreamWriter(System.out));//目的
9.流操作的规律
①首先明确源和目的:源可以代表输入流InputStream,Reader;目的:输出流,OutputStream,Writer.
②明确操作的数据是不是纯文本,如果是,使用字符流,否则用字节流
③源设备包括:内存,硬盘,键盘;目的设备包括:内存,硬盘,控制台
小结:转换流使用场合:字符和字节流间的桥梁,涉及字符编码转换时。
10.其他
改变标准输出设备:System.setIn("输入流")、System.setOut("输出流").
异常日志信息:比较适用的是log4j
系统信息:Properties prop = System.getPeoperties();
prop.list(new PrintStream("info.txt"));
二,File类:将文件或文件夹封装成对象,便于操作文件或文件夹
1.File概述 : File f = new File("指定目录");//创建File对象
File对象的操作:
① 创建文件:boolean f.createNewFile();//若文件存在,不覆盖,返回false
② 删除文件:boolean f.delete();//如果有异常,可能会删除不成功
③ 判断文件:boolean f.exists();在判断isFile()是否是文件,idDirectory()是否是文件夹,isHidden()是否隐藏时,必须先判断文件是否存在
④ 获取:getName(),getAbsolutePath(),lastModified()
2.文件功能
File[] fs = File.listRoots(); //返回文件系统根
String[] names = f.list(); //指定文件或文件夹下的所有名称,包括隐藏文件,需要注意f 对象必须指定某个目录
File[] s = f.listFiles(); //得到目录中的文件
3.递归:函数自身调用自身,要注意的是①递归的限定条件 ②递归次数,避免内存溢出
用例:删除带内容的目录(原理是从里往外删除内容)
4.创建java文件列表
原理是:自定义方法、集合,先用listFiles()获得一个目录,遍历该目录再判断,如果该目录存在(f.isDirectory())则用递归再调用该方法,否则将后缀名为".java"的文件添加到list集合中,遍历该集合,将内容写到磁盘中即可
5.Properties类
概述:它是HashTable的子类,存储的是键值对字符串,具备map集合的特点。
特点:可以用于键值对形式的配置文件,是集合中和IO技术相结合的集合容器。
Properties prop = new Properties();
prop.setProperty("张三","30"); //设置一个键值对,输出结果是:张三=30
String value= prop.getProperty("张三"); //获得值
Set<String> names = prop.stringPropertyNames(); //获取所有key,返回一个Set泛型
存储配置文件
原理:用BufferedReader流读取到源文件,将文件用Properties对象的setProperty(arr[0],arr[1])进行存储
6.其他对象
打印流:该流提供了打印输出方法,它可以保证数据原样性将数据打印出
①字节打印流:PrintStream
它的构造函数可接受的类型有:File对象、字符串路径String、字节输出流OutputStream.
②字符打印流:PrintWriter(很常用,在web中通过它打印信息到客户端)
它的构造函数可接受的类型有:File对象、字符串路径String、字节输出流OutputStream、字符输出流Writer.
BufferedReader bufr = new BufferedReader(new IputStream(System.in));//获取键盘录入
PrintWriter out = new PrintWriter(System.out,ture);//字符输出流,指定true自动刷新
String line = null;
while((line=bufr.readLine())!=null){
out.println(line);//使用PrintWriter流对象直接输出语句即可
}
bufr.close();
out.close();
合并流(SequenceInputStream):多个流拼成一个流
切割文件
三,对象序列化(持久化):某一个介质能长期存储数据(硬盘)
1.ObjectOutputStream:
ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("obj.txt"));
oos.write(new Person对象("张三",22));//Person类需实现序列化接口
oos.close();
2. 管道流:可以对接到一起的对象,结合线程使用。
PipedInputStream pis = new PipedInputStream();
PipedOutputStream pos = new PipedOutputStream();
in.connect(out);//管道连接
....
3.随机访问文件:不是IO体系中的类,直接继承了Object,但它是IO包中的成员,它具有读和写的功能
RandomAccessFile:可以通过getFilePointer()获取指针,通过seek()改变指针位置.
完成读写的原理:在其内部封装了字节输入流和输出流;特点:只能操作文件,可以以指定模式对文件进行读写
RandomAccessFile rsf = new RandomAccessFile("a.txt","rw");//4种模式:r(只读) rw(读写) rws rwd
rsf.seek(8);//取指针 rsf.writeInt();
4.操作基本数据类型流对象DateStream
DateInputStream dis = new DateInputStream(new FileInputStream("utfdate.txt"));
DateOutputStream dos = new DateOutputStream(new FileOutputStream("date.txt"));
dos.writeInt(123); dos.writeBoolean(true);//怎么写
int num = dis.readInt(); boolean b =dis.readBoolean();//就怎么读
5.操作字节数组(ByteArrayStream):用于操作字节数组的流对象,不用关闭资源
ByteArrayInputStream bais = new ByteArrayInputStream("abcdef".getBytes());//需要数据源,即字节数组
ByteArrayOutputStream baos = new ByteArrayOutputStream();//可不指定目的
int len = 0;
while((len.bais.read())!=-1){
baos.write(len);
}
syso(baos.size());
6.字符编码:为了方便操作字符
String str = "联通";
编码:字符串变成字节数组,-->byte[] b = str.getByte();
解码:字节数组变成字符串,-->new String(b);
联通:byte[] by = str.getByte("gbk");
---------android培训、java培训、期待与您交流! ----------