黑马程序员

导航

黑马程序员——java语言——IO

IO

按操作数据分:字节流与字符流                           按流向分为:输出流、输入流

 

|- --字节流(原始数据),需要用户读入后进行相应的编码转换。 由InputStreamOutputStream处理 

|- --字符流基于自动转换而实现,读取数据时会把数据按照JVM的默认编码自动转换成字符。 由ReaderWriter处理

 基于双字节的Unicode代码单元 

 

InputStream:继承自InputStream的流都是用于向程序中输入数据的,且数据单位都是字节(8位)。  

OutputSteam:继承自OutputStream的流都是程序用于向外输出数据的,且数据单位都是字节(8位)。  

Reader:继承自Reader的流都是用于向程序中输入数据的,且数据单位都是字符(16位)。  

Writer:继承自Writer的流都是程序用于向外输出数据的,且数据单位都是字符(16位)。 

 

 

四个抽象基类

  字节流               |- -- InputStream  OutputStream

  字符流               |- -- Reader  、  Writer

 

 

 

 

字符流 

CharArrayWriter:把内存中的字符数组写入输出流,输出流的缓冲区会自动增加大小。输出流的数据可以通过一些方法重新获取。

StringWriter: 一个字符流,可以用其回收在字符串缓冲区中的输出来构造字符串。

FileWriter:把数据写入文件。

BufferedWriter:提供缓冲功能。

OutputStreamWriter:字符流通向字节流的桥梁:可使用指定的 charset将要写入流中的字符编码成字节。

PrintWriter: 向文本输出流打印对象的格式化表示形式。

 

CharArrayReader: 从内存中的字符数组中读入数据,以对数据进行流式读取。

StringReader:从内存中的字符串读入数据,以对数据进行流式读取。

FileReader:从文件中读入数据。注意这里读入数据时会根据JVM的默认编码对数据进行内转换,而不能指定使用的编码。所以当文件使用的编码不是JVM默认编码时,不要使用这种方式。要正确地转码,使用InputStreamReader

BufferedReader:提供缓冲功能,可以读取行:readLine();

LineNumberReader: 提供读取行的控制:getLineNumber()等方法。

InputStreamReader: 字节流通向字符流的桥梁:它使用指定的 charset读取字节并将其解码为字符。

 

字节流

FileOutputStreamByteArrayOutputStream,前者实现了把数据流写入文件的功能,后者实现了一个输出流,其中的数据被写入一个 byte 数组。缓冲区会随着数据的不断写入而自动增长。可使用 toByteArray()和 toString() 获取数据。

BufferedOutputStream: 提供了缓冲功能的输出流,在写出完成之前要调用flush来保证数据的输出。

DataOutputStream: 数据输出流允许应用程序以适当方式将基本 Java 数据类型写入输出流中。然后,应用程序可以使用数据输入流将数据读入。

PipedOutputStream: 允许以管道的方式来处理流。可以将管道输出流连接到管道输入流来创建通信管道。管道输出流是管道的发送端。通常,数据由某个线程写入 PipedOutputStream 对象,并由其他线程从连接的 PipedInputStream 读取。

PrintStream: 为其他输出流添加了功能,使它们能够方便地打印各种数据值表示形式。我们经常用到的System.out或者System.err都是PrintStream

 

FileInputStreamByteArrayInputStream,他们分别实现了从文件或者内存中的字节数组读入数据到输入流。 BufferedInputStream: 提供了缓冲功能。

DataInputStream: 允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型。应用程序可以使用数据输出流写入稍后由数据输入流读取的数据。

PipedInputStream: 允许以管道的方式来处理流。当连接到一个PipedOutputStream后,它会读取后者输出到管道的数据。

PushbackInputStream: 允许放回已经读取的数据。

SequenceInputStream: 能对多个inputstream进行顺序处理。

 

 

 

缓冲区

好处: 提高了对数据的读写效率

缓冲区的出现是为了提高流的操作效率而出现的。

所以在创建缓冲区之前,必须要先有流对象。

 

 

装饰设计模式:

当想要对已有的对象进行功能增强时,

可以定义类,将已有对象传入,基于已有的功能,并提供加强功能。

那么自定义的该类称为装饰类。

装饰类通常会通过构造方法接收被装饰的对象。

并基于被装饰的对象的功能,提供更强的功能。

 

字符读取流(18.12

//C盘一个文本文件复制到D盘。

/*

复制的原理:

其实就是将C盘下的文件数据存储到D盘的一个文件中。

步骤:

1,在D盘创建一个文件。用于存储C盘文件中的数据。

2,定义读取流和C盘文件关联。

3,通过不断的读写完成数据存储。

4,关闭资源。

*/

 

 

字节读取流(19.12/13

/*

复制一个图片

思路:

1,用字节读取流对象和图片关联。

2,用字节写入流对象创建一个图片文件。用于存储获取到的图片数据。

3,通过循环读写,完成数据的存储。

4,关闭资源。

*/

/*

演示mp3的复制。通过缓冲区。

BufferedInputStream bufis = new BufferedInputStream(new FileInputStream("c:\\0.mp3"));

BufferedOutputStream bufos = new BufferedOutputStream(new FileOutputStream("c:\\1.mp3"));

*/

 

/*

读取键盘录入。键盘录入的read方法是字节流InputStream的方法

System.out:对应的是标准输出设备,控制台。

System.in:对应的标准输入设备:键盘。

*/

 

 

l 将字节流对象转成字符流对象,使用转换流。InputStreamReader

键盘录入,读取键盘!一次读取一行字节:

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

 

l 字符流通向字节流的桥梁  OutputStreamWriter

键盘输出:

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

 

流:只能操作数据

 

 

File

 

/*

File类常见方法:

1,创建。

boolean createNewFile():在指定位置创建文件,如果该文件已经存在,则不创建,返回false

和输出流不一样,输出流对象一建立创建文件。而且文件已经存在,会覆盖。

boolean mkdir():创建文件夹。

boolean mkdirs():创建多级文件夹。

2,删除。

boolean delete():删除失败返回false。如果文件正在被使用,则删除不了返回falsel

void deleteOnExit();在程序退出时删除指定文件。

3,判断。

boolean exists() :文件是否存在.

isFile():

isDirectory();

isHidden();

isAbsolute();

4,获取信息。

getName():

getPath():

getParent():

getAbsolutePath() 

long lastModified() 

long length() 

 

/*

删除一个带内容的目录。

删除原理:

window中,删除目录从里面往外删除的。

既然是从里往外删除。就需要用到递归。

*/

 

/*

用于记录应用程序运行次数。~~键值对

如果使用次数已到,那么给出注册提示。

很容易想到的是:计数器。

可是该计数器定义在程序中,随着程序的运行而在内存中存在,并进行自增。

可是随着该应用程序的退出,该计数器也在内存中消失了。

下一次在启动该程序,又重新开始从0计数。这样不是我们想要的。

程序即使结束,该计数器的值也存在。

下次程序启动在会先加载该计数器的值并加1后在重新存储起来。

所以要建立一个配置文件。用于记录该软件的使用次数。

该配置文件使用键值对的形式。

这样便于阅读数据,并操作数据。

键值对数据是map集合。

数据是以文件形式存储,使用io技术。

那么map+io -->properties.

配置文件可以实现应用程序数据的共享。

*/

 

 

 

 

/*

打印流:该流提供了打印方法,可以将各种数据类型的数据都原样打印。

字节打印流:

PrintStream

构造函数可以接收的参数类型:

1file对象。File

2,字符串路径。String

3,字节输出流。OutputStream

字符打印流:

PrintWriter

构造函数可以接收的参数类型:

1file对象。File

2,字符串路径。String

3,字节输出流。OutputStream

4,字符输出流,Writer

*/

 

 

 

用于操作字节数组的流对象。

ByteArrayInputStream :在构造的时候,需要接收数据源,。而且数据源是一个字节数组。

ByteArrayOutputStream: 在构造的时候,不用定义数据目的,因为该对象中已经内部封装了可变长度的字节数组。

这就是数据目的地。

 

在流操作规律讲解时:

源设备,

键盘 System.in,硬盘 FileStream,内存 ArrayStream

目的设备:

控制台 System.out,硬盘FileStream,内存 ArrayStream

 

 

 

 

 

 

 

/*

编码:字符串变成字节数组。

String-->byte[];  str.getBytes(charsetName);

 

解码:字节数组变成字符串。

byte[] -->String: new String(byte[],charsetName);

*/

/*            练习

有五个学生,每个学生有3门课的成绩,

从键盘输入以上数据(包括姓名,三门课成绩),

输入的格式:如:zhagnsan304060计算出总成绩,

并把学生的信息和计算出的总分数高低顺序存放在磁盘文件"stud.txt"中。

 

1,描述学生对象。

2,定义一个可操作学生对象的工具类。

思想:

1,通过获取键盘录入一行数据,并将该行中的信息取出封装成学生对象。

2,因为学生有很多,那么就需要存储,使用到集合。因为要对学生的总分排序。所以可以使用TreeSet

3,将集合的信息写入到一个文件中。

*/

 

posted on 2012-04-13 23:15  黑马—jieqi  阅读(638)  评论(0编辑  收藏  举报