黑马程序员——Java I/O体系

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

java.io在jdk中的定义:为系统提供输入和输出通过数据流,序列化以及文件系统。

在学习IO体系的时候,我们可以遵循这样的规律:

看父类的共性功能,用子类的对象。

而且,IO体系的好处在于:

每个子类的后缀名都是所属体系的父类的名称,很容易区分所属的体系;而且每个子类前缀名都是该子类对象的功能体系。

Java IO体系:

|--字节流抽象基类

|--OutputStream

|--InputStream

常用的字节型的节点流有:

  • 文件:FileInputStream,FileOutputStream
  • 内存(数组):ByteArrayInputStream,ByteArrayOutputStream
  • 管道:PipedInputStream,PipedOutputStream

|--字符流抽象基类

|--Reader

|--Writer

常用的字符型的节点流有:

  • 文件:FileReader, FileWriter
  • 内存(数组):CharArrayReader,CharArrayWriter
  • 内存(字符串):StringReader,StringWriter
  • 管道:PipedReader,PipedWriter

下面先讲解FileWriter

示例:将一段文字数据写入到硬盘上

 1 import java.io.FileWriter;
 2 import java.io.IOException;
 3
 4 public class FileWriterDemo {
 5     public static void main(String[] args) throws IOException {
 6         /*
 7         //需求:将一个段文字数据写入到硬盘上.
 8         思路:
 9         1,一段文字就是字符串数据。
10         2,写到硬盘上,从哪到哪呢?字符串数据在内存中,写到硬盘上——将内存中的数据搞到硬盘上,
11         这就涉及到了设备之间的数据处理。就要用到IO技术。
12         既然是从内存到硬盘,应该是输出流。
13         3,对于文字而言,io中提供了便捷的操作,比如字符流。
14         4,结合两者,需要输出流,需要字符流,可以使用字符输出流。Writer
15         5,具体用哪个子类对象呢?硬盘上用于存储数据的体现:文件。在这个体系中有对象FileWriter 。
16          */
17
18
19         //1,通过FileWriter创建流对象。构造时,必须明确写入数据需要存储的位置。
20         /*
21          * 该对象一创建,目的文件就会被创建。
22          * 如果该文件已经存在,会被覆盖。
23          * 做了什么事呢?在堆内存中创建一个对象。同时调用了系统的资源。
24          */
25         FileWriter fw = new FileWriter("demo.txt");
26
27         //2,使用字符输出流对象将字符串进行写入。调用写入方法。
28         //数据没有直接写入到目的文件中,而是写入到了临时缓冲中。
29         fw.write("abcdef");
30
31         //3,怎么把数据弄到文件中呢?发现Writer类中有一个flush()方法。刷新缓冲区,将缓冲的数据立即写入到目标中。
32         fw.flush();
33
34         fw.write("haha");
35         //4,关闭此流,关闭资源。在关闭之前,先刷一次缓冲,将数据都写入到目的中。
36         fw.close();
37
38         /*
39          * flush()和close()有什么区别?
40          * flush():仅将缓冲中的数据刷新到目的地。流对象可以继续使用。可以使用多次。
41          * close():将缓冲中的数据刷到目的地后,直接关闭流资源,流无法继续使用。只能使用一次。
42          * 在close()方法当中其实在关闭之前都会调用一次flush();
43          *
44          */
45     }
46 }  

示例展示了FileWriter的基本流程,但是在程序中的很多地方都会发生异常,因此,有必要了解Java中IO体系的异常处理规范。

示例二:IO异常处理

 1 import java.io.FileWriter;
 2 import java.io.IOException;
 3 public class FileWriterDemo3 {
 4
 5     public static void main(String[] args) {
 6         /*
 7          * IO异常的处理规范。
 8          * 创建流对象—————— 在try外创建流对象的引用。 在try内对流对象进行初始化。
 9          */
10         FileWriter fw = null;
11         try {
12             fw = new FileWriter("k:\\demo3.txt");
13
14             fw.write("abcde");
15             fw.flush();
16
17         } catch (IOException e) {
18
19             System.out.println(e.toString());
20         } finally {
21             //在关闭之间必须得判断这个流是否存在,是否被创建。
22             if (fw != null)
23                 try {
24                     fw.close();
25                 } catch (IOException e) {
26
27                     // 相关的代码处理。比如说,将关闭失败的信息记录到日志文件中。
28                     throw new RuntimeException("关闭失败");
29                 }
30         }
31     }
32 }  

FileReader主要用于读取,读取方式的不同也必然导致效率的不同。

1. 读取单个字符:读取单个字符,在字符可用、发生I/O错误或者已到达流的末尾前,此方法一直阻塞。返回值为读取到的字符数,如果已到达流的末尾,则返回-1.

2. 读取字符数组:将读取到的字符存储到字符数组里面,并且返回字符数组的长度。如果到达流的末尾,返回-1.

 1 import java.io.FileNotFoundException;
 2 import java.io.FileReader;
 3 import java.io.IOException;
 4
 5 public class FileReaderTest {
 6
 7     public static void main(String[] args) throws IOException {
 8         // TODO Auto-generated method stub
 9         FileReader fr = new FileReader("IO流.txt");
10
11         //演示读取单个字符
12         long time = System.currentTimeMillis();
13         readChar(fr);
14         long timereadChar = System.currentTimeMillis();
15
16         System.out.println("time Read char is  = " + (timereadChar-time));
17         //演示读取字符到缓冲区中。
18
19         long time2 = System.currentTimeMillis();
20         readToBuf(fr);
21         long timeReadBuf = System.currentTimeMillis();
22         System.out.println("time Read to Buf is =  " + (timeReadBuf-time2));
23
24
25     }
26     private static void readToBuf(FileReader fr) throws IOException {
27         //定义一个字符缓冲区,用于存放读到的字符。
28         char[] buf = new char[50];
29         //设刚开始读到的字符为0
30         int len = 0 ;
31         //一直循环读取字符到缓冲区中,直到读到流的末尾。
32         while((len = fr.read(buf)) != -1){
33             //将每次读满的缓冲区中的字符,变成字符串打印出来。
34             System.out.println(new String(buf , 0 , len));
35         }
36     }
37     private static void readChar(FileReader fr) throws IOException {
38         //设每个读取到的字符整数值为ch.
39         int ch = 0;
40         //循环读取字符,直到流的末尾
41         while((ch = fr.read()) != -1){
42             //将读取到的字符,强制转换为 char
43             System.out.print((char) ch);
44         }
45     }
46 }  

缓冲区:
流对象的read():是从目的地一次读取一个。

缓冲区的read():是通过流对象的read将一批数据读取到缓数组,然后再从数组中一次取一个,所以内存操作要比硬盘操作要高效。

在Java中,为了提高程序的效率,为我们提供了对应的类:BufferedReader和BufferedWriter。

示例三:

 1 import java.io.BufferedWriter;
 2 import java.io.FileWriter;
 3 import java.io.IOException;
 4
 5 public class BufferedWriterDemo {
 6
 7     public static void main(String[] args) throws IOException {
 8
 9         //创建一个流对象。
10         FileWriter fw = new FileWriter("buf.txt");
11
12         //为了提高效率。创建缓冲区对象,并和要被提高效率的流相关联。
13         BufferedWriter bufw = new BufferedWriter(fw);
14
15         for(int x=0;x<4; x++){
16             bufw.write(x+"--hahaha");
17             //写入一个换行符。
18             bufw.newLine();
19             //要对缓冲区进行刷新。记住:一般只要使用了缓冲区,就一定要刷新。
20             bufw.flush();
21         }
22
23         //关闭缓冲区。
24         bufw.close();//问:还用关闭fw.close()?不用,因为关闭缓冲区,其实就是在关闭缓冲区关联的流。
25
26     }
27 } 

示例四:

 1 import java.io.BufferedReader;
 2 import java.io.FileReader;
 3 import java.io.IOException;
 4
 5 public class BuffereReaderDemo {
 6
 7     public static void main(String[] args) throws IOException {
 8         /**
 9          * 演示:BufferedReader
10          * 1. 先有字符读取流;
11          * 2. 该类有一个特有方法。readLine(). 一次读一行。
12          */
13         //创建读取流对象 和 文件相关联。
14         FileReader fr = new FileReader("Demo.txt");
15
16         //创建读取缓冲区对象 和 流对象关联对其进行高效 操作;
17         BufferedReader  bufr = new BufferedReader(fr);
18         //简写形式:
19         //BufferedReader bufr = new BufferedReader(new FileReader("Demo.txt"));
20
21         String line = null ;
22         while((line = bufr.readLine()) != null){
23             System.out.println(line);
24         }
25         bufr.close();
26     }
27 }  
时间: 2024-08-28 03:39:10

黑马程序员——Java I/O体系的相关文章

黑马程序员——java基础——集合(Collection)

 黑马程序员--java基础--集合(Collection) ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 集合框架的构成及分类,如下图: 1.为什么出现集合类? 面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一种方式. 2.数组和集合类同是容器,有何不同? 数组虽然也可以存储对象,但长度是固定的:集合长度是可变的.数组中可以存储基本数据类型,集合只能存储对象. 3.

黑马程序员——java基础——异常

黑马程序员--java基础--异常 ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 异常 就是不正常.程序在运行时出现的不正常情况.其实就是程序中出现的问题.这个问题按照面向对象思想进行描述,并封装成了对象.因为问题的产生有产生的原因.有问题的名称.有问题的描述等多个属性信息存在.当出现多属性信息最方便的方式就是将这些信息进行封装.异常就是java按照面向对象的思想将问题进行对象封装. 异常体系 --------java.lang.Thro

黑马程序员——Java基础---io(上)

黑马程序员——Java基础---io(上) ------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------ 一.概述 Java I/O系统负责处理程序的输入和输出,I/O类库位于java.io包中,它对各种常见的输入流和输出流进行了抽象.如果数据流中最小的数据单元是字节,那么称这种流为字节流:如果数据流

黑马程序员---Java集合框架

---------------------- Android开发.java培训.期待与您交流! ---------------------- Java集合框架 集合我们都知道是用来储存对象的容器,那之前的数组不也可以储存对象么,为什么要出现集合呢? 面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,然而集合类中提供很多方便操作对象存储的方法,要比数组更容易操作对象,而且集合的长度是可变的,然而数组长度确实固定不变的,这样不利于对对象的间隔储存.  数组和集

黑马程序员——Java基础---IO(下)

黑马程序员——Java基础---IO(下) ------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------ 一.概述 Java除了基本的字节流.字符流之外,还提供了File类.properties类.打印流.序列流等和输入输出相关的类,它们能够帮助我们更好的处理信息.下面将对它们进行简单的介绍. 一.正

黑马程序员——Java高新技术代理

代理 普通代理 很多时候,我们使用别人代码往往会发现别人代码的功能并不是十分符合我们的需求,调用别人的方法的时候,总是先new一个对象,然后我们的前处理做完,然后调用别人代码的方法,再加入后处理,这样做往往十分麻烦.代理就为其他类提供了一种控制其对象的方法.代理类和委托类必须实现同一个接口,这样代理类才能在需要的时候代替委托类对象,执行委托类的方法. interface Solution{ public void doSomething(); } //委托类Demo实现了接口 class Dem

黑马程序员——Java I/O流基础知识点(File类)

File工具 File类就是用俩将文件或者文件夹封装对象,弥补流对象的不足--流只能操作数据,不能操作文件夹的 封装的是路径!!! 构造方法演示 1.可以将已有的未出现的文件或者文件夹封装成对象. File f1=new File("c:\\abc\\a.txt"): File f2=new File("d:\\abc","ab.txt"打印,会打印路径.:目录分隔符,为了更好地跨平台File. File类常见功能 1,创建 createNewF

黑马程序员 ---------- Java网络技术之 ---正则表达式 (Day06)

---------------------- ASP.Net+Unity开发..Net培训.期待与您交流! ---------------------- 正则表达式 正则表达式:基本知识 1  字符,   2 字符类 , 3 预定义字符类 , 4 边界匹配器 ,5 Greedy 数量词,6 Logical 运算符 详解: 1 字符 x   字符 x \\ 反斜线字符 \0n 带有八进制值 0 的字符 n (0 <= n <= 7) \0nn 带有八进制值 0 的字符 nn (0 <= n

黑马程序员——Java基础---集合框架工具类

黑马程序员——Java基础<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------ 一.概述 Java为操作Set.List和Map提供了一系列工具类,主要有Collections和Arrays.这两个工具类的特点:类中的方法都是静态的,不需要创建对象,直接使用类名调用即可.Collections:是集合对象