码迷,mamicode.com
首页 > 编程语言 > 详细

java IO流学习总结

时间:2018-10-02 22:15:41      阅读:254      评论:0      收藏:0      [点我收藏+]

标签:读取数据   应用   line   接口   节能   写入   code   控制   分隔符   

java IO流学习总结

近期学习了Java的IO流,尝试着总结一下。

java.io 包下的类摘要如下:

BufferedInputStream BufferedInputStream 为另一个输入流添加一些功能,即缓冲输入以及支持 markreset 方法的能力。
BufferedOutputStream 该类实现缓冲的输出流。
BufferedReader 从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。
BufferedWriter 将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。
ByteArrayInputStream ByteArrayInputStream 包含一个内部缓冲区,该缓冲区包含从流中读取的字节。
ByteArrayOutputStream 此类实现了一个输出流,其中的数据被写入一个 byte 数组。
CharArrayReader 此类实现一个可用作字符输入流的字符缓冲区。
CharArrayWriter 此类实现一个可用作 Writer 的字符缓冲区。
Console 此类包含多个方法,可访问与当前 Java 虚拟机关联的基于字符的控制台设备(如果有)。
DataInputStream 数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型。
DataOutputStream 数据输出流允许应用程序以适当方式将基本 Java 数据类型写入输出流中。
File 文件和目录路径名的抽象表示形式。
FileDescriptor 文件描述符类的实例用作与基础机器有关的某种结构的不透明句柄,该结构表示开放文件、开放套接字或者字节的另一个源或接收者。
FileInputStream FileInputStream 从文件系统中的某个文件中获得输入字节。
FileOutputStream 文件输出流是用于将数据写入 FileFileDescriptor 的输出流。
FilePermission 此类表示对文件和目录的访问。
FileReader 用来读取字符文件的便捷类。
FileWriter 用来写入字符文件的便捷类。
FilterInputStream FilterInputStream 包含其他一些输入流,它将这些流用作其基本数据源,它可以直接传输数据或提供一些额外的功能。
FilterOutputStream 此类是过滤输出流的所有类的超类。
FilterReader 用于读取已过滤的字符流的抽象类。
FilterWriter 用于写入已过滤的字符流的抽象类。
InputStream 此抽象类是表示字节输入流的所有类的超类。
InputStreamReader InputStreamReader 是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。
LineNumberInputStream 已过时。 此类错误假定字节能充分表示字符。
LineNumberReader 跟踪行号的缓冲字符输入流。
ObjectInputStream ObjectInputStream 对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化。
ObjectInputStream.GetField 提供对从输入流读取的持久字段的访问权限。
ObjectOutputStream ObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream。
ObjectOutputStream.PutField 提供对要写入 ObjectOutput 的持久字段的编程访问。
ObjectStreamClass 类的序列化描述符。
ObjectStreamField Serializable 类中 Serializable 字段的描述。
OutputStream 此抽象类是表示输出字节流的所有类的超类。
OutputStreamWriter OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编码成字节。
PipedInputStream 管道输入流应该连接到管道输出流;管道输入流提供要写入管道输出流的所有数据字节。
PipedOutputStream 可以将管道输出流连接到管道输入流来创建通信管道。
PipedReader 传送的字符输入流。
PipedWriter 传送的字符输出流。
PrintStream PrintStream 为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式。
PrintWriter 向文本输出流打印对象的格式化表示形式。
PushbackInputStream PushbackInputStream 为另一个输入流添加性能,即“推回 (push back)”或“取消读取 (unread)”一个字节的能力。
PushbackReader 允许将字符推回到流的字符流 reader。
RandomAccessFile 此类的实例支持对随机访问文件的读取和写入。
Reader 用于读取字符流的抽象类。
SequenceInputStream SequenceInputStream 表示其他输入流的逻辑串联。
SerializablePermission 此类用于可序列化权限。
StreamTokenizer StreamTokenizer 类获取输入流并将其解析为“标记”,允许一次读取一个标记。
StringBufferInputStream 已过时。 此类未能正确地将字符转换为字节。
StringReader 其源为一个字符串的字符流。
StringWriter 一个字符流,可以用其回收在字符串缓冲区中的输出来构造字符串。
Writer 写入字符流的抽象类。

其中,以Stream结尾的为字节流,以Writer或者Reader结尾的为字符流。所有的输入流都是抽象类IuputStream(字节输入流)或者抽象类Reader(字符输入流)的子类,所有的输出流都是抽象类OutputStream(字节输出流)或者抽象类Writer(字符输出流)的子类。字符流能实现的功能字节流都能实现,反之不一定。如:图片,视频等二进制文件,只能使用字节流读写。

技术分享图片

 1、字符流FileReader和FileWriter

FileReader类

构造方法摘要
FileReader(File file)
          在给定从中读取数据的 File 的情况下创建一个新 FileReader
FileReader(FileDescriptor fd)
          在给定从中读取数据的 FileDescriptor 的情况下创建一个新 FileReader
FileReader(String fileName)
          在给定从中读取数据的文件名的情况下创建一个新 FileReader

 FileWriter类

构造方法摘要
FileWriter(File file)
          根据给定的 File 对象构造一个 FileWriter 对象。
FileWriter(File file, boolean append)
          根据给定的 File 对象构造一个 FileWriter 对象。
FileWriter(FileDescriptor fd)
          构造与某个文件描述符相关联的 FileWriter 对象。
FileWriter(String fileName)
          根据给定的文件名构造一个 FileWriter 对象。
FileWriter(String fileName, boolean append)
          根据给定的文件名以及指示是否附加写入数据的 boolean 值来构造 FileWriter 对象。

使用FileReader和FileWriter类完成文本文件复制:

技术分享图片
 1 import java.io.FileReader;
 2 import java.io.FileWriter;
 3 import java.io.IOException;
 4 
 5 public class CopyFile {
 6     public static void main(String[] args) throws IOException {
 7         //创建输入流对象
 8         FileReader fr=new FileReader("C:\\Test\\copyfrom.txt");//文件不存在会抛出java.io.FileNotFoundException
 9         //创建输出流对象
10         FileWriter fw=new FileWriter("C:\\Test\\copyto.txt");
11         /*创建输出流做的工作:
12          *         1、调用系统资源创建了一个文件
13          *         2、创建输出流对象
14          *         3、把输出流对象指向文件        
15          * */
16         //文本文件复制,一次读一个字符
17         method1(fr, fw);
18         //文本文件复制,一次读一个字符数组
19         method2(fr, fw);
20         
21         fr.close();
22         fw.close();
23     }
24 
25     public static void method1(FileReader fr, FileWriter fw) throws IOException {
26         int ch;
27         while((ch=fr.read())!=-1) {//读数据
28             fw.write(ch);//写数据
29         }
30         fw.flush();
31     }
32 
33     public static void method2(FileReader fr, FileWriter fw) throws IOException {
34         char chs[]=new char[1024];
35         int len=0;
36         while((len=fr.read(chs))!=-1) {//读数据
37             fw.write(chs,0,len);//写数据
38         }
39         fw.flush();
40     }
41 }
CopyFile

2、字符缓冲流BufferedReader和BufferedWriter

public class BufferedReader extends Reader

(1)从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。

(2)可以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了。

(3)通常,Reader 所作的每个读取请求都会导致对底层字符或字节流进行相应的读取请求。因此,建议用 BufferedReader 包装所有其 read() 操作可能开销很高的 Reader(如 FileReader 和 InputStreamReader)。例如,

 BufferedReader in
   = new BufferedReader(new FileReader("foo.in"));

(4)将缓冲指定文件的输入。如果没有缓冲,则每次调用 read() 或 readLine() 都会导致从文件中读取字节,并将其转换为字符后返回,而这是极其低效的。 

public class BufferedWriter extends Writer

(1)将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入。

(2)可以指定缓冲区的大小,或者接受默认的大小。在大多数情况下,默认值就足够大了。

(3)该类提供了 newLine() 方法,它使用平台自己的行分隔符概念,此概念由系统属性 line.separator 定义。并非所有平台都使用新行符 (‘\n‘) 来终止各行。因此调用此方法来终止每个输出行要优于直接写入新行符。

(4)通常 Writer 将其输出立即发送到底层字符或字节流。除非要求提示输出,否则建议用 BufferedWriter 包装所有其 write() 操作可能开销很高的 Writer(如 FileWriters 和 OutputStreamWriters)。例如,

 PrintWriter out
   = new PrintWriter(new BufferedWriter(new FileWriter("foo.out")));
 

(5)将缓冲 PrintWriter 对文件的输出。如果没有缓冲,则每次调用 print() 方法会导致将字符转换为字节,然后立即写入到文件,而这是极其低效的。

 使用BufferedReader和BufferedWriter完成文件复制

技术分享图片
 1 import java.io.BufferedReader;
 2 import java.io.BufferedWriter;
 3 import java.io.FileReader;
 4 import java.io.FileWriter;
 5 import java.io.IOException;
 6 
 7 public class CopyFile2 {
 8     public static void main(String[] args) throws IOException {
 9         //创建输入流对象
10         BufferedReader br=new BufferedReader(new FileReader("C:\\Test\\copyfrom.txt"));//文件不存在会抛出java.io.FileNotFoundException
11         //创建输出流对象
12         BufferedWriter bw=new BufferedWriter(new FileWriter("C:\\Test\\copyto.txt"));
13         //文本文件复制
14         char [] chs=new char[1024];
15         int len=0;
16         while((len=br.read(chs))!=-1) {
17             bw.write(chs, 0, len);
18         }
19         //释放资源
20         br.close();
21         bw.close();
22     }
23 }
CopyFile2

3、字节流FileInputStream和FileOutputStream 

public class FileInputStream extends InputStream

(1)FileInputStream 从文件系统中的某个文件中获得输入字节。哪些文件可用取决于主机环境。

(2)FileInputStream 用于读取诸如图像数据之类的原始字节流。

构造方法摘要
FileInputStream(File file)
          通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的 File 对象 file 指定。
FileInputStream(FileDescriptor fdObj)
          通过使用文件描述符 fdObj 创建一个 FileInputStream,该文件描述符表示到文件系统中某个实际文件的现有连接。
FileInputStream(String name)
          通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的路径名 name 指定。

public class FileOutputStream extends OutputStream

(1)文件输出流是用于将数据写入 FileFileDescriptor 的输出流。文件是否可用或能否可以被创建取决于基础平台。特别是某些平台一次只允许一个 FileOutputStream(或其他文件写入对象)打开文件进行写入。在这种情况下,如果所涉及的文件已经打开,则此类中的构造方法将失败。(2) FileOutputStream 用于写入诸如图像数据之类的原始字节的流。

构造方法摘要
FileOutputStream(File file)
          创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
FileOutputStream(File file, boolean append)
          创建一个向指定 File 对象表示的文件中写入数据的文件输出流。
FileOutputStream(FileDescriptor fdObj)
          创建一个向指定文件描述符处写入数据的输出文件流,该文件描述符表示一个到文件系统中的某个实际文件的现有连接。
FileOutputStream(String name)
          创建一个向具有指定名称的文件中写入数据的输出文件流。
FileOutputStream(String name, boolean append)
          创建一个向具有指定 name 的文件中写入数据的输出文件流。

例:使用字节流复制图片

 1 import java.io.FileInputStream;
 2 import java.io.FileOutputStream;
 3 import java.io.IOException;
 4 
 5 public class CopImg {
 6     public static void main(String[] args) throws IOException {
 7         FileInputStream fin=new FileInputStream("C:\\Users\\Administrator\\Desktop\\Img.jpg");
 8         FileOutputStream fout=new FileOutputStream("C:\\Users\\Administrator\\Desktop\\ImgCopy.jpg");
 9         int len=0;
10         byte[] buff=new byte[1024];
11         while((len=fin.read(buff))!=-1) {
12             fout.write(buff, 0, len);
13         }
14         fin.close();
15         fout.close();
16     }
17 }

4、字节缓冲流BufferedInputStream和BufferedOutputStream

public class BufferedInputStream extends FilterInputStream

BufferedInputStream 为另一个输入流添加一些功能,即缓冲输入以及支持 markreset 方法的能力。在创建 BufferedInputStream 时,会创建一个内部缓冲区数组。在读取或跳过流中的字节时,可根据需要从包含的输入流再次填充该内部缓冲区,一次填充多个字节。mark 操作记录输入流中的某个点,reset 操作使得在从包含的输入流中获取新字节之前,再次读取自最后一次 mark 操作后读取的所有字节。

public class BufferedOutputStream extends FilterOutputStream

该类实现缓冲的输出流。通过设置这种输出流,应用程序就可以将各个字节写入底层输出流中,而不必针对每次字节写入调用底层系统。

例:使用字节缓冲流实现图片的复制

 1 import java.io.BufferedInputStream;
 2 import java.io.BufferedOutputStream;
 3 import java.io.FileInputStream;
 4 import java.io.FileOutputStream;
 5 import java.io.IOException;
 6 
 7 public class CopyImg {
 8     public static void main(String[] args) throws IOException {
 9         BufferedInputStream bfin=new BufferedInputStream(new FileInputStream("C:\\Users\\Administrator\\Desktop\\Img.jpg"));
10         BufferedOutputStream bfout=new BufferedOutputStream(new FileOutputStream("C:\\Users\\Administrator\\Desktop\\ImgCopybuff.jpg"));
11         int len=0;
12         byte[] buff=new byte[1024];
13         while((len=bfin.read(buff))!=-1) {
14             bfout.write(buff, 0, len);
15         }
16         bfin.close();
17         bfout.close();
18     }
19 }

5、转换流:InputStreamReader和OutputStreamWriter

public class InputStreamReader extends Reader

(1)InputStreamReader 是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。

(2)每次调用 InputStreamReader 中的一个 read() 方法都会导致从底层输入流读取一个或多个字节。要启用从字节到字符的有效转换,可以提前从底层流读取更多的字节,使其超过满足当前读取操作所需的字节。

(3)为了达到最高效率,可要考虑在 BufferedReader 内包装 InputStreamReader。例如:

 BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

 

技术分享图片
 1 import java.io.BufferedReader;
 2 import java.io.FileWriter;
 3 import java.io.IOException;
 4 import java.io.InputStream;
 5 import java.io.InputStreamReader;
 6 import java.io.Reader;
 7 
 8 /**
 9  * 使用标准输入流,读取键盘录入的数据,存储到项目根目录下的a.txt中
10  * 将字节输入流转换成字符输入流,InputStreamReader
11  */
12 public class InputStreamReaderDemo {
13     public static void main(String[] args) throws IOException {
14         //创建输入流对象
15         BufferedReader r=new BufferedReader(new InputStreamReader(System.in));
16         //创建输出流对象
17         FileWriter fw=new FileWriter("a.txt");
18         //读写数据
19         char[] chs=new char[1024];
20         int len;
21         while((len=r.read(chs))!=-1) {
22             fw.write(chs,0,len);
23             fw.flush();
24         }
25         //释放资源
26         r.close();
27         fw.close();
28 
29     }
30 
31     public static void method2() throws IOException {
32         //创建输入流对象
33         InputStream is=System.in;
34         Reader r=new InputStreamReader(is);
35         //创建输出流对象
36         FileWriter fw=new FileWriter("a.txt");
37 
38         //读写数据
39         char[] chs=new char[1024];
40         int len;
41         while((len=r.read(chs))!=-1) {
42             fw.write(chs,0,len);
43             fw.flush();
44         }
45         //释放资源
46         is.close();
47         fw.close();
48     }
49 
50     public static void method1() throws IOException {
51         //创建输入流对象
52         InputStream is=System.in;
53         //创建输出流对象
54         FileWriter fw=new FileWriter("a.txt");
55         
56         //读写数据
57         byte[] bys=new byte[1024];
58         int len;
59         while((len=is.read(bys))!=-1) {
60             fw.write(new String(bys,0,len));
61             fw.flush();
62         }
63         //释放资源
64         is.close();
65         fw.close();
66     }    
67 }
InputStreamReaderDemo

 

public class OutputStreamWriter extends Writer

(1)OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编码成字节。它使用的字符集可以由名称指定或显式给定,否则将接受平台默认的字符集。

(2)每次调用 write() 方法都会导致在给定字符(或字符集)上调用编码转换器。在写入底层输出流之前,得到的这些字节将在缓冲区中累积。可以指定此缓冲区的大小,不过,默认的缓冲区对多数用途来说已足够大。注意,传递给 write() 方法的字符没有缓冲。

(3)为了获得最高效率,可考虑将 OutputStreamWriter 包装到 BufferedWriter 中,以避免频繁调用转换器。例如:

Writer out = new BufferedWriter(new OutputStreamWriter(System.out));

例如:利用标准输出流将文本输出到命令行

 

技术分享图片
 1 import java.io.BufferedReader;
 2 import java.io.BufferedWriter;
 3 import java.io.FileNotFoundException;
 4 import java.io.FileReader;
 5 import java.io.IOException;
 6 import java.io.OutputStream;
 7 import java.io.OutputStreamWriter;
 8 import java.io.Writer;
 9 
10 /**
11  * 读取项目目录下的文件copy.java,并输出到命令行
12  * 由于标准输出流是字节输出流,所以只能输出字节或者字节数组,但是我们读取到的数据是字符串,如果想进行输出,
13  * 还需要转换成字节数组(method1)。
14  * 要想通过标准输出流输出字符串,把标准输出流转换成一种字符输出流即可(method2)。
15  */
16 public class OutputStreamWriterDemo {
17     public static void main(String[] args) throws IOException {
18         //创建输入流
19         BufferedReader br=new BufferedReader(new FileReader("copy.java"));
20         //创建输出流
21         BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out));
22         String line;//用于接收读到的数据
23         while((line=br.readLine())!=null) {
24             bw.write(line);
25             bw.write("\r\n");
26         }
27         br.close();
28         bw.close();
29     }
30 
31     public static void method2() throws FileNotFoundException, IOException {
32         //创建输入流
33         BufferedReader br=new BufferedReader(new FileReader("copy.java"));
34         //创建输出流
35         //OutputStream os=System.out;
36         Writer w=new OutputStreamWriter(System.out);//多态,父类引用指向子类对象
37         String line;//用于接收读到的数据
38         while((line=br.readLine())!=null) {
39             w.write(line);
40             w.write("\r\n");
41         }
42         br.close();
43         w.close();
44     }
45 
46     public static void method1() throws FileNotFoundException, IOException {
47         //创建输入流
48         BufferedReader br=new BufferedReader(new FileReader("copy.java"));
49         //创建输出流
50         OutputStream os=System.out;
51         String line;//用于接收读到的数据
52         while((line=br.readLine())!=null) {
53             os.write(line.getBytes());
54             os.write("\r\n".getBytes());
55         }
56         br.close();
57         os.close();
58     }
59 }
OutputStreamWriterDemo

 

6、打印流PrintWriter和PrintStream

public class PrintWriter extends Writer

(1)向文本输出流打印对象的格式化表示形式。此类实现在 PrintStream 中的所有 print 方法。不能输出字节,但是可以输出其他任意类型。

(2)与 PrintStream 类不同,如果启用了自动刷新,则只有在调用 printlnprintfformat 的其中一个方法时才可能完成此操作,而不是每当正好输出换行符时才完成。这些方法使用平台自有的行分隔符概念,而不是换行符。

(3)此类中的方法不会抛出 I/O 异常,尽管其某些构造方法可能抛出异常。客户端可能会查询调用 checkError() 是否出现错误。 

 1 import java.io.FileWriter;
 2 import java.io.IOException;
 3 import java.io.PrintWriter;
 4 /**
 5  * 注意:创建FileWriter对象时boolean参数表示是否追加;
 6  *              而创建打印流对象时boolean参数表示是否自动刷新
 7  */
 8 public class PrintWriterDemo {
 9     public static void main(String[] args) throws IOException {
10         //PrintWriter pw=new PrintWriter("print.txt");
11         PrintWriter pw=new PrintWriter(new FileWriter("print.txt"),true);
12         pw.write("测试打印流");
13         pw.println("此句之后换行");
14         pw.println("特有功能:自动换行和自动刷新");
15         pw.println("利用构造器设置自动刷新");
16         pw.close();
17     }
18 }

使用字符打印流复制文本文件:

技术分享图片
 1 import java.io.BufferedReader;
 2 import java.io.FileReader;
 3 import java.io.FileWriter;
 4 import java.io.IOException;
 5 import java.io.PrintWriter;
 6 /**
 7  * 使用打印流复制文本文件
 8  */
 9 public class PrintWriterDemo {
10     public static void main(String[] args) throws IOException {
11         BufferedReader br=new BufferedReader(new FileReader("copy.java"));
12         PrintWriter pw=new PrintWriter("printcopy.java");
13         String line;
14         while((line=br.readLine())!=null) {
15             pw.println(line);
16         }
17         br.close();
18         pw.close();
19     }
20 }
PrintWriterDemo
public class PrintStream extends FilterOutputStreamimplements Appendable, Closeable
(1)PrintStream 为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式。它还提供其他两项功能。
(2)与其他输出流不同,PrintStream 永远不会抛出 IOException;而是,异常情况仅设置可通过 checkError 方法测试的内部标志。
另外,为了自动刷新,可以创建一个 PrintStream;这意味着可在写入 byte 数组之后自动调用 flush 方法,可调用其中一个 println 方法,或写入一个换行符或字节 (‘\n‘)。
(3)PrintStream 打印的所有字符都使用平台的默认字符编码转换为字节。在需要写入字符而不是写入字节的情况下,应该使用 PrintWriter 类。  
使用字节打印流复制文本文件:
技术分享图片
 1 import java.io.BufferedReader;
 2 import java.io.FileReader;
 3 import java.io.IOException;
 4 import java.io.PrintStream;
 5 
 6 public class PrintStreamDemo {
 7     public static void main(String[] args) throws IOException {
 8         BufferedReader br=new BufferedReader(new FileReader("copy.java"));
 9         PrintStream ps=new PrintStream("printcopy2.java");
10         String line;
11         while((line=br.readLine())!=null) {
12             ps.println(line);
13         }
14         br.close();
15         ps.close();
16     }
17 }
PrintStreamDemo

7、对象操作流ObjectInputStream和ObjectOutputStream

public class ObjectOutputStream extends OutputStream implements ObjectOutput, ObjectStreamConstants

(1)ObjectOutputStream 将 Java 对象的基本数据类型和图形写入 OutputStream。只能使用 ObjectInputStream 读取(重构)对象。

(2)只能将支持 java.io.Serializable 接口的对象写入流中。

(3)writeObject 方法用于将对象写入流中。所有对象(包括 String 和数组)都可以通过 writeObject 写入。可将多个对象或基元写入流中。必须使用与写入对象时相同的类型和顺序从相应 ObjectInputstream 中读回对象。

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

public class ObjectInputStream extends InputStream implements ObjectInput, ObjectStreamConstants

(1)ObjectInputStream 对以前使用 ObjectOutputStream 写入的基本数据和对象进行反序列化。

(2)只有支持 java.io.Serializable 或 java.io.Externalizable 接口的对象才能从流读取。

(3)readObject 方法用于从流读取对象。应该使用 Java 的安全强制转换来获取所需的类型。在 Java 中,字符串和数组都是对象,所以在序列化期间将其视为对象。读取时,需要将其强制转换为期望的类型。 

例:对象读写:

技术分享图片
 1 import java.io.Serializable;
 2 //学生类
 3 public class Student implements Serializable{
 4     private static final long serialVersionUID = -8942780382144699003L;
 5     String name;
 6     int age;
 7     public Student(String name,int age){
 8         this.name=name;
 9         this.age=age;
10     }
11     @Override
12     public String toString() {
13         return "Student [name=" + name + ", age=" + age + "]";
14     }    
15 }
Student
技术分享图片
 1 import java.io.EOFException;
 2 import java.io.FileInputStream;
 3 import java.io.FileNotFoundException;
 4 import java.io.FileOutputStream;
 5 import java.io.IOException;
 6 import java.io.ObjectInputStream;
 7 import java.io.ObjectOutputStream;
 8 
 9 /**
10  * 使用对象输出流写对象和对象输入流读对象
11  *注意:如果Student没有序列化,会抛出java.io.NotSerializableException
12  *Serializable:序列号,是一个标识接口,只起标识作用,没有方法
13  *当一个类的对象需要IO流进行读写的时候,这个类必须实现接口
14  */
15 public class ObjectOperate {
16     public static void main(String[] args) throws IOException, ClassNotFoundException {
17         writeObject();
18         //创建对象输入流的对象
19         ObjectInputStream ois=new ObjectInputStream(new FileInputStream("a.txt"));
20         //读取对象
21         try {
22             while(true){
23                 Object obj=ois.readObject();
24                 System.out.println(obj);
25             }
26         }catch(EOFException e){
27             System.out.println("读到了文件末尾");
28         }
29         
30         //释放资源
31         ois.close();
32         
33     }
34 
35     public static void writeObject() throws FileNotFoundException, IOException {
36         //创建对象输出流的对象
37         FileOutputStream fos=new FileOutputStream("a.txt");
38         ObjectOutputStream oos=new ObjectOutputStream(fos);
39         //创建学生对象
40         Student s1=new Student("张三",20);
41         Student s2=new Student("李四",30);
42         Student s3=new Student("王五",10);    
43         //写出学生对象
44         oos.writeObject(s1);
45         oos.writeObject(s2);
46         oos.writeObject(s3);
47         //释放资源
48     }
49 }
ObjectOperate
技术分享图片
 1 import java.io.FileInputStream;
 2 import java.io.FileNotFoundException;
 3 import java.io.FileOutputStream;
 4 import java.io.IOException;
 5 import java.io.ObjectInputStream;
 6 import java.io.ObjectOutputStream;
 7 import java.util.ArrayList;
 8 /**
 9  * 使用对象输出流写对象和对象输入流读对象
10  *解决读取对象出现异常的问题,使用集合类
11  */
12 public class ObjectOperate2 {
13     public static void main(String[] args) throws IOException, ClassNotFoundException {
14         listMethod();
15         //创建对象输入流对象
16         ObjectInputStream ois=new ObjectInputStream(new FileInputStream("b.txt"));
17         //读取数据
18         Object obj=ois.readObject();
19         //System.out.println(obj);
20         //向下转型
21         ArrayList<Student> list=(ArrayList<Student>) obj;
22         for(Student s:list) {
23             System.out.println(s);
24         }
25         //释放资源
26         ois.close();
27     }
28 
29     public static void listMethod() throws IOException, FileNotFoundException {
30         //创建对象输出流的对象
31         ObjectOutputStream oos=new ObjectOutputStream(new FileOutputStream("b.txt"));
32         //创建集合类
33         ArrayList<Student> list=new ArrayList<Student>();
34         //添加学生对象
35         list.add(new Student("zhangsan",20));
36         list.add(new Student("lisi",30));
37         //写出集合对象
38         oos.writeObject(list);
39         //释放资源
40         oos.close();
41     }
42 
43 }
ObjectOperate2

 8、File类:

File: 文件和目录路径名的抽象表示形式,File类的实例是不可改变的

File: 文件和目录路径名的抽象表示形式,File类的实例是不可改变的

 * File类的构造方法:
 *             File(String pathname) 将指定的路径名转换成一个File对象
 *             File(String parent,String child) 根据指定的父路径和文件路径创建对象
 *             File(File parent,String child)
 * File类常用功能:
 *             创建:boolean createNewFile():当指定文件夹不存在时创建文件夹并返回true,否则返回false
 *                 boolean mkdir()  :当指定文件夹不存在时创建文件夹并返回true,否则返回false
 *                 boolean mkdirs() :创建指定文件夹,所在文件夹目录不存在时,则顺道一块创建
 *             删除:boolean delete():删除文件
            注意:要删除一个目录,需要先删除这个目录下的所有子文件和子目录
 *             获取:File getAbsoluteFile()
 *                 File getParentFile()
 *                 String getAbsolutePath()
 *                 String getParent()
 *                 String getPath()
 *                 long lastModified() 
 *             判断: boolean exists();
 *                 boolean isAbsolute() 
 *                 boolean isDirectory() 
 *                 boolean isFile() 
 *                 boolean isHidden()    
 *             修改:boolean renameTo(File dest): 将当前File对象所指向的路径修改为指定File所指的路径 (修改文件名称)    */

案例:打印指定文件(夹)及其所有子目录

 1 import java.io.File;
 2 /**
 3  *打印目录
 4  */
 5 public class FileDemo1 {
 6     public static void main(String[] args){
 7         File f=new File("E:\\BaiduNetdiskDownload");
 8         printTree( f,0);
 9     }
10     
11     public static void printTree(File f,int level) {
12         for(int j=0;j<level;j++) {
13             System.out.print("\t");
14         }
15         System.out.println(f.getAbsolutePath());
16         if(f.isDirectory()) {
17             level++;
18             File strs[]=f.listFiles();
19             for(int i=0;i<strs.length;i++) {
20                 File f0=strs[i];
21                 printTree(f0,level+1);
22             }
23         }
24     }
25 }

 

java IO流学习总结

标签:读取数据   应用   line   接口   节能   写入   code   控制   分隔符   

原文地址:https://www.cnblogs.com/hopeyes/p/9736642.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!