IO:
数据的传输,可以看做是一种数据的流动,按照流动的方向,以内存为基准,分为输入input 和输出output ,即流向内存是输入流,流出内存的输出流
IO流分类:
流的关闭原则:先开后关,后开先关 实际都可以
字节流:以字节为单位,读写数据的流
顶级父类:
输入:InputStream(抽象类) 字节输入流
read(); 从输入流读取数据的下一个字节, 每次可以读取一个字节的数据,并提升为 int 类型数值,读取到文件末尾返回 -1
read(byte[ ] b); 从输入流中读取一些字节数,并将它们存储到字节数组 b中
用OutputStream(抽象类)的实现类完成操作 FileInputStream类
FileInputStream(File file): 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的 File对象 file命名。
FileInputStream(String name): 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的路径名 name命名。
当创建一个流对象时,必须传入一个文件路径。该路径下,如果没有该文件,会抛出FileNotFoundException
public class FileInputStreamConstructor throws IOException{
public static void main(String[] args) {
// 使用File对象创建流对象
File file = new File("a.txt");
FileInputStream fos = new FileInputStream(file);
// 使用文件名称创建流对象
FileInputStream fos = new FileInputStream("b.txt");
}
}
输出:OutputStream(抽象类) 字节数出流
close():刷新缓冲区并关闭此输出流,释放资源 (完成输出后必须释放系统资源)
flush():刷新缓冲区,流对象可以继续使用。
·write(int b):将指定的字节输出流(参数为int数值,文件中显示为对应的字符)
·write(byte[ ] b):将指定的字节数组写入此输出流(数组元素没有,默认值为0,表示空格)
·write(byte[ ] b, int start , int length):将指定数组内的 从 start号索引开始 length 个元素内容写入输出流
需要用OutputStream(抽象类)的实现类完成操作 FileOutputStream类
1.创建对象
FileOutputStream fos = new FileOutputStream(File file , boolean b); 构造方法file参数为指定输出流内容的目标文件 file文件中, b 表示是否续写(true表示续写;false表示清空后在写入)
public FileOutputStream(String name): 创建文件输出流以指定的名称写入文件
当你创建一个流对象时,必须传入一个文件路径。该路径下,如果没有这个文件,会创建该文件。如果有这个文件,会清空这个文件的数据
2.调用 write();方法输出内容
3.close(); 释放资源
例:
public class FileOutputStreamConstructor throws IOException {
public static void main(String[] args) {
// 使用File对象创建流对象
File file = new File("a.txt");
FileOutputStream fos = new FileOutputStream(file);
// 使用文件名称创建流对象
FileOutputStream fos = new FileOutputStream("b.txt");
}
}
Windows系统里,换行符号是\r\n
Unix系统:\n
Mac系统:\r
回车符\r和换行符\n :
回车符:回到一行的开头(return)
换行符:下一行(newline) 从 Mac OS X开始与Linux统一
字符流:以字符为单位,读写数据的流
当使用字节流读取文本文件时,可能会有一个小问题。就是遇到中文字符时,可能不会显示完整的字符,那是因为一个中文字符可能占用多个字节存储
字符输入流: Reader 抽象类
close() :关闭此流并释放与此流相关联的任何系统资源。
read(): 从输入流读取一个字符。
read(char[ ] ch): 从输入流中读取一些字符,并将它们存储到字符数组 ch中 。
字符编码:字节与字符的对应规则。Windows系统的中文编码默认是GBK编码表。
idea中UTF-8
字节缓冲区:一个字节数组,用来临时存储字节数据。
字符输出流:Writer 抽象类
write(int c) 写入单个字符。
write(char[ ] ch)写入字符数组。
write(char[ ] ch, int off, int len)写入字符数组的某一部分,off数组的开始索引,len写的字符个数。
write(String str)写入字符串。
write(String str, int off, int len) 写入字符串的某一部分,off字符串的开始索引,len写的字符个数。
flush()刷新该流的缓冲。
close() 关闭此流,但要先刷新它。
public class FWWrite {
public static void main(String[] args) throws IOException {
// 使用文件名称创建流对象
FileWriter fw = new FileWriter("fw.txt");
// 字符串转换为字节数组
char[] chars = "黑马程序员".toCharArray();
// 写出字符数组
fw.write(chars); // 黑马程序员
// 写出从索引2开始,2个字节。索引2是'程',两个字节,也就是'程序'。
fw.write(b,2,2); // 程序
// 关闭资源
fos.close();
}
}
字符流,只能操作文本文件,不能操作图片,视频等非文本文件。
IO异常处理
public class HandleException1 {
public static void main(String[] args) {
// 声明变量
FileWriter fw = null;
try {
//创建流对象
fw = new FileWriter("fw.txt");
// 写出数据
fw.write("黑马程序员"); //黑马程序员
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (fw != null) {
fw.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
JDK7优化后的try-with-resource 语句,该语句确保了每个资源在语句结束时关闭。所谓的资源(resource)是指在程序完成后,必须关闭的对象。
格式:
try (创建流对象语句,如果多个,使用';'隔开) {
// 读写数据
} catch (IOException e) {
e.printStackTrace();
}
例:
public class HandleException2 {
public static void main(String[] args) {
// 创建流对象
try ( FileWriter fw = new FileWriter("fw.txt"); ) {
// 写出数据
fw.write("黑马程序员"); //黑马程序员
} catch (IOException e) {
e.printStackTrace();
}
}
}
Properties类
构造方法
public Properties() :创建一个空的属性列表。
基本的存储方法
public Object setProperty(String key, String value) : 保存一对属性。
public String getProperty(String key) :使用此属性列表中指定的键搜索对应的属性值。
public Set<String> stringPropertyNames() :所有键的名称的集合。
public class ProDemo {
public static void main(String[] args) throws FileNotFoundException {
// 创建属性集对象
Properties properties = new Properties();
// 添加键值对元素
properties.setProperty("filename", "a.txt");
properties.setProperty("length", "209385038");
properties.setProperty("location", "D:\\a.txt");
// 打印属性集对象
System.out.println(properties);
// 通过键,获取属性值
System.out.println(properties.getProperty("filename"));
System.out.println(properties.getProperty("length"));
System.out.println(properties.getProperty("location"));
// 遍历属性集,获取所有键的集合
Set<String> strings = properties.stringPropertyNames();
// 打印键值对
for (String key : strings ) {
System.out.println(key+" -- "+properties.getProperty(key));
}
}
}
输出结果:
{filename=a.txt, length=209385038, location=D:\a.txt}
a.txt
209385038
D:\a.txt
filename -- a.txt
length -- 209385038
location -- D:\a.txt
与流相关的方法
store(OutputStream out, String comments): 将集合用字节流写入文件(不能中文),并写入注释
store(Writer writer, String comments): 将集合用字符流写入文件(可以中文),并写入注释
load(InputStream inStream): 从配置文件中通过字节流加载数据到Properties集合(不能中文)
load(Reader reader): 从配置文件中通过字符流加载数据到Properties集合(可以中文)
文本中的数据,必须是键值对形式,可以使用空格、等号、冒号等符号分隔。
属性集(配置文件), 标准的后缀是 .properties
配置文件格式要求:
一行一个键值对
键和值中间用=分隔 (标准格式, 但空格分开也行)
#表示单行注释
|