在上一篇文章中,回顾了Java的多线程。而在本篇文章中主要介绍Java IO的相关知识。bash
什么是IO?多线程
IO的名称又来是Input与Output的缩写,也就是输入流和输出流。输入流用于从源读取数据,输出流用于向目标写数据。app
能够从下列示例图来了解IO流: 学习
IO流对文件的操做主要分为字符流和字节流。ui
字符流有两个抽象类:Writer和Reader类。 其对应子类FileWriter和FileReader可实现文件的读写操做。 BufferedWriter和BufferedReader可以提供缓冲区功能,用以提升效率。编码
我记得在开始学习Java不久的时候, 在教程中会使用 字符流来进行字符的读取和写入。比较常见的就是,运行一个main方法,而后再控制台输入字符,获取输入的字符作一些逻辑控制之类。 例如: 在控制台输入字符,输入quit退出,输入其它的字符打印。spa
代码示例:.net
public static void main(String[] args) {
try {
test();
} catch (IOException e) {
e.printStackTrace();
}
}
private static void test() throws IOException {
String str;
// 使用 System.in 建立 BufferedReader
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
System.out.println("输入字符, 输入 'quit' 退出。");
// 读取字符
do {
str=br.readLine();
System.out.println("您输入的字符是:"+str);
} while(!str.equals("quit"));
br.close();
}
复制代码
而后咱们输入 hello 和quit。 结果以下:线程
输入字符, 输入 'quit' 退出。
hello
您输入的字符是:hello
您输入的字符是:
quit
您输入的字符是:quit
复制代码
经过上述示例咱们能够简单的了解下了字符流。 通常来讲,咱们主要用字符流的状况是读写文件,大部分也是文本文件,好比.txt后缀的。这里咱们也顺便介绍下如何使用。code
代码示例:
/**
*
* 写入和读取文件
* @throws IOException
*/
private static void test2() throws IOException {
//建立要操做的文件路径和名称
String path ="E:/test/hello.txt";
String str="hello world";
FileWriter fw = new FileWriter(path);
fw.write(str);
fw.close();
FileReader fr = new FileReader(path);
StringBuffer sb=new StringBuffer();
while(fr.ready()){
sb.append((char)fr.read());
}
System.out.println("输出:"+sb.toString());
fr.close();
}
复制代码
注:若是在不一样的系统上运行,能够使用 File.separator方法,该方法表示系统的分隔符。
输出结果:
输出:hello word
复制代码
上述代码示例中,咱们使用FileWriter 和FileReader 这两个类对文件进行读写,虽然能够实现字符的写入和读取,可是效率并不高,由于是对磁盘的直接读写。通常对于文件的读写,咱们会使用缓冲。使用缓冲的好处就像 倒垃圾同样,将垃圾进行整理堆积,而后到了必定的规模在丢弃,而不是有一点垃圾就倒一次。
那么在上述的代码中加上BufferedWriter和BufferedReader类来进行缓冲。
代码示例:
/**
* 写入和读取文件
* @throws IOException
*/
private static void test3() throws IOException {
//建立要操做的文件路径和名称
String path ="E:/test/hello.txt";
String str="你好!";
FileWriter fw = new FileWriter(path);
BufferedWriter bw=new BufferedWriter(fw);
bw.write(str);
bw.close();
fw.close();
FileReader fr = new FileReader(path);
BufferedReader br=new BufferedReader(fr);
StringBuffer sb=new StringBuffer();
while(br.ready()){
sb.append((char)br.read());
}
System.out.println("输出:"+sb.toString());
br.close();
fr.close();
}
复制代码
注:须要注意的是关闭的顺序,先关闭缓冲,再关闭文件。
字节流也有两个抽象类:InputStream和OutputStream类。 其对应子类有FileInputStream和FileOutputStream实现文件读写操做。 BufferedInputStream和BufferedOutputStream提供缓冲区功能
字节流也能对文本进行读取,可是它的主要使用的场景是读取没法直接获取文本信息的二进制文件,好比音乐文件、视频文件、图片文件等等。 这里咱们依旧对文件进行读取和写入,不过咱们把以前写入到hello.txt文件的内容加上 '你好' 写入到新的文件中。因为这里使用的了中文,因此须要设置相应的编码。
代码示例:
/**
* 建立一个文件并读取记录
* @throws IOException
*/
private static void test4() throws IOException {
String path="E:/test/hello.txt";
String path2="E:/test/你好.txt";
String str="你好!";
//从文件读取数据
InputStream input = new FileInputStream(path);
InputStreamReader reader = new InputStreamReader(input, "UTF-8");
StringBuffer sb=new StringBuffer();
while(reader.ready()){
sb.append((char)reader.read());
}
input.close();
reader.close();
//建立一个文件并向文件中写数据
OutputStream output = new FileOutputStream(path2);
OutputStreamWriter writer = new OutputStreamWriter(output, "UTF-8");
writer.write(sb+str);
writer.close();
output.close();
//从文件读取数据
InputStream input2 = new FileInputStream(path2);
InputStreamReader reader2 = new InputStreamReader(input2, "UTF-8");
StringBuffer sb2=new StringBuffer();
while(reader2.ready()){
sb2.append((char)reader2.read());
}
System.out.println("输出:"+sb2);
input2.close();
reader2.close();
}
复制代码
结果:
输出:hello world你好!
复制代码
能够看到结果符合咱们的预期。
学习IO流中,咱们也会接触File类。 File类中主要是对文件夹的一些操做。好比,文件夹的建立、删除、查看等等。 这里咱们就简单的介绍下File类的相关使用,仍是使用代码配合注释来进行说明。
代码示例:
private static void test5() throws IOException {
String path="E:/test/test2";
String path2="E:/test/test3/test3";
String path3="E:/test/test2/test2.txt";
File f = new File(path);
File f2 = new File(path2);
File f3 = new File(path3);
//建立文件夹
System.out.println("="+f.mkdir());
//建立文件夹和全部父文件夹
System.out.println("=="+f2.mkdirs());
//建立一个文本
System.out.println("==="+f3.createNewFile());
//获取名称
System.out.println("==="+f3.getName());
//获取父级名称
System.out.println("==="+f3.getParent());
//获取当前路径
System.out.println("==="+f3.getPath());
//判断是不是目录
System.out.println("=="+f2.isDirectory());
System.out.println("==="+f3.isDirectory());
//删除该文件
System.out.println("==="+f3.delete());
}
复制代码
输出结果:
=true
==true
===true
===test2.txt
===E:\test\test2
===E:\test\test2\test2.txt
==true
===false
===true
复制代码
关于File类的相关只是简单的介绍了下,具体的使用还须要配置实际的场景。须要注意的是,在进行文件建立和删除的时候,须要先判断是否存在,不然将抛出异常。
到此,本文就结束了,谢谢阅读!欢迎留言和点赞,你的支持是我写做最大的动力!
版权声明: 做者:虚无境 博客园出处:http://www.cnblogs.com/xuwujing CSDN出处:http://blog.csdn.net/qazwsxpcm 我的博客出处:http://www.panchengming.com