---------------------- android培训、java培训、期待与您交流! ----------------------
1.什么是io流?
io包括输入和输入流,输入流指的是将数据以字符或字节形式从外部媒介比如文件、数据库等读取到内存中所有也分为字符输入流和字节输入流。
输入流指的是将内存中的数据写入外部媒介,也分为了字符输出流和字节输入流。
2.使用io流总结
io流:用于处理设备上的数据。
设备:硬盘,内存,键盘录入。
io有具体的分类:
1.根据处理的数据类型不同:字节流和字符流
2.根据流向不同:输入流和输出流
字节流和字符流的区别:
1.字节流读取的时候,读到一个字节就返回一个字节。字符流使用了字节流杜鳌一个活多个字节时,先去查指定编码表,将查到的字符返回。
2.字节流可以处理是哟有类型数据,如图片,mp3,avi等,而字符流只能处理字符数据
io的体系,所具备的基本功能就有两个:读和写
1.字节流
inputStream(读),outputStream(写)。
2.字符流:
Reader(读),Writer(写)。
Reader中的常见方法:
int read(); //读取一个字符,就返回的是读到的那个子字符,如果读到流的末尾,返回-1;
int read(char[]); //将读到的字符存入指定的数组中,返回的是读到到子都的个数,也就是往数组里装的元素的个数,如果读到流的末尾,返回-1.
close();// 读取字符其实用的是系统的功能,就希望使用完毕后,进行资源的释放
Writer中常见的方法:
write(ch);//将一个字符写入到流中。
write(char[]);// 将一个字符数组写入到流中
write(String);//将一个字符串写入到流中
flush();//刷新流,将流中的数据刷新到目的地中,流还存在
close();//关闭资源,在关闭前会先调用flush方法,刷新流中的数据去目的地,然后流关闭。
FileWirter:
该类没有特有的方法,只有自己的构造函数。
该类特点在于,
1.用于处理文本文件。
2.该类中又默认的编码表,
3.该类中又临时缓冲。
构造函数:在写入流对象初始化时。必须要有一个存储数据的目的地。
FileWriter(String filename);//调用系统资源。在指定位置穿件一个文件,如果该文件已经存在,将会被覆盖
FileWriter(String filename,boolean append);//当传入的boolean类型值为true时,会在指定文件末尾处进行数据的续写
FileReader:
1.用于读取文本文件的流对象
2.用于关联文本文件
FileReader(String filename); //在读取流对象初始化的时候,必须要猴子腚一个被读取的文件。如果该文件不存在会发生FileNotFoundException
代码示例;
class Demo{
public static void main(String[] args)throws IOException {
FileWriter fw = new FileWrier("test.txt");
fw.write("asfsdf");
fw.flush();
fw.write("sdsfsdf");
fw.close();
}
}
对于读写或者写入流对象的构造函数,以及读写方法,还有刷新关闭功能都会抛出IOxception或其子类。
字符流的缓冲区:
缓冲区的出现提高了对流的操作效率。
原理:其实就是将数字进行封装:
对应的对象:
BufferedWriter:
特有方法:
newLine();//跨平台的换行符
BufferedReader:
特有方法:
readLine();//一次赌一行,到行标记时,将航标机之前的字符数据作为字符串返回,当读到末尾时,返回null
在使用缓冲区对象时,要明确,缓冲的存在是为了增强流的工呢过而存在,
所以在建立缓冲区对象时,要先有流对象村子啊。
其实缓冲内部就是在使用流对象的方法,只不过假如了数组对数据惊醒了临时存储,为了提高操作数据的效率。
代码上的体现:
写入缓冲区对象。
BuffereWriter bufw = new Buffed Writer(new FileWriter("test.txt")); //建立缓冲区对象必须把流对象作为参数传递给缓冲区的构造函数
bufw.write("adfd"); //将数据写入到了缓冲区。
bufw.flush();//对缓冲区的数据进行刷新,将数据刷到目的地中
bufw.close();//关闭缓冲区,其实关闭的是被包装在内部的流对象
BufferedReader bufr = new BufferedReder(new FileReader("buf.txt"));
String line = null;
//按照行的形式取出数据,取出的每一个行数据不包含回车符。
While((line = bufr.readLine())!=null){
System.out.println(line);
}
bufr.close();
练习:通过缓冲区的形式,对文本进行拷贝。
poublic static void main(String args){
BufferedReader bufr = new BufferedReader(new FileReader("a.txt"));
BufferedWriter bufw = new BufferedWriter(new FileWriter("b.txt"));
String line = null;
while((line=bufr.readLine())!=null){
bufw.write(line);
bufw.newLine();
bufw.flush();
}
bufw.close();
bufr.close();
}
readLine();
其实缓冲区中的该方法,用的还是与缓冲区关联的流对象的read方法。
只不过,每一次读到一个字符,先不进行具体操作,先进行临时存储。
当读取到回车暴击时,将临时日容器中存储的数据一次性返回。
抽象基类:inputStream,outputStream.
字节流可以操作任何数据
注意:字符流使用的数组时字符数组char[]
字节流使用的数组是字节数组byte[]
FileOutputStream fos = new FileOutputStream("a.txt");
fos.write("adfaf");直接将数据写入到了目的地
fos.close();//值关闭资源
FileImputStream fis = new FileInputStream("a.txt");
//如果文件不大,可以这样操作
转换流;
特点:
1.是字节流和字符流之间的桥梁
2.该流对象中可以对读取到的字节数据惊醒指定编码表的编码装换。
什么时候使用呢?
1.当字节和字符或字节之间有转换动作时
2.流操作的数据需要进行编码表的指定时
具体的对象体现;
1.InpuStreamReader:字节到字符的桥梁
2.OutputStreamWriter: 字符到字节的桥梁
这两个流对象是字符流体系中的成员
那么他们有转换作用,而本身又事字符流,所以在构造的时候,需要传入字节流对象进来
构造函数:
inputStreamReader(InputStream);//通过该构造函数初始化,使用的是本系统默认的编码表GBK
InputstreamReader(InputStream in,String chaeSet);//通过该构造函数初始化,可以指定编码表
outputstreamWriter(OutputStream);//通过该构造函数初始化,使用的是本系统默认的编码表GBK
outputstreamWriter(OutputStream out,String CharSet);//通过该构造啊哈念书初始化,可以指定编码表
Fiel类:
该类的出现是对文件系统中的文件以及文件夹进行对象的封装。
可以通过对象的思想来操作文件以及文件夹
1.构造函数:
file(String parent,String child);
File(File parent,String child);
常见方法:
boolean createNewFile(); //创建文件,如果被穿件的文件已经存在,则不创建
boolean mkdir();//创建文件夹。
boolean mkdirs();//创建多级文件夹。
boolean delete();//可用于删除文件或者文件夹
void deleteOnExit();//删除文件动作交给系统完成,无论是否发生异常,刺痛在推出时执行删除动作。
boolean exists(); //判断文件或者文件是否存在
boolean isFile(); //判断File对象中封装的是否是文件
boolean isDirectory();//判断Dile对象中封装的是否是文件夹
boolean isHidden();//判断文件或者文件夹是否隐藏,在获取硬盘文件或者文件夹时,对于系统目录中的文件,java是无法访问的,所以在遍历,可以避免遍历隐藏文件
getName(); //获取文件或者文件夹的名称。
getpath();//file对象中封装的路径是什么,获取的就是什么。
long length();//获取文件大小
long lastModified();//获取文件或者文件最后一次修改的时间
递归:
其实就是在使用一个功能过程中,又对该功能有需求。
就出现了函数自身调用自身
注意:
1.一定要限定条件,否则内存溢出
2.使用递归时,调用次数不要过多,否则也会出现内存溢出
Io包中其他对象;
1.打印流.
printStream:
是一个字节打印流,System.out对应的类型就是PrintStream。它的构造函数可以接受三种数据类型的值
1.字符串路径
2.File对象
3.OutpoutStream
printWriter:
是一个字符打印流,构造函数可以接受四种类型的值
1.字符串路径
2.File对象
3.outputStream
4.Writer
管道流;
PipedinputStream
pipedOutputStream
特点:
读取管道流和写入管道里可以进行连接
连接方式:
1.通过两个流对象的构造函数。
2.通过两个对象的connect方法
通常两个流在使用时,需要加入多线程技术,也就是让读写同时运行。
注意:对read方法,该方法是阻塞式的,也就是没有数据的情况,该方法会等待
---------------------- android培训、java培训、期待与您交流! ----------------------