前言

在上一篇文章中,回顾了Java的多线程。而在本篇文章中主要介绍Java IO的相关知识。

IO的介绍

什么是IO?

IO的名称又来是Input与Output的缩写,也就是输入流和输出流。输入流用于从源读取数据,输出流用于向目标写数据。

可以从下列示例图来了解IO流:

IO流使用

IO流对文件的操作主要分为字符流和字节流。

字符流

字符流有两个抽象类:WriterReader类。
其对应子类FileWriterFileReader可实现文件的读写操作。
BufferedWriterBufferedReader能够提供缓冲区功能,用以提高效率。

我记得在开始学习Java不久的时候, 在教程中会使用 字符流来进行字符的读取和写入。比较常见的就是,运行一个main方法,然后再控制台输入字符,获取输入的字符做一些逻辑控制之类。
例如: 在控制台输入字符,输入quit退出,输入其它的字符打印。

代码示例:

    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();}

然后我们输入 helloquit
结果如下:

输入字符, 输入 'quit' 退出。
hello
您输入的字符是:hello
您输入的字符是:
quit
您输入的字符是:quit

通过上述示例我们可以简单的了解下了字符流。
一般来说,我们主要用字符流的情况是读写文件,大部分也是文本文件,比如.txt后缀的。这里我们也顺便介绍下如何使用。

代码示例:

    /**** 写入和读取文件* @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

上述代码示例中,我们使用FileWriterFileReader 这两个类对文件进行读写,虽然可以实现字符的写入和读取,但是效率并不高,因为是对磁盘的直接读写。一般对于文件的读写,我们会使用缓冲。使用缓冲的好处就像 倒垃圾一样,将垃圾进行整理堆积,然后到了一定的规模在丢弃,而不是有一点垃圾就倒一次。

那么在上述的代码中加上BufferedWriterBufferedReader类来进行缓冲。

代码示例:

    /*** 写入和读取文件* @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();}

注:需要注意的是关闭的顺序,先关闭缓冲,再关闭文件。

字节流

字节流也有两个抽象类:InputStreamOutputStream类。
其对应子类有FileInputStreamFileOutputStream实现文件读写操作。
BufferedInputStreamBufferedOutputStream提供缓冲区功能

字节流也能对文本进行读取,但是它的主要使用的场景是读取无法直接获取文本信息的二进制文件,比如音乐文件、视频文件、图片文件等等。
这里我们依旧对文件进行读取和写入,不过我们把之前写入到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你好!

可以看到结果符合我们的预期。

File

学习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

转载于:https://www.cnblogs.com/xuwujing/p/9191546.html

Java基础知识回顾之六 ----- IO流相关推荐

  1. Java基础知识强化之IO流笔记42:IO流总结(图解)

    1. IO流总结(图解) 转载于:https://www.cnblogs.com/hebao0514/p/4868913.html

  2. Java基础知识强化之IO流笔记41:字符流缓冲流之复制文本文件案例02(使用 [ newLine() / readLine() ] )(重要)...

    1. 使用字符流缓冲流的特殊功能 [ newLine() / readLine() ] 需求:把当前项目目录下的a.txt内容复制到当前项目目录下的b.txt中  数据源: a.txt -- 读取数据 ...

  3. Java基础知识强化之IO流笔记32:转换流之OutputStreamWriter的使用

    1. OutputStreamWriter的使用 OutputStreamWriter(OutputStream out):根据默认编码把字节流的数据转换为字符流 OutputStreamWriter ...

  4. Java基础知识强化之IO流笔记44:IO流练习之 复制图片的 4 种方式案例

    1. 复制图片的 4 种方式案例: 分析: 复制数据,如果我们知道用记事本打开并能够读懂,就用字符流,否则用字节流. 通过该原理,我们知道我们应该采用字节流. 而字节流有4种方式,所以做这个题目我们有 ...

  5. Java基础知识强化之IO流笔记59:打印流

    1. 打印流 (1)分类: • 字节打印流   PrintStream • 字符打印流   PrintWriter (2)打印流的特点: • 只能写数据,不能读数据 • 只能操作目的地,不能操作数据源 ...

  6. Java基础知识强化之IO流笔记03:throws的方式处理异常

    1. 什么时候使用throws ? (1)定义功能方法时候,需要把出现的问题暴露出来,让调用者去处理.那么就通过throws在方法上标识. (2)有时候,我们是可以对异常进行处理的,但是又有些时候,我 ...

  7. Java基础知识强化之IO流笔记13:递归之不死神兔问题(斐波那契数列)

    1.这个问题是如下的:    有一对兔子,从出生后第3个月起,每个月都生一对兔子,小兔子长到第3个月又生一对兔子,加入兔子都不死,问第20个月兔子的对数? 分析:我们找规律 兔子对数 第1个月:   ...

  8. java不死神兔总数_Java基础知识强化之IO流笔记13:递归之不死神兔问题(斐波那契数列)...

    1.这个问题是如下的: 有一对兔子,从出生后第3个月起,每个月都生一对兔子,小兔子长到第3个月又生一对兔子,加入兔子都不死,问第20个月兔子的对数? 分析:我们找规律 兔子对数 第1个月:   1 第 ...

  9. Java基础知识回顾之七 ----- 总结篇

    前言 在之前Java基础知识回顾中,我们回顾了基础数据类型.修饰符和String.三大特性.集合.多线程和IO.本篇文章则对之前学过的知识进行总结.除了简单的复习之外,还会增加一些相应的理解. 基础数 ...

最新文章

  1. CF338D GCD Table(拓展中国剩余定理,细节处理,2900分)
  2. R语言ggplot2可视化分面直方图(faceting histogram)、使用gghighlight包突出高亮突出每个分面中的一个分组的直方图
  3. “Python来玩微信跳一跳”教程(问题总结)
  4. 使用Python的随机数模块 random 实现猜数字游戏
  5. python中#!/usr/bin/python与#!/usr/bin/env python的区别
  6. jmeter负载测试测试_使用Apache JMeter负载测试Web应用程序
  7. java web 数据库操作_Java Web----Java Web的数据库操作(二)
  8. 关于HTTPS的几个问题
  9. 未来的商业,一定是基于在线化的
  10. 【顶会论文解析】罪行预测
  11. 微软虚拟学院MVA 字幕获取方法
  12. Python爬虫生成二维码应用,突显个性味道
  13. Neuronink是医学奇迹的噩梦
  14. Win10 清空回收站选项点不了怎么解决?
  15. Unity 年度总结:一款游戏的从0到1
  16. java mocked,JMockit 中被 Mocked 的对象属性及方法的默认值
  17. 【jzoj4742】【单峰】
  18. 盘一盘 Python 系列 - SciPy
  19. 机器学习预测股票收益(一)之随机森林模型
  20. 【Sass中级】使用Sass和Compass制作雪碧图

热门文章

  1. 【原创】ListView快速滚动至新添加一行(自动滚动)
  2. 读阮一峰对《javascript语言精粹》的笔记,我有疑问。
  3. 2003網域升級到2008網域以及遷移DNS
  4. 【C++】C/C++ 中多态情形下的虚函数表查看方法
  5. 优化 Web 服务器计算机和特定应用程序的配置文件以符合您的特定需要
  6. 卷积神经网络(CNN)代码实现(MNIST)解析
  7. OpenCV代码提取:transpose函数的实现
  8. 网页中插入VLC播放器播放rtsp视频流步骤
  9. 【QT】Qt正则表达式的使用:使用QRegExp来限制QLineEdit的输入格式
  10. 【Qt】pro中使用DEFINES来实现条件编译