------- android培训、java培训、期待与您交流! ----------
IO(Input Output)流: IO流用来处理设备之间的数据传输,Java通过流对数据进行操作。流按操作数据分为字节流和字符流
close()和flush()的区别:
flush():将缓冲区的数据刷到目的地中后,流可以使用。
close():将缓冲区的数据刷到目的地中后,流就关闭了,该方法主要用于结束调用的底层资源。这个动作一定做public static void main(String[] args) {
FileWriter fw = null;
try {
fw = new FileWriter("demo.txt",true);// FileWriter(File file, boolean append) 如果为 true,则将数据写入文件末尾处,而不是写入文件开始处
fw.write("abcde");
}
catch (IOException e ){
System.out.println(e.toString()+"....");
}
finally{
if(fw!=null)
try{
fw.close();
}
catch (IOException e){
System.out.println("close:"+e.toString());
}
}
}
import java.io.*;
class FileReaderDemo {
public static void main(String[] args) throws IOException {
/*
创建可以读取文本文件的流对象,FileReader让创建好的流对象和指定的文件相关联。
*/
FileReader fr = new FileReader("demo.txt");
int ch = 0;
while((ch = fr.read())!= -1) { //条件是没有读到结尾,返回 -1 ,标志读到结尾
System.out.println((char)ch); //调用读取流的read方法,读取一个字符。
}
fr.close();
}
}
读取数据方式二(较为高效,自定义缓冲区):
import java.io.*;
class FileReaderDemo2 {
public static void main(String[] args) throws IOException {
FileReader fr = new FileReader("demo.txt"); //创建读取流对象和指定文件关联。
char[] buf = new char[8192]; //因为要使用read(char[])方法,将读取到字符存入数组。所以要创建一个字符数组,一般数组的长度都是1024的整数倍。
int len = 0;
while(( len=fr.read(buf)) != -1) {
System.out.println(new String(buf,0,len));
}
fr.close();
}
}
IO中的使用到了一个设计模式:装饰设计模式
装饰设计模式解决:对一组类进行功能的增强
包装:写一个类(包装类)对被包装对象进行包装
1、包装类和被包装对象要实现同样的接口;
2、包装类要持有一个被包装对象;
FileInputStream:从文件系统中的某个文件中获得输入字节。哪些文件可用取决于主机环境。FileInputStream用于读取诸如图像数据之类的原始字节流。要读取字符流,请考虑使用 FileReader
FilterInputStream:包含其他一些输入流,它将这些流用作其基本数据源,它可以直接传输数据或提供一些额外的功能OutputStream:此抽象类是表示输出字节流的所有类的超类。
FileOutputStream:文件输出流是用于将数据写入File或FileDescriptor的输出流
FilterOutputStream:此类是过滤输出流的所有类的超类
BufferedOutputStream:该类实现缓冲的输出流FileReader fr = newFileReader("bufdemo.txt");
BufferedReaderbufr = new BufferedReader(fr);
String line = null;
while((line=bufr.readLine())!=null){ //readLine方法返回的时候是不带换行符的。
System.out.println(line);
}
bufr.close();
BufferedReader bufr = new BufferedReader(newInputStreamReader(System.in));
BufferedWriter bufw = newBufferedWriter(new OutputStreamWriter(System.out));流的操作规律:
1,明确源和目的。
数据源:就是需要读取,可以使用两个体系:InputStream、Reader;
数据汇:就是需要写入,可以使用两个体系:OutputStream、Writer;
2,操作的数据是否是纯文本数据?
如果是:数据源:Reader
数据汇:Writer
如果不是:数据源:InputStream
数据汇:OutputStream
3,虽然确定了一个体系,但是该体系中有太多的对象,到底用哪个呢?
明确操作的数据设备。
数据源对应的设备:硬盘(File),内存(数组),键盘(System.in)
数据汇对应的设备:硬盘(File),内存(数组),控制台(System.out)。
4,需要在基本操作上附加其他功能吗?比如缓冲。
如果需要就进行装饰。
转换流的最强功能就是基于 字节流 + 编码表 。没有转换,没有字符流
凡是操作设备上的文本数据,涉及编码转换,必须使用转换流:
InputStreamReader isr = newInputStreamReader(new FileInputStream("a.txt"),"gbk");
File类
将文件系统中的文件和文件夹封装成了对象。提供了更多的属性和行为可以对这些文件和文件夹进行操作。这些是流对象办不到的,因为流只操作数据
掌握File类的常见操作方法:
getAbsolutePath() 返回此抽象路径名的绝对路径名字符串
mkdir()创建此抽象路径名指定的目录
createNewFile() 当且仅当不存在具有此抽象路径名指定名称的文件时,不可分地创建一个新的空文件
递归:就是函数自身调用自身
应用场景:当一个功能被重复使用,而每一次使用该功能时的参数不确定,都由上次的功能元素结果来确定。
简单说:功能内部又用到该功能,但是传递的参数值不确定。(每次功能参与运算的未知内容不确定)
注意:递归时一定要明确结束条件
Java.util.Properties:一个可以将键值进行持久化存储的对象。Map--Hashtable的子类
用于属性配置文件,键和值都是字符串类型
特点:1:可以持久化存储数据。2:键值都是字符串。3:一般用于配置文件
PrintWriter out = new PrintWriter(new FileWriter("out.txt"),true);//设置true后自动刷新,把数据写到文件中,自动刷新