今天Java学习内容:
一、IO流的概述和分类
二、字节流
三、字符流
四、IO流异常处理
五、Properties集合
一、IO流的概述和分类
理解:IO流是用来读写数据的
1.按照流向分类
输入流:硬盘(文件)–>内存(Java程序)
输出流:内存(Java程序)–>硬盘(文件)
2.读写数据分类
字节流:可以读写任何数据(文本、图片、声音、视频…)
InputStream(字节输入流)
OutputStream(字节输出流)
字符流:只能读写文本数据(使用记事本软件打开能看懂的文件,就是文本文件)
Reader(字符输入流)
Writer(字符输出流)
3.使用流的步骤
1)创建流对象(搭桥)
2)读/写数据(过桥)
3)释放资源(拆桥)
二、字节流
1.字节输出流写数据
//1)创建字节流对象(搭桥),关联一个文件
//注意:文件不存在,会自动创建;如果文件存在,会覆盖原来的文件。
FileOutputStream fos=new FileOutputStream("day09-code\\a.txt");
//2)写数据(过桥)
//一次写一个字节数据
fos.write(97); //a
fos.write(98); //b
fos.write(99); //c
fos.write(100); //d
fos.write("\r\n".getBytes()); //换行
//一次写多个字节数据(字节数组)
byte[] bs={97,98,99,100};
fos.write(bs); //abcd
//一次写字节数组的一部分
fos.write(bs,1,2); //bc
//利用字节流写一个字符串(把字符串转换为字节数组)
fos.write("helloworld".getBytes());
fos.write("\r\n".getBytes()); //换行
fos.write("Java".getBytes());
//3)释放资源(拆桥)
fos.close();
2.字节输入流读数据
//1)创建输入流对象(搭桥),关联读取的文件路径
//注意:文件必须存在,才能读取
FileInputStream fis=new FileInputStream("day09-code\\a.txt");
//2)读数据(过桥) 一次读多个字节
byte[] bs=new byte[1024];
int len; //记录每次读取的有效字节个数
while((len=fis.read(bs))!=-1){
//把有效的字节个数,转换为字符串
String str=new String(bs,0,len);
System.out.println(str);
}
//3)释放资源(拆桥)
fis.close();
3.字节流文件复制
需求:把day09-code\\a.txt文件,复制到 daoy-code\\b.txt文件中
//源文件:day09-code\\a.txt
FileInputStream fis=new FileInputStream("day09-code\\a.jpg");
//目标文件:daoy-code\\b.txt
FileOutputStream fos=new FileOutputStream("day09-code\\b.jpg");
//一边读一边写
byte[] bs=new byte[1024];
int len; //记录每次读取的有效字节个数
while ((len=fis.read(bs))!=-1){
//把得到的字节中有效的部分,写到文件中
fos.write(bs,0,len);
}
//释放资源
fis.close();
fos.close();
三、字符流
由于字节流读取数据是【以字节为单位】,由于中文和字母占用的字节数不一样,可能会出现乱码。
所以Java给开发者提供了字符流,专门用来读取文本文件,【以字符为单位】来读取数据。
Reader父类(抽象)
–InputStreamReader(转换流)
–FileReader(读取文本中的字符,默认按照UTF-8编码进行读取)
Writer父类(抽象)
–OutputStreamWriter(转换流)
–FileWriter(写入字符数据,默认按照UTF-8编码进行写入)
1.字符流读取文本文件
//1)创建输入流对象(搭桥),关联读取的文件路径
//注意:文件必须存在,才能读取
FileReader fr=new FileReader("day09-code\\a.txt");
//2)读数据(过桥) 一次读多个字符
char[] bs=new char[1024];
int len; //记录每次读取的有效字符个数
while((len=fr.read(bs))!=-1){
//把有效的字符个数,转换为字符串
String str=new String(bs,0,len);
System.out.println(str);
}
//3)释放资源(拆桥)
fr.close();
2.字符流写入文本文件
//1)创建FileWiter流对象(搭桥)
//true: 表示在文件末尾续写
FileWriter fw=new FileWriter("day09-code\\b.txt",true);
//2)写数据(过桥)
//直接写入字符串
fw.write("奔驰,让女人坐在引擎盖上哭\r\n");
fw.write("\r\n");
fw.write("宝马,让女人坐在车里哭\r\n");
fw.write("凤凰,让女人坐在自行车上笑\r\n");
//写入真个字符数组
char[] chs={'a','b','c','车','水','马','龙'};
fw.write(chs);
fw.write("\r\n");
//写入字符数组的一部分
fw.write(chs,1,5);
fw.flush(); //把数据刷新到文件中
//3)释放资源(拆桥)
fw.close(); //先自动刷新,再释放资源
3.字符流复制文件
//源文件:day09-code\\a.txt
FileReader fr=new FileReader("day09-code\\a.txt");
//目标文件: day09-code\\b.txt
FileWriter fw=new FileWriter("day09-code\\b.txt");
//读写数据
char[] chs=new char[1024];
int len; //记录每次读取的有效字符个数
while((len=fr.read(chs))!=-1){
//写入有效字符个数到文件
fw.write(chs,0,len);
}
//释放资源
fr.close();
fw.close();
四、IO流异常处理
选中有异常的代码(红色波浪线),添加 try…catch
快捷键:ctrl+alt+T
public static void main(String[] args) {
FileWriter fw=null;
try {
fw=new FileWriter("day09-code\\c.txt");
fw.write("HelloWorld");
} catch (IOException e) {
e.printStackTrace();
} finally {
//如果fw表示的对象创建失败,那么fw就为null.
if(fw!=null){
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
五、Properties集合
Properties的继承结构
Map(接口)
–HashMap
–Hashtable
–Properties
Properties也是一个双列集合,键和值都只能是字符串类型
Map集合有的方法,Properties都可以使用。
Properties还有一些特有的方法
String getProperty(String key)
获取根据键获取值
Object setProperty(String key, String value)
往集合中添加键和值。
注意:如果键重复,返回被覆盖的值
void store(OutputStream out, String comments)
把集合中的键值对,存储到文件中
void load(InputStream inStream)
把文件中的键值对,读取到集合中
软件试用案例:
Properties pro=new Properties();
//读取配置文件
pro.load(new FileReader("day09-code\\config.properties"));
//获取配置文件中count对应的值 value
String value = pro.getProperty("count");
//把字符串的value转换为整数
int count = Integer.parseInt(value);
//对count的值进行判断
if(count>0){
//如果大于0(说明还有试用次数),继续使用再让count--;
count--;
System.out.println("欢迎使用本软件,还剩"+count+"次机会");
//把新的值再写回配置文件中
pro.setProperty("count",count+"");
pro.store(new FileWriter("day09-code\\config.properties"),"");
}else{
System.out.println("不好意思,使用次数已到,请充值!!!");
}