java基础篇笔记19

IO
输入:把硬盘中的数据,读取到内存中使用;
输出:把内存中的数据写入到硬盘中保存。
流:数据(字符,字节)
1个字符=2个字节
1个字节=8个二进制位

一切皆为字节
一切文件数据(文本、图片、视频等)在存储时,都是以二进制数字的形式保存,都一个一个的字节,那么传输时一样如此。所以,字节流可以传输任意文件数据。在操作流的时候,我们要时刻明确,无论使用什么样的流对象,底层传输的始终为二进制数据。

java.io.OutputStream 字节输出流,此抽象类时表示字节流的所有类的超类。
定义的一些子类共性成员方法:
public void close() :关闭此输出流并释放与此流相关联的任何系统资源。
public void flush() :刷新此输出流并强制任何缓冲的输出字节被写出。
public void write(byte[] b) :将 b.length字节从指定的字节数组写入此输出流。
public void write(byte[] b, int off, int len) :从指定的字节数组写入 len字节,
从偏移量off开始输出到此输出流。
public abstract void write(int b) :写入指定的字节输出流,每次一个字节。

java.io.FileOutputStream extends OutputStream
FileOutputStream:文件字节输出流
作用:把内存中的数据写入到硬盘的文件中。

构造方法:
FileOutputStream(String name)创建一个向具有指定名称的文件中写入数据的输出文件流。
FileOutputStream(File file)创建一个向指定File对象表示的文件写入数据的文件输出流。
参数:写入数据的目的
String name:目的是一个文件的路径。
File file:目的是一个文件。
构造方法的作用:
1 创建一个FileOutputStream对象
2 会根据构造方法中传递的文建/文件路径,创建一个空的文件
3 会把FileOutputStream对象指向创建好的文件。

写入数据的原理(内存->硬盘)
java程序—>JVM(java虚拟机)—>OS操作系统—>OS调用些数据的方法—>把数据写入到文件中

字节输出流的使用步骤(重点):
1 创建一个FileOutputStream对象,构造方法中传递写入数据的目的地;
2 调用FileOutputStream对象中的方法write,把数据写入文件中;
3 释放资源(六使用会占用一定的内存,使用完毕要把内存清空,提高程序的效率)。

任意的文本编辑器(记事本,notepad……)
再打开文件的时候,都会查询ASCII表把字节转换成字符。

一次写多个字节的方法:
public void write(byte[ ] b): 将b.length字节从指定的字节数组写入此输出流。
一次写多个字节:
如果写的第一个字节是整数(0-127),那么现实的时候会查询ASCII表
如果写的第一个字节是负数,那第一个字节会和第二个字节,两个字节组成一个中文显示,查询系统默认码表(GBK)。
public void write(byte[ ] b,int off, int len):把字节数组的一部分写入到文件中。
int off :数组的开始索引
int len :写几个字节

写入字符的方法:可以使用String类中的方法吧字符串转换成字节数组
byte[ ] getByte() 把字符串转换为字节数组。

追加写/续写:使用两个参数的构造方法
public FileOutputStream(File file, boolean append) : 创建一个向具有指定那么的文件中写入数据的输出文件流。
public FileOutputStream(String name, boolean append) : 创建一个向指定File独享表示的文件中写入数的文件输出流。
参数:
String name,File file:写入数据的目的地
boolean append:追加写开关
true:创建对象,不会覆盖源文件,继续在文件的末尾追加写数据
false:创建一个新文件,覆盖源文件
写换行:写换行符号
Windows:\r\n
Linux:/n
mac:/r

字节输入流
java.io.InputStream 抽象类是表示字节输入流的所有类的超类。

定义了所有子类共性的方法:
int read( )从输入流中读取数据的下一个字节
int read(byte[ ] b ) 从输入流中读取一定数量的字节,并将其存储在缓冲区数组b中
void close( ) 关闭次输入流并释放与该流相关的所有系统资源。

java.io.FileInputStream extends InputStream
FileInputStream:文件字节输入流。
租用:把硬盘中文件的数据,读取到内存中使用。

构造方法:
FileInputStream(File file)
FileInputStream(String name)
参数:读取文件的数据源
String name:文件的路径
File file:文件
构造方法的作用:
1 会创建一个FileInputStream对象
2 会把FileInputStream对象指定构造方法中要读取的文件。
读取数据的原理(硬盘->内存)
java程序—>JVM(java虚拟机)—>OS操作系统—>OS读取数据的方法—>读取文件

字节输入流的使用步骤(重点):
1 创建FileInputStream对象,构造方法中绑定要读取的数据源
2 使用FileInputStream对象中的方法read,读取文件
3 释放资源

读取字节: read 方法,每次可以读取一个字节的数据,提升为int类型,读取到文件末尾,返回 -1 。

使用字节数组读取: read(byte[] b) ,每次读取b的长度个字节到数组中,返回读取到的有效字节个数,读
取到末尾时,返回 -1 。
从输入流中读取一定数量的字节,并将其存储在缓冲器数组b中。
明确两件事请:
1 方法的参数byte[]的作用?
起到缓冲作用,存储每次读取到的多个字节。
数组的长度一般定义为1024(1kb)或者1024的整数倍。
2方法的返回值int是什么?
每次读取的有效字节个数。

流的关闭原则:先开后关,后开先关。

java.io.Reader :抽象类,字符输入流,是是字符输入流最顶层的超类。定义了一些共性成员方法。

public void close() :关闭此流并释放与此流相关联的任何系统资源。
public int read() : 读取单个字符并返回。
public int read(char[] cbuf) : 一次读取多个字符,并将其存储到字符数组 cbuf中 。

java.io.FileReader 类是读取字符文件的便利类。
java.io.FileReader extends InputStreamReader extends Reader

FileReader:文件字符输入流
作用:把文件中的数据以字符的方式读取到内存中。
构造方法:
FileReader(String fileName)
FileReader(File file)
参数:String fileName:文件名称
File file:一个文件。
FileReader构造方法的作用:
1 创建一个FileReader对象
2 会把FileReader对象指向要读取的文件。

字符输入流的使用步骤:
1 创建FileReader对象;
2 使用FileReader对象中的read方法读取文件;
3 释放资源。

Writer:字符输出流,是所有字符输出流的父类,是一个抽象类。
共性成员方法:
void write(int c) 写入单个字符。
void write(char[] cbuf) 写入字符数组。
abstract void write(char[] cbuf, int off, int len) 写入字符数组的某一部分,off数组的开始索引,
len写的字符个数。
void write(String str) 写入字符串。
void write(String str, int off, int len) 写入字符串的某一部分,off字符串的开始索引,
len写的字符个数。
void flush() 刷新该流的缓冲。
void close() 关闭此流,但要先刷新它。

java.io.FileWriter extends OutputStreamWriter extends Writer
作用:把内存中的字符数据写入到文件中。

构造方法:
FileWriter(File file) : 创建一个新的 FileWriter,给定要读取的File对象。
FileWriter(String fileName) : 创建一个新的 FileWriter,给定要读取的文件的名称。
参数:写入数据的目的地。
String fileName:文件名称
File file:一个文件。
构造方法的作用:
1 创建一个FileWriter对象
2 会根据构造方法传递的文件/文件的路径,创建文件
3 会把FileWriter对象指向创建好的文件。

字符输出流的使用步骤(重点):
1 创建FileWriter对象,构造方法中绑定要写入数据的目的地
2 使用FileWriter中的方法write,把数据写入到内存缓冲区中
3 使用FileWriter中的方法flush,把内存缓冲区中的数据,刷新到文件中
4 释放资源(会先把内存缓冲区中的数据刷新到文件中)

flush和close方法的区别:
flush :刷新缓冲区,流对象可以继续使用。
close:先刷新缓冲区,然后通知系统释放资源。流对象不可以再被使用了。

注意:
字符流,只能操作文本文件,不能操作图片,视频等非文本文件。
当我们单纯读或者写文本文件时 使用字符流 其他情况使用字节流。

在JDK1.7之前,使用try……catch处理流中的异常
格式:
try{
可能出现异常的代码
}catch{
异常处理逻辑
}finally{
一定会指定的代码
资源释放
}

创建对象需要提到try……catch之外,先赋一个空值,但是最后的close还会报错,就再来一个try……catch。
增加一个判断,保证在流对象不是空是才能执行close

JDK1.7的新特性
在try后增加一个(),在括号中可以定义流对象
那么这个流对象的作用域就在try中有效
try中的代码执行完毕,会自动把流对象释放,不用谢finally
格式:
try(定义流对象;定义流对象…){
可能出现异常的代码
}catch(异常类变量 变量名){
异常的处理逻辑
}

JDK1.9的新特性
在try前边可以定义流对象
在try后边的()中可以直接引入流对象的名称(变量名)
在try代码执行完毕后,流对象也可以释放掉不用谢finally
格式:
A a = new A();
B b = new B();
try (a,b){
可能会出异常的代码
}catch{
异常处理逻辑
}

java.util.Properties extends Hashtable<k,v> implement Map<k,v>
Properties类表示了一个持久的属性集。Properties可保存在流中或从流中加载。
Properties集合是唯一可IO流相结合的集合
可以使用Properties集合中的方法store,把集合中的临时数据,持久化写入到硬盘中保存
可以使用Properties集合中的方法load,把硬盘保存的文件(键值对),读取到集合中使用

属性列表中俄每个键及其对应值都是一个字符串
Properties集合是一个双列集合,key和value默认都是字符串。

使用Properties集合存储数据,遍历取出Properties集合中的数
Properties集合是一个双列集合,key和value默认都是字符串
Properties集合有一些操作字符串的特有方法
Object setProperty(String key, String value) : 调用Hashtable的方法put。
String getProperty(String key) :通过key找到value值,此方法相当于Map集合中的get(key)方法。
Set stringPropertyNames() :返回此属性列表中的键集,其中该键及其对应值是字符串,此方法相当于Map集合中的keyset方法。

可以使用Properties集合中的方法store,把集合中的临时数据,持久化写入到硬盘中保存
void store(OutputStream out, String comments)
void store(Writer writer, String comments)
参数:
OutputStream out:字节输出流,不能写入中文
Writer writer:字符输出流,可以写中文
String comments:注释:用来解释说明保存的文件是做什么用的
不能使用中文,会产生乱码,默认是Unicode编码
一般使用“”空字符串
使用步骤:
1 创建Properties集合对象,添加数据
2 创建字节输出流/字符输出流对象,构造方法中绑定要输出的摸弟弟
3 使用Properties集合中的方法store,把集合中的临时数据,持久化写入到硬盘中存储
4 释放资源。

可以使用Properties集合中的方法load,把硬盘保存的文件(键值对),读取到集合中使用
void load(Reader reader)
void load(InputStream inStream)
参数:
InputStream inStream:字节输入流,不能读取含有中文的键值对
Reader reader:字符输入流,能读取含有中文的键值对。
使用步骤:
1 创建Properties集合对象
2 使用Properties集合对象中的方法load读取被保存键值对的文件
3 遍历Properties集合

注意:
1 存储键值对的文件中,键与值默认的连接符号可以使用-,空格(其他符号);
2 存储键值对的文件中,可以使用#进行注释,被注释的键值对不会被再读取;
3 存储键值对的文件中,键与值都是默认字符串,不用再加引号。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值