1、基础的文件读写
文件的读写原理,其实很简单。通过《18-综合练习1-实现分析-获取键盘输入》这篇文章,我们了解到输入流和输出流。所以,在这里我们扩展出了文件输入流和文件输出流。
以下是文件输入流 和 文件输出流的处理流程:
l 文件输入流的处理:

l 文件输出流的处理:

参考代码如下:
public static void main(String[] args) throws Exception {
//操作系统用户主目录
String userDir = System.getProperties().getProperty("user.home");
//文件所在文件夹
String fileDir = userDir+File.separator+"examproj";
//文件路径
String filePath = fileDir+File.separator+"fileIOTest.txt";
//==== 1、向文件写入内容
FileOutputStream fout = null;
//判断文件夹是否存在
File myDir = new File(fileDir);
if(!myDir.exists() || !myDir.isDirectory() ) {
//如果不存在,或者存在但不是文件夹,则需要创建
myDir.mkdirs();
}
try {
//创建文件输出流
fout = new FileOutputStream(filePath);
//写入一句话
fout.write("这是一句测试用的文字".getBytes("UTF-8"));
System.out.println("INFO: 文字写入完毕。");
}catch(Exception e) {
System.out.println("ERROR: 执行文字输出异常,"+e.getMessage());
throw e;
}finally {
//关闭文件输出流
if(fout!=null) {
try {fout.close();} catch (Exception e) {}
fout=null;
}
System.out.println("INFO: 文件输出流关闭完成。");
}
//==== 2、从文件读取内容
FileInputStream fin = null;
//判断文件是否存在
if(new File(filePath).exists()) {
try {
//创建文件输入流
fin = new FileInputStream(filePath);
//根据文件可读取的字节数创建缓存区(一次性读取)
byte[] buffer = new byte[fin.available()];
String content = null;
//读取内容(使用基础的缓冲区的形式读取)
fin.read(buffer);
content = new String(buffer);
//显示结果
System.out.println("INFO: 文字读取完毕。");
System.out.println("INFO: 文件内容如下:["+content+"]");
}catch(Exception e) {
System.out.println("ERROR: 执行文字输入异常,"+e.getMessage());
throw e;
}finally {
//关闭文件输入流
if(fin!=null) {
try {fin.close();} catch (Exception e) {}
fin=null;
}
System.out.println("INFO: 文件输入流关闭完成。");
}
}else {
System.out.println("ERROR:文件("+filePath+")不存在,无法读取数据。");
}
}
//完毕注意:
(1) 在处理文件的写入(文件输出流)时,要确保文件夹是存在的。因为 Java 语言不会自动创建文件夹,需要自己调用 File 类的 mkdirs 方法创建路径所涉及的所有文件夹。
(2) 文件的输入和输出流,操作的都是字节数据(byte);因此,如果要按字符来处理,则需要转换。
(3) 关于 FileInputStream 和 FileOutputStream 的流关闭操作,因为要保证就算执行有异常,抛出后,仍然能够关闭流处理。所以需要 try…catch…finally 语句。
2、配置文件类的介绍



Properties 类表示一组持久的属性。属性可以保存到流中,也可以从流加载。属性列表中的每个键及其对应的值都是一个字符串。从它的API文档上,我们可以看出,它有2种处理方式:properties 文件 和 xml 文件。这里我们只讨论properties 文件的处理方式。
下面我们开始介绍配置文件的读写。通过上面的截图,我们可以看出 Properties 类的对象可以通过 store 方法写入文件,通过 load 方法读取文件。API调用整体较为简单。所以,我们直接上代码,方便大家观察。
注意:
properties 文件的编码只能为 ISO-8859-1,所以如果有非英文字符,则存储为 unicode 编码形式。
3、配置文件的写入
public static void main(String[] args) throws Exception {
//操作系统用户主目录
String userDir = System.getProperties().getProperty("user.home");
//文件所在文件夹
String fileDir = userDir+File.separator+"examproj";
//文件路径
String filePath = fileDir+File.separator+"myconfig.properties";
//判断文件夹是否存在
File myDir = new File(fileDir);
if(!myDir.exists() || !myDir.isDirectory() ) {
//如果不存在,或者存在但不是文件夹,则需要创建
myDir.mkdirs();
}
//创建一个新的属性对象
Properties config = new Properties();
config.setProperty("user.name", "张三");
config.setProperty("user.age", "12");
//保存配置信息
FileOutputStream out = null;
try {
out = new FileOutputStream(filePath);
//保存
config.store(out, "一些关于人员的配置信息");
//
System.out.println("INFO: 人员配置写入完毕。");
} catch (Exception e) {
//将捕捉到的异常抛出
System.out.println("ERROR: 执行文字输出异常,"+e.getMessage());
throw e;
} finally {
//关闭文件输出流
if(out!=null) {
try {out.close();} catch (Exception e) {}
out=null;
}
System.out.println("INFO: 文件输出流关闭完成。");
}
}生成的文件内容如下:

4、配置文件的读取
public static void main(String[] args) throws Exception {
//操作系统用户主目录
String userDir = System.getProperties().getProperty("user.home");
//文件所在文件夹
String fileDir = userDir+File.separator+"examproj";
//文件路径
String filePath = fileDir+File.separator+"myconfig.properties";
//判断文件是否存在
if(new File(filePath).exists()) {
FileInputStream fin = null;
Properties config = new Properties();
try {
//初始化文件输入流
fin = new FileInputStream(filePath);
//加载信息
config.load(fin);
//显示文件内容
System.out.println("文件内容如下:");
Set<Object> keys = config.keySet();
for(Object o: keys) {
System.out.println("key="+o.toString()+", value="+config.getProperty(o.toString()));
}
} catch (Exception e) {
//将捕捉到的异常抛出
System.out.println("ERROR: 执行文字读取异常,"+e.getMessage());
throw e;
} finally {
//关闭文件输入流
if(fin!=null) {
try {
fin.close();
} catch (Exception e) {
}
fin=null;
}
System.out.println("INFO: 文件输入流关闭完成。");
}
}else {
System.out.println("ERROR:文件("+filePath+")不存在,无法读取数据。");
}
}执行结果如下:

本章完结。