IO
输入(input)与输出(output),Java语言在IO设计方面取得较大的成功,它是向对象的,主要采用装饰器模式避免大量的类,包括了最大的可能性,提供了较好的扩展机制。
流1
Java的IO主要包含三个部分:流式部分——IO的主体部分·非流式部分——主要包含一些辅助流式部分的类。文件读取部分的与安全相关的类以及与本地操作系统相关的文件系统的类
细管就是缓冲区 相当于漏斗
流2
Java中的流操作分为两种。基于字节流(InputStream读取,OutputStream与入)。字符(Reade读取,Writer写入)
Java IO流可以概括为:两个对应、一个桥梁两个对应指字节流(Byte Stream)和字符流(CharStream)的对应,输入流和输出流的对应。一个桥梁指从字节流到字符流的桥梁
流三
Java中,设计了四个抽象类来表示流:
。InputStream,字节流,读取数据
。OutputStream,字节流,写入数据
。 Reader,字符流,读取数据
。Writer,字符流,写入数据
其他多种多样变化的流均是继承了它们,并进行豪华装饰派生出来的加强版
File类
File类对象表示磁盘上的文件或目录。它提供了与平台无关的方法来对磁盘上的文件或目录进行操作。
public class FileDemo {
public static void main(String[] args) {
//File类 有参构造方法 字符串代表路径
File f1 = new File("d:\aa");
File f2 = new File("d:\aa\aab.txt");
File f3 = new File("d:\aa\bb");
File f4 = new File("d:\aa\bb\bba.txt");
try {
//.mkdir();创建文件夹 创建成功返回true 否则 else
boolean b1 = f1.mkdir();
//.createNewFile(); 创建文件 创建成功返回true 否则 else
boolean b2 = f2.createNewFile();
//.mkdirs();在文件夹下创建文件夹 创建成功返回true 否则 else
boolean b3 = f3.mkdirs();
//.createNewFile(); 创建文件 创建成功返回true 否则 else
boolean b4 = f4.createNewFile();
if(b1&&b2&&b3&&b4){
System.out.println("OK!!!!!!!");
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
FileInputStream
FilelnputStream提供了测试文件大小的方法available(),提供了关闭流的方法close(),使用read()方法从数据源中读取数据。可以使用缓冲区,通过指定byte[]b的大小来提高效率——如果不设计缓冲区,那么只能一个字节一个字节的读取率太低
可认为创建了一个瓢缓冲区),能盛放200毫升的水,使用这个瓢从缸里舀水到另外一个缸里,
到多少就倒多少肖.um计信止取水倒1Oml) ,如果什么也没有舀到,就停止取水
在使用的时候,操作完成后,注意关闭文件流
//字节流
public class InputStreamDemo {
public static void main(String[] args) {
//因为会出异常 提前声明 后初始化
//字节流写入
FileInputStream fis = null;
//字节流输出
FileOutputStream fos = null;
try {
//拿到需要读的内容
fis = new FileInputStream("d:\作业.png");
//放到哪里
fos = new FileOutputStream("d:\aa\11.jpg");
//定义一个byte数组提高读的效率 默认一次读 1b
byte[] b = new byte[1024];
//初始化长度
int length = 0;
try {
while ((length = fis.read(b)) != -1) {//把读的内容的长度赋给length 如果是 -1 就代表读完了 所以条件是 !=-1
fos.write(b, 0, length);//一次读多书写多少
}
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}finally {
try {
//流用完了 关闭流
fis.close();
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
缓冲区字节流
//带缓冲区的字节流
public class BufferedInputStreamDemo {
public static void main(String[] args) {
//因为会出异常 提前声明 后初始化
//字节流写入
FileInputStream fis = null;
//字节流输出
FileOutputStream fos = null;
//带缓冲区的字节流 写入
BufferedInputStream bis = null;
//带缓冲区的字节流 输出
BufferedOutputStream bos = null;
try {
//拿到需要读的内容
fis = new FileInputStream("d:\作业.png");
//放到哪里
fos = new FileOutputStream("d:\aa\22.jpg");
//用带缓冲区的包装一下 能够减少对磁盘进行的IO操作 提高效率
bis = new BufferedInputStream(fis);
bos = new BufferedOutputStream(fos);
//定义一个byte数组提高读的效率 默认一次读 1b
byte[] b = new byte[1024];
//初始化长度
int length = 0;
try {
while ((length = bis.read(b)) != -1) {//把读的内容的长度赋给length 如果是 -1 就代表读完了 所以条件是 !=-1
bos.write(b, 0, length);//一次读多书写多少
}
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}finally {
try {
//流用完了 关闭流
bis.close();
bos.close();
fis.close();
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
BufferedReader和BufferedWriter
BufferedReader与BufferedWriter实现了自带缓冲区的字符流高效读写;其最小操作单元为一个字符(16位),同时,我们欧可以自己指定缓冲区的大小,默认的缓冲区有819个字符,通常情况下已经
足够了
BufferedReader
对比FilelnputStream,我们发现它多了两个方法:readLine()和ready),readLine(友法用于从缓冲区每次读取一行,ready()用于判断文件是否被读取完毕。
BufferedReader在读取文字档案时,会先将数据资料先读入缓冲区,而之后若使用read()等方法时,会先从缓冲区中进行读取,如果缓冲区数据不足,才会再从文件中读取,藉由缓冲区,可以减少对磁盘的I/O动作,借以提高程序的效率
BufferedWriter
该类具有缓冲区,所以在写入的过程是直无将子付琪充缓冲区(8192个子符) ,然厄进付h什EE交由操作系统写入磁盘上的文件,这样就提高了性能,避免了对每个字符写入磁盘的频繁操作
flush()方法的作用就是将缓冲区内的数据传递给操作系统,并通过操作系统写入磁盘。在调用close()方法时,会自动调用flush()方法
//字符流
public class BufferedReaderDemo {
public static void main(String[] args) {
//声明对象
BufferedReader br = null;
BufferedWriter bw = null;
try {
// 实例化
br = new BufferedReader(new FileReader(new File("d:\License.txt")));
try {
bw = new BufferedWriter(new FileWriter(new File("d:\aab.txt")));
String str = "";
while ((str=br.readLine())!=null){//读一行 如果为空 那就没有内容了
bw.write(str);//写一行
bw.newline();//换下一行
}
bw.flush();//刷新字符串缓冲区
} catch (IOException e) {
e.printStackTrace();
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}finally {
try {
//关闭流
br.close();
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
总结
File类的用来创建文件、文件夹,并实现对它们属性的读取及修改
字节流lnpstStream、OutputStream可以用来读取二进制文件
字符流Reader、Writer能够高效的读取文本文件java提供了字节流向字符流的转换:
InputStreamReader OutputStreamWrite
PrintWriter能够对通往输出流的数据进行格式转换



