文 件 I O 流 总 结 简 述

Source

目录

        一、文件File类

        1.1、概述

        1.2、文件类的3种构造方法

        1.3、文件类的创建功能

        1.4、文件类的判断、获取、删除功能

        二、IO流

        2.1、概述

        2.2、字节输入流InputStream 

        2.3、字节输出流OutputStream

        2.4、字节流的应用和总结

         2.5、字符输入流Reader

        2.6、字符输出流Writer

        2.7、字符流的应用和总结

         三、特殊操作流

        3.1、转换流

        3.2、缓冲流

        3.3、对象序列化流

        3.4、Properties


        一、文件File类

        1.1、概述

        File 它是文件和目录路径名的抽象表示。文件和目录是可以通过File封装成对象的。

        对File 而言,其封装的并不是一个真正存在的文件,仅仅是一个路径名而已。它可以是存在的,也可以是不存在的。将来是要通过具体的操作把这个路径的内容转换为具体存在的

        1.2、文件类的3种构造方法

File​(String pathname) 通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。 
File​(String parent, String child) 从父路径名字符串和子路径名字符串创建新的 File实例。 
File​(File parent, String child) 从父抽象路径名和子路径名字符串创建新的 File实例。 
//File(String pathname):通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。
File f1 = new File("E:\\itcast\\java.txt");
System.out.println(f1);

//File(String parent, String child):从父路径名字符串和子路径名字符串创建新的 File实例。
File f2 = new File("E:\\itcast","java.txt");
System.out.println(f2);

//File(File parent, String child):从父抽象路径名和子路径名字符串创建新的 File实例。
//注意与 File(String parent, String child) 的区别
File f3 = new File("E:\\itcast");
File f4 = new File(f3,"java.txt");
System.out.println(f4);
运行结果_文件类的3种构造方法

        1.3、文件类的创建功能

public boolean createNewFile() 当具有该名称的文件不存在时,创建一个由该抽象路径名命名的新空文件。如果文件不存在,就创建文件,并返回true;如果文件存在,就不创建文件,并返回false。
public boolean mkdir() 创建由此抽象路径名命名的目录。如果目录不存在,就创建目录,并返回true;如果目录存在,就不创建目录,并返回false。
public boolean mkdirs() 创建由此抽象路径名命名的目录,包括任何必需但不存在的父目录。如果目录不存在,就创建目录,并返回true;如果目录存在,就不创建目录,并返回false。
//1、在E:\\itcast目录下创建一个文件java.txt
File f1 = new File("E:\\itcast\\java.txt");
System.out.println(f1.createNewFile());
System.out.println("--------");

//2、在E:\\itcast目录下创建一个目录JavaSE
File f2 = new File("E:\\itcast\\JavaSE");
System.out.println(f2.mkdir());
System.out.println("--------");

//3、在E:\\itcast目录下创建一个多级目录JavaWEB\\HTML
//注意:多级目录的创建必须用mkdirs()方法,mkdir()方法执行创建多级目录结果为false。
File f3 = new File("E:\\itcast\\JavaWEB\\HTML");
//System.out.println(f3.mkdir());
System.out.println(f3.mkdirs());
System.out.println("--------");

//4、在E:\\itcast目录下创建一个文件javase.txt
//注意:我们是无法根据文件名判断创建的是目录还是文件
//由使用的方法(mkdir()、createNewFile())决定创建的是目录还是文件
File f4 = new File("E:\\itcast\\javase.txt");
//System.out.println(f4.mkdir());
System.out.println(f4.createNewFile());

        结果就不演示了,大家有空自己试试。

        1.4、文件类的判断、获取、删除功能

public boolean isDirectory()

测试此抽象路径名表示的File是否为目录。

public boolean isFile()

测试此抽象路径名表示的File是否为文件。

public boolean exists()

测试此抽象路径名表示的File是否存在。

public String getAbsolutePath()

返回此抽象路径名的绝对路径名字符串。

public String getPath()

将此抽象路径名转换为路径名字符串(封装路径)。

public String getName()

返回由此抽象路径名表示的文件或目录的名称。

public String[] list()

返回此抽象路径名表示的目录中的文件和目录的名称字符串数组。

public File[] listFiles()

返回此抽象路径名表示的目录中的文件和目录的File对象数组。

public boolean delete() 删除由此抽象路径名表示的文件或目录。

        代码就不演示了,大家有空可以自己试试。

        二、IO流

        2.1、概述

        IO:数据输入内存 / 数据从内存中输出,即Input / Output。

        流:是一种抽象概念,是对数据传输的总称。也就是说数据在设备间的传输称为流,流的本质是数据传输。

        IO流就是用来处理设备间数据传输问题的。常见的应用:文件复制、文件上传、文件下载。

         什么时候使用字节流或字符流:如果数据通过电脑自带的记事本软件打开后,我们还能读懂里面的内容,就使用字符流;否则使用字节流。如果不知道该使用哪种类型的流,就使用字节流它是万能的流

        2.2、字节输入流InputStream 

  • 概述

        public abstract class InputStream extends Object,这个抽象类是表示输入字节流的所有类的超类。它的常见子类是FileInputStream。

  • 构造方法(以子类FileInputStream为例)
FileInputStream​(File file) 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的 File对象 file命名。 
FileInputStream​(String name) 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的路径名 name命名。 
  • 字节输入流读数据的2种方式
int read​()  从该输入流读取一个字节的数据。  (一次读一个字节数据)
int read​(byte[] b)  从该输入流读取最多 b.length个字节的数据到一个字节数组。  (一次读一个字节数组数据)

        2.3、字节输出流OutputStream

  • 概述

        public abstract class OutputStream extends Object,这个抽象类是表示字节输出流的所有类的超类。它的常见子类是FileOutputStream。

  • 构造方法(以子类FileOutputStream为例)
FileOutputStream​(File file)          创建文件输出流以写入由指定的 File对象表示的文件。  
FileOutputStream​(String name)  创建文件输出流以指定的名称写入文件。  
  • 字节输出流写数据的3种方式
void write​(int b)  将指定的字节写入此文件输出流。( 一次写一个字节数据)
void write​(byte[] b)  将 b.length字节从指定的字节数组写入此文件输出流。(一次写一个字节数组数据)
void write​(byte[] b, int off, int len)  将 len字节从指定的字节数组开始,从偏移量 off开始写入此文件输出流。(一次写一个字节数组的部分数据) 

        2.4、字节流的应用和总结

  • 复制文本文件 
/* 复制文本文件思路:
1、确定数据源(从哪个文件中读取)和目的地(写入到哪个文件中)。
2、根据数据源创建字节输入流对象。
3、根据目的地创建字节输出流对象。
4、读写数据
5、释放资源
*/

//根据数据源创建字节输入流对象
FileInputStream fis = new FileInputStream("E:\\itcast\\test.txt");
//根据目的地创建字节输出流对象
FileOutputStream fos = new FileOutputStream("myByteStream\\test.txt");

//读写数据,复制文本文件(一次读取一个字节,一次写入一个字节)
int by;
while ((by=fis.read())!=-1) {
	fos.write(by);
}

//释放资源
fos.close();
fis.close();
  • 复制图片
//根据数据源创建字节输入流对象
FileInputStream fis = new FileInputStream("E:\\itcast\\abc.jpg");
//根据目的地创建字节输出流对象
FileOutputStream fos = new FileOutputStream("myByteStream\\abc.jpg");

//读写数据,复制图片(一次读取一个字节数组,一次写入一个字节数组)
byte[] bys = new byte[1024];
int len;
while ((len=fis.read(bys))!=-1) {
	fos.write(bys,0,len);
}

//释放资源
fos.close();
fis.close();
  • 总结


         2.5、字符输入流Reader

  • 概述

        public abstract class Reader extends Object,用于读取字符流的抽象类。 子类必须实现的唯一方法是read(char [],int,int)和close()。 常用的子类是InputStreamReader
 

  • 构造方法(以InputStreamReader为例)
InputStreamReader​(InputStream in)      创建一个使用默认字符集的InputStreamReader。
InputStreamReader​(InputStream in, String charsetName)  创建一个使用命名字符集的InputStreamReader。
  • 字符输入流读数据的2种方式
int read() 一次读一个字符数据。
int read(char[] chs) 一次读一个字符数组数据。
  • 用于读取字符文件的便捷类FileReader

        该类的构造函数假定默认字符编码和默认字节缓冲区大小是适当的。 要自己指定这些值,请在FileInputStream上构造一个InputStreamReader。 

        FileReader用于读取字符流。 要读取原始字节流,请考虑使用FileInputStream 。 

        2.6、字符输出流Writer

  • 概述

        public abstract class Writer extends Object,用于写入字符流的抽象类。 子类必须实现的唯一方法是write(char [],int,int),flush()和close()。 常用的子类是OutputStreamWriter

  • 构造方法(以OutputStreamWriter为例)
OutputStreamWriter​(OutputStream out)      创建一个使用默认字符编码的OutputStreamWriter。
OutputStreamWriter​(OutputStream out, String charsetName)  创建一个使用命名字符集的OutputStreamWriter。
  • 字符输出流写数据的5种方式
void writer(int c) 写一个字符。
void wirter(char[] cbuf) 写入一个字符数组。
void writer(char[] chs, int off, int len) 写入字符数组的一部分。
void writer(String str) 写如一个字符串。
void writer(String str, int off, int len) 写一个字符串的一部分。
  • 用于写入字符文件的便捷类FileWriter

        该类的构造函数假定默认字符编码和默认字节缓冲区大小是可以接受的。 要自己指定这些值,请在FileOutputStream上构造一个OutputStreamWriter。

        文件是否可用或可能被创建取决于底层平台。 特别是某些平台允许一次只能打开一个文件来写入一个FileWriter (或其他文件写入对象)。 在这种情况下,如果所涉及的文件已经打开,则此类中的构造函数将失败。 

        FileWriter用于写入字符流。 要编写原始字节流,请考虑使用FileOutputStream 。 


        2.7、字符流的应用和总结

  • 使用便捷类FileReader、FileWriter读写字符文件
//根据数据源创建字符输入流对象
FileReader fr = new FileReader("myCharStream\\CopyDemo.java");
//根据目的地创建字符输出流对象
FileWriter fw = new FileWriter("myCharStream\\Copy.java");

//读写数据,复制文件
//一次读写一个字符数据
/*int ch;
while ((ch=fr.read())!=-1) {
    fw.write(ch);
}*/

//一次读一个字符数组数据,写入字符数组的一部分
char[] chs = new char[1024];
int len;
while ((len=fr.read(chs))!=-1) {
    fw.write(chs,0,len);
}

//释放资源
fw.close();
fr.close();
  • 总结


         三、特殊操作流

        3.1、转换流

        即InputStreamReaderOutputStreamWriter

        public class InputStreamReader extends Reader,InputStreamReader是从字节流到字符流的桥梁:它读取字节,并使用指定的charset将其解码为字符。 它使用的charset字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集。

        public class OutputStreamWriter extends Writer,OutputStreamWriter是从字符流到字节流的桥梁:使用指定的charset将写入的字符编码为字节。 它使用的字符集可以由名称指定,也可以被明确指定,或者可以接受平台的默认字符集。 

        Java中常见的charset字符集有ASCII字符集、GBXXX字符集(GB2312、GBK) 、Unicode字符集(UTF-8、UTF-16)等。

        3.2、缓冲流

  • BufferedInputStream,字节缓冲输入流

         public class BufferedInputStream extends FilterInputStream,创建BufferedInputStream将创建一个内部缓冲区数组。 当从流中读取或跳过字节时,内部缓冲区将根据需要从所包含的输入流中重新填充,一次很多字节。

        构造方法:BufferedInputStream​(InputStream in) ,创建一个 BufferedInputStream并保存其参数,输入流 in供以后使用。  

//示例
//一次读取一个字节数据
BufferedInputStream bis = new BufferedInputStream(new 
    FileInputStream("myByteStream\\bos.txt"));
int by;
while ((by=bis.read())!=-1) {
	System.out.print((char)by);
}
bis.close();
//示例
//一次读取一个字节数组数据
BufferedInputStream bis = new BufferedInputStream(new 
    FileInputStream("myByteStream\\bos.txt"));
byte[] bys = new byte[1024];
int len;
while ((len=bis.read(bys))!=-1) {
	System.out.print(new String(bys,0,len));
}
bis.close();
  • BufferedOutputStream,字节缓冲输出流

         public class BufferedOutputStream extends FilterOutputStream,该类实现缓冲输出流。 通过设置这样的输出流,应用程序可以向底层输出流写入字节,而不必为写入的每个字节导致底层系统的调用。 

        构造方法:BufferedOutputStream​(OutputStream out) ,创建一个新的缓冲输出流,以将数据写入指定的底层输出流。  

//示例
BufferedOutputStream bos = new BufferedOutputStream(new 
    FileOutputStream("myByteStream\\bos.txt"));

//写数据
bos.write("hello\r\n".getBytes());
bos.write("world\r\n".getBytes());

//释放资源
bos.close();
  • BufferedReader ,字符缓冲输入流

        public class BufferedReader extends Reader,从字符输入流读取文本,缓冲字符,以提供字符,数组和行的高效读取。 可以指定缓冲区大小,或者可以使用默认大小。 默认值足够大,可用于大多数用途。
        构造方法:BufferedReader​(Reader in) ,创建使用默认大小的输入缓冲区的缓冲字符输入流。  

        特有功能:public String readLine(),读一行文字;结果包含行的内容的字符串,不包括终止字符;如果流的结尾已经到达,则为null。

//示例
//创建字符缓冲输入流
BufferedReader br = new BufferedReader(new FileReader("myCharStream\\bw.txt"));
String line;
while ((line=br.readLine())!=null) {
	System.out.println(line);
}
br.close();
  • BufferedWriter,字符缓冲输出流

        public class BufferedWriter extends Writer,将文本写入字符输出流,缓冲字符,以提供单个字符,数组和字符串的高效写入。 可以指定缓冲区大小,或者可以接受默认大小。 默认值足够大,可用于大多数用途。 

        构造方法:BufferedWriter​(Writer out) ,创建使用默认大小的输出缓冲区的缓冲字符输出流。         特有功能:void newLine(),写一行行分隔符。void writer(String line),一次写一个字符串。

//示例
//创建字符缓冲输出流
BufferedWriter bw = new BufferedWriter(new FileWriter("myCharStream\\bw.txt"));

//写数据
for (int i = 0; i < 10; i++) {
	bw.write("hello" + i);
	bw.newLine();
	bw.flush();
}

//释放资源
bw.close();

        3.3、对象序列化流

        对象序列化流,就是将对象保存到磁盘中,或者在网络中传输对象。这种机制就是使用一个字节序列表示一个对象,该字节序列包含:对象的类型、对象的数据、对象中存储的属性等信息。字节序列写到文件之后,相当于文件中持久保存了一个对象的信息。反之,该字节序列还可以从文件中读取出来,重构对象,对它进行反序列化。

  • 对象序列化流ObjectOutputStream

        public class ObjectOutputStream extends OutputStream,ObjectOutputStream将Java对象的原始数据类型和图形写入OutputStream。 可以使用ObjectInputStream读取(重构)对象。 可以通过使用流的文件来实现对象的持久存储。 如果流是网络套接字流,则可以在另一个主机上或另一个进程中重构对象。

        构造方法:ObjectOutputStream​(OutputStream out) ,创建一个写入指定的OutputStream的ObjectOutputStream。  

        序列化对象的方法:void writeObject​(Object obj) ,将指定的对象写入ObjectOutputStream。 

        另外:一个对象要想被序列化,该对象所属的类必须实现Serializable接口。Serializable是一个标记接口,实现该接口,不需要重写任何方法。

//自定义一个学生类
public class Student implements Serializable {
    private String name;
    private int age;
    ……    
    ……    
}
//示例
//对象序列化流ObjectOutputStream
ObjectOutputStream oos = new ObjectOutputStream(new 
    FileOutputStream("myOtherStream\\oos.txt"));

//创建对象
Student s = new Student("林青霞",30);

//void writeObject​(Object obj):将指定的对象写入ObjectOutputStream
oos.writeObject(s);

//释放资源
oos.close();
  • 对象反序列化流ObjectInputStream

        public class ObjectInputStream extends InputStream,ObjectInputStream反序列化先前使用ObjectOutputStream编写的原始数据和对象。 
        构造方法:ObjectInputStream(InputStream in),创建从指定的InputStream读取的ObjectlnputStream。

        反序列化对象的方法:Object readObject(),从ObjectlnputStream读取一个对象。

//自定义一个学生类
public class Student implements Serializable {
    private String name;
    private int age;
    ……    
    ……    
}
//示例
//对象反序列化流ObjectInputStream
ObjectInputStream ois = new ObjectInputStream(new 
    FileInputStream("myOtherStream\\oos.txt"));

//Object readObject​():从ObjectInputStream读取一个对象
Object obj = ois.readObject();

Student s = (Student) obj;
System.out.println(s.getName() + "," + s.getAge());

ois.close();

        3.4、Properties

  • 概述

        public class Properties extends Hashtable<Object,Object>,Properties类表示一组持久的属性。Properties可以保存到流中或从流中加载。 属性列表中的每个键及其对应的值都是一个字符串。 

  • Properties作为集合的特有方法
Object setProperty​(String key, String value)  设置集合的键和值,都是String类型,底层调用 Hashtable方法 put 。  
String getProperty​(String key)  使用此属性列表中指定的键搜索属性。  
Set<String> stringPropertyNames​()  从该属性列表中返回一个不可修改的键集,其中键及其对应的值是字符串,包括默认属性列表中的不同键,如果尚未从主属性列表中找到相同名称的键。  
  • Properties和IO流结合的方法
void load​(Reader reader)  以简单的线性格式从输入字符流读取属性列表(关键字和元素对)。  
void store​(Writer writer, String comments)  将此属性列表(键和元素对)写入此 Properties表中,以适合使用 load(Reader)方法的格式输出到输出字符流。  
//示例
//把集合中的数据保存到文件:void load​(Reader reader) 
Properties prop = new Properties();

prop.setProperty("itheima001","林青霞");
prop.setProperty("itheima002","张曼玉");
prop.setProperty("itheima003","王祖贤");

FileWriter fw = new FileWriter("myOtherStream\\fw.txt");
prop.store(fw,null);
fw.close();
//示例
//把文件中的数据加载到集合:void store​(Writer writer, String comments) 
Properties prop = new Properties();

FileReader fr = new FileReader("myOtherStream\\fw.txt");
prop.load(fr);
fr.close();

System.out.println(prop);