版权声明:本文为博主吕小布原创文章,未经允许不得转载。 https://blog.csdn.net/qq_36769100/article/details/82760013
摘要:在Java中,想要读写文件,大多采用的都是流的形式,那么今天就来记录一下这传说中的流。
目录
一、流的简单介绍
Java中流主要分为两大类:字符流和字节流,放一张我盗的图:
字节流<图中右侧分支>:
字节流,就是以字节为处理对象进行写入写出,比如处理string字符串时,需要将其转换成字节(getByte)然后进行操作。
注意:字节流可以设置编码格式.(划重点)
字符流<图中左侧分支>:
字符流,可直接对字符串进行操作,无需转换为字节
注意:字符流不能直接设置编码格式,只能通过调用字节流进行设置。(具体可看以下Demo)
当然,以上只是简单的介绍,如果想深入了解的大佬,请自己另行百度。
另外,啰嗦一句:流的概念是以Java程序为本体的,
所以将字符串从程序中保存到本地文件,叫out,也叫writer(写出);
相反,在程序中读取本地文件,就叫做in,也叫reader(读取)。
二、写出文件Demo<并设置编码>
废话不多说,直接上代码:
/**
* 将传入字符串,写到本地指定文件中
* @param str
*/
public static void handIo(String s){
//写出文件的保存位置
String filePath = "D:\\flie\\test.xml";
File file = new File(filePath);
Writer bw = null;
try {
//判断文件是否存在
if(!file.exists()){//如果不存在,新建文件
file.createNewFile();
}
//调用字节流,设置写入文件编码格式
OutputStreamWriter ow = new OutputStreamWriter(new FileOutputStream(filePath),"GBK");
//设置文件内容为覆盖模式
bw = new BufferedWriter(ow);
//设置文件内容往后追加,默认为false
//bw = new BufferedWriter(new FileWriter(file, true));
//写入
bw.write(s);
} catch (IOException e) {
e.printStackTrace();
} finally {
//关闭流
try {
if(bw != null){
bw.flush();
bw.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
简单补充两点:
- 2.1.以上Demo,通过字节流,将编码设置为GBK后写入文本,如果你的文本默认已非GBK编码打开,那么打开文本后,显示出来的内容会乱码。但是,当你读取文件时,只要设置编码格式也为GBK,那么就会成功读取文件中的内容。
- 2.2.Demo中初始化BufferedWriter时传入的ow字节流可以用FileWriter替换,只是无法通过这种形式设置编码。
- 2.3.写出文件就不放控制台输出了。
三、读取文件Demo<并设置编码>
public static String handIo() {
StringBuffer sb = new StringBuffer();
//日常指定读取的文件
String filePath = "D:\\flie\\test.xml";
File file = new File(filePath);
if (!file.exists()) {
System.out.println("文件不存在");
} else {
//初始化读取操作的br对象
BufferedReader br = null;
try {
//调用字节流,设置读取文件的编码格式
InputStreamReader ir = new InputStreamReader(new FileInputStream(filePath), "GBK");
br = new BufferedReader(ir);
//格式固定,对象名len可以自拟
String len = null;
while ((len = br.readLine()) != null) {
//逐行输出
System.out.println("....." + len);
sb.append(len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return sb.toString();
}
这里也简单说两点:
- 3.1.readLine()可以判断是否是最后一行,但是格式基本如Demo固定
- 3.2.控制台输出如下(与文件中内容一致):
.....<User>
..... <name>吕小布</name>
..... <age>23</age>
..... <customer>
..... <Customer>
..... <commodity>手表</commodity>
..... </Customer>
..... <Customer>
..... <commodity>电脑</commodity>
..... </Customer>
..... </customer>
.....</User>
如果有书写错误的地方,或者是有问题的地方请及时评论或者是私信我,以免误导个别萌新。
虽然我也是个萌新。
你好,我叫吕小布。