黑马程序员------毕老师视频笔记第18-21天------IO输入与输出 (1)

本文详细介绍了Java中的IO流概念及分类,包括字符流与字节流的区别,输入流与输出流的应用,以及如何使用File类进行文件操作。此外,还介绍了Properties类在配置文件中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------

一概述

IO流是用来处理设备之间的数据传输的,Java对数据的操作都是通过流的方式,Java将用于操作流的对象都封装在IO包中

流按操作数据的不同分为:字符流、字节流

流按流向的不同分为:输入流、输出流

 

字符流其实也是按照字节的方式传输数据,但是它集成了编码表,用于操作文本数据很方便

 

字符流的抽象基类:Reader,Writer

字节流的抽象基类:InputStream,OutputStream

IO流中由基类派生出的子类都以其父类名作为其后缀

 

注意:对于读操作,要明确数据的来源,也就是从哪里读;对于写操作,要明确数据的去向,也就是往哪里写。

 

二字符流

基类:Reader,Writer

 

Reader:

public abstract class Reader

extends Object

implements Readable, Closeable

几个重要的方法:

abstract void close()         关闭资源用的,其实流在底层操作的是系统资源,所以一定要关闭

int read() 读取单个字符。注意返回值是int,如果返回-1,说明已经到了流的末尾

int read(char[] cbuf)         将字符读入数组cbuf,所以要先定义数组,数组大小一般定义1024

abstract int read(char[] cbuf, int off, int len)         将字符读入数组的某一部分。

 

Writer:

public abstract class Writer

extends Object

implements Appendable, Closeable, Flushable

重要方法:

abstract void close()     关闭此流,但要先刷新它。

abstract void flush()      刷新该流的缓冲,writer之后,只有刷新后才能写到目的源

void write(int c)        写入单个字符。

void write(char[] cbuf)     写入字符数组。

abstract void write(char[] cbuf, int off, int len)     写入字符数组的某一部分。

void write(String str)        写入字符串。

void write(String str, int off, int len)         写入字符串的某一部分。

 

在字符流中常用的子类有

FileReader,FileWriter

BufferedReader,BufferedWriter

注意,他们都没有无参的构造函数,因为不管读取还是写入,都要明确源。

对于FileReader和FileWriter,他们的方法都是继承而来的

BufferedReader和BufferedWriter都继承自基类,但是用用装饰设计模式对Writer和和Reader的子类进行了功能的加强。

BufferedReader中注意方法 StringreadLine();读取一行文本

BufferedWriter中注意方法void newline();写入一个分隔符

 

BufferedReader有一个子类叫LineNumberReader可以读取行号

 

装饰设计模式:当想要对已有的对象进行功能的增强时,可以定义类,将已有的对象传入,基于已有的功能,并提供加强的功能,那么这个自定义的类就叫做装饰类。装饰类通常会通过构造方法接收被装饰的对象,并基于被装饰的对象的功能提供更强的功能,例如BufferedReader中的readLine方法就是加强的功能。

 

三字节流

基类:InputStream,OutputStream

方法与字符流大同小异

 

对应字节流,有四个子类

FileInputStream,FileOutputStream

BufferedInputStream,BufferedOutputStream

 

在BufferedInputStream中要注意一个方法

int available() ,可以利用它的返回值创建大小正好的数组来存放读取到的数据,但是如果源文件太大,那么这个数组将很大,可能内存不够用

 

当程序读写文件时,在读写操作完毕后,就会及时的关闭输入流或输出流,这些输入流或输出流的生命周期是短暂的,不会存在于程序运行的整个生命周期中。

对于某些应用程序,需要在程序运行的整个生命周期中,从同一个数据源读入数据,或者像同一个数据汇输出数据,例如日志信息,这就需要一些始终打开的流。

在java.lang.System类中,提供了三个静态变量:

System.in:为InputStream类型,代表标准输入流,默认输入源为键盘

System.out:为PrintStream类型,代表标准输出流,默认数据汇为控制台

System.err:为PrintStream类型,代表标准错误输出流,默认数据汇是控制台

这三种流都是有JVM创建的,他们存在于程序运行的整个生命周期中,这些流始终处于打开状态,除非程序显示的关闭他们,只要程序没有关闭这些流,在程序运行的任意时刻都可以使用他们来输入或输出数据。

 

转换流

读取转换流:InputStreamReader字节流通向字符流的桥梁

写入转换流:OutputStreamWriter字符流通向字节流的桥梁

 

四File类

用来将文本或者文件夹封装成对象,方便对文件和文件夹进行操作。File对象可以作为参数传递给流的构造函数。

属性:

static String separator与系统有关的默认名称分隔符,为了方便,它被表示为一个字符串。

方法:

1.创建和删除

boolean  createNewFile()

 boolean mkdir()

 boolean mkdirs()

 boolean delete()

 void deleteOnExit()

2.判断

boolean  exists()

 boolean isAbsolute()

 boolean isDirectory()

 boolean isFile()

 boolean isHidden()

3.获取

File  getAbsoluteFile()

 String getAbsolutePath()

 File getCanonicalFile()

 String getCanonicalPath()

 long getFreeSpace()

 String getName()

 String getParent()

 File getParentFile()

 String getPath()

 boolean renameTo(File dest)

 

五Properties类

Properties 是 Hashtable 的子类 ,也就是说它具备Map集合的特点,而且它里面存储的键值对都是字符串

它是集合中和IO技术相结合的集合容器

该对象特点:可以用于键值对形式的配置文件。

那么在加载数据时候,需要数据有固定格式:键-值

Properties存取配置文件

 String getProperty(String key) 

 String getProperty(String key,String defaultValue)

 void list(PrintStream out)

 void list(PrintWriter out)

 void load(InputStream inStream)

 void load(Reader reader)

 Object setProperty(String key,String value)

 void store(OutputStream out,String comments)

 void store(Writer writer,String comments)

 

六IO流总结           

体系:

Reader

|--InputStreamReader

|--FileReader

|--BufferedReader

|--LineNumberReader

|--CharArrayReader

|--StringReader

|--PipedReader

Writer

|--OutputStreamWriter

|--FileWriter

|--BufferedWriter

|--CharArrayWriter

|--StringWriter

|--PrintWriter

|--PipedWriter

File

InputStream

|--FilerInputStream

|--LineNumberInputStream

|--BufferedInputStream

|--DataInputStream

|--FileInputStream

|--ByteArrayInputStream

|--PipedInputStream

|--ObjectInputStream

|--SequenceInputStream

OutputStream

|--FilerOutputStream

|--PrintOutputStream

|--BufferedOutputStream

|--DataOutputStream

|--FileOutputStream

|--ByteArrayOutputStream

|--PipedOutputStream

|--ObjectOutputStream

RandomAccessFile

接口

Serializable

 

怎么选择流对象呢?

1.明确源和目的,数据源操作用输入流,写入数据汇用输出流

2.操作的数据是否纯文本,是则用字符流,不是则用字节流

3.是否要提高效率

4.选择具体对象

---------------------- ASP.Net+Unity开发、.Net培训、期待与您交流! ----------------------

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值