Java基础知识回顾之六 ----- IO流
前言
在上一篇文章中,回顾了Java的多线程。而在本篇文章中主要介绍Java IO的相关知识。
IO的介绍
什么是IO?
IO的名称又来是Input与Output的缩写,也就是输入流和输出流。输入流用于从源读取数据,输出流用于向目标写数据。
可以从下列示例图来了解IO流:

IO流使用
IO流对文件的操作主要分为字符流和字节流。
字符流
字符流有两个抽象类:Writer和Reader类。
其对应子类FileWriter和FileReader可实现文件的读写操作。
BufferedWriter和BufferedReader能够提供缓冲区功能,用以提高效率。
我记得在开始学习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();
}
然后我们输入 hello 和quit。
结果如下:
输入字符, 输入 '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
上述代码示例中,我们使用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你好!
可以看到结果符合我们的预期。
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
Java基础知识回顾之六 ----- IO流的更多相关文章
- Java基础知识强化之IO流笔记71:NIO之 NIO的(New IO流)介绍
1. I/O 简介 I/O ( 输入/输出 ):指的是计算机与外部世界或者一个程序与计算机的其余部分的之间的接口.它对于任何计算机系统都非常关键,因而所有 I/O 的主体实际上是内置在操作系统中的. ...
- Java基础知识强化之IO流笔记68:Properties和IO流集合使用
1. Properties和IO流集合使用 这里的集合必须是Properties集合: public void load(Reader reader):把文件中的数据读取到集合中 public v ...
- Java基础知识强化之IO流笔记66:Properties的概述 和 使用(作为Map集合使用)
1. Properties的概述 Properties:属性集合类.是一个可以和IO流相结合使用的集合类. 该类主要用于读取以项目的配置文件(以.properties结尾的文件 和 xml文件). ...
- Java基础知识强化之IO流笔记22:FileInputStream / FileOutputStream 复制文本文件案例1
1. 使用字节流FileInputStream / FileOutputStream 复制文本文件案例: 分析: (1)数据源:从哪里来 a.txt -- 读取数据 -- FileInpu ...
- Java基础知识强化之IO流笔记17:FileOutputStream构造方法使用
1. 可以参照之前写的笔记: Android(java)学习笔记167:Java中操作文件的类介绍(File + IO流) 2. FileOutputStream(常用的)构造方法: FileOu ...
- Java基础知识强化之IO流笔记16:IO流的概述和分类
1. IO流的分类 流向: (1)输入流:读取数据到内存 (2)输出流:写入数据到硬盘(磁盘) 操作的数据类型: (1)字节流:操作的数据是字节 ...
- Java基础知识强化之IO流笔记01:异常的概述和分类
IO流操作的时候会出现很多问题,java中叫作异常,所以我们先介绍一下异常: 1. 程序的异常:Throwable(Throwable类是java中所有异常或错误的超类) (1)严重问题:Error ...
- Java基础知识总结之IO流
理解Java的IO流 流(Stream)的概念:程序与数据来源之间的桥梁 流的分类 按流的方向来分(从程序所在的内存的角度来看): 输入流:把外部输入读入当前程序所在内. 输出流:把当前程序所在内存的 ...
- Java基础知识强化之IO流笔记42:IO流总结(图解)
1. IO流总结(图解)
随机推荐
- asp.net core session丢失问题排查
最近公司采用asp.net core的站点在外测环境中,总是发现存在session丢失的情况.排查了好久,客户端.AspNetCore.Session的cookie未丢失,session的分布式缓存采 ...
- bzoj 2822 [AHOI2012]树屋阶梯 卡特兰数
因为规定n层的阶梯只能用n块木板 那么就需要考虑,多出来的一块木板往哪里放 考虑往直角处放置新的木板 不管怎样,只有多的木板一直扩展到斜边表面,才会是合法的新状态,发现,这样之后,整个n层阶梯就被分成 ...
- Java开源生鲜电商平台-优惠券设计与架构(源码可下载)
Java开源生鲜电商平台-优惠券设计与架构(源码可下载) 说明:现在电商白热化的程度,无论是生鲜电商还是其他的电商等等,都会有促销的这个体系,目的就是增加订单量与知名度等等 那么对于Java开源生鲜电 ...
- 【递归打卡2】求两个有序数组的第K小数
[题目] 给定两个有序数组arr1和arr2,已知两个数组的长度分别为 m1 和 m2,求两个数组中的第 K 小数.要求时间复杂度O(log(m1 + m2)). [举例] 例如 arr1 = [1, ...
- .NET Core之微信支付之公众号、H5支付篇
前言 本篇主要记录微信支付中公众号及H5支付全过程. 准备篇 公众号或者服务号(并开通微信支付功能).商户平台中开通JSAPI支付.H5支付. 配置篇 公众号或者服务号中 -------开发----- ...
- 阿里云重磅发布DMS数据库实验室 免费体验数据库引擎
2月27日,阿里云数据管理DMS发布年度巨献——数据库实验室,用户可在该实验室环境下免费体验数据库引擎.以及DMS各项产品功能.数据库实验室是DMS所提供的体验空间,免费赠送数据库引擎资源. 用户只需 ...
- 内部类、异常以及 LeetCode 每日一题
1 内部类 内部类的作用: 内部类提供了更好的封装,可以把内部类隐藏于外部类之内,不允许同一个包中的其他类访问该类.(例如给“牛”这个类组合一个“牛腿”,则可以把牛腿定义成内部类,因为牛腿脱离了牛没有 ...
- 浅谈CSS浮动属性
要介绍css的float浮动属性,就必须先了解一下标准文档流 标准文档流: 在没有css的干预下,块级元素独占一行,可以设置宽高,行内元素并排显示,宽高自动填充. HTML页面的标准文档流(默 ...
- Android 程序结构
Android程序在创建的时,Android studio就为其构建了基本结构,设计者可在此结构上开发应用程序, manifests :用于存放AndroidManifest.xml文件(又称清单文件 ...
- Android 上传图片到服务器二--------调用相机7.0以上权限问题
[目录] (一)上传图片到服务器一 ---------------------------------Android代码 (二)上传图片到服务器二--------------------------- ...