Java IO概述
Java IO概述
Java中的IO接口是程序用来进行数据输入输出的接口。数据的输入来源和输出目的地可以是下面的对象:
文件
管道
网络连接
内存缓存
System.in, System.out,System.error(注:Java标准输入、输出、错误输出)
关于普通Java IO的学习,需要掌握下面几点:
流的概念
流的分类方式(输入流/输出流 字符流/字节流)
常见的对象及其作用
掌握文件读写/异常处理代码(重要)
文件FIle#
File类是Java中和平台无关的文件、文件夹的抽象。需要注意的是通过File类不能访问文件本身的内容,如果需要访问文件的内容需要通过输入输出流。File类的常见作用如下:
检测文件是否存在
读取文件长度
重命名或移动文件
删除文件
检测某个路径是文件还是目录
读取目录中的文件列表
File类有个比较有趣的方法需要提下。File类的list()方法可以列举出当前文件夹下的文件名,而且这个方法可以接收一个过滤器,只显示符合某些规则的文件。
流#
在Java IO中,流是一个核心的概念。流从概念上来说是一个连续的数据流。你既可以从流中读取数据,也可以往流中写数据。流与数据源或者数据流向的媒介相关联。在Java IO中流既可以是字节流(以字节为单位进行读写),也可以是字符流(以字符为单位进行读写)。
在Java中按照不同的分类方式可以分为输入流和输出流,字节流和字符流。
Java IO中包含了许多InputStream、OutputStream、Reader、Writer的子类。这样设计的原因是让每一个类都负责不同的功能。这也就是为什么IO包中有这么多不同的类的缘故。各类用途汇总如下:
文件访问
网络访问
内存缓存访问
线程内部通信(管道)
缓冲
过滤
解析
读写文本 (Readers / Writers)
读写基本类型数据 (long, int etc.)
读写对象
一个金典的文件读写列子
Copy
FileOutputStreamfos = null;
try {
//true:**表示在原来文件基础上继续往下写* fos = new FileOutputStream("file.txt",true); fos.write(("床前明月光" + System.lineSeparator()).getBytes()); fos.write(("疑是地上霜" + System.lineSeparator()).getBytes()); fos.write(("举头望明月" + System.lineSeparator()).getBytes()); fos.write(("低头思故乡" + System.lineSeparator()).getBytes());
} catch (IOException e) {
System.out.println("创建文件失败..."); e.printStackTrace();
} finally {
if (fos != null) try { fos.close(); } catch (IOException e) { e.printStackTrace(); }
}
FileInputStreamfis = null;
try {
fis = new FileInputStream("file.txt"); byte[] buff = new byte[1024]; inthasRead = 0; while ((hasRead = fis.read(buff)) > 0) { Stringcontext = new String(buff, 0, hasRead); System.out.println(context); }
} catch (IOException e) {
e.printStackTrace();
} finally {
if (fis != null) try { fis.close(); } catch (IOException e) { e.printStackTrace(); }
}
}
上面的列子中,关闭流的过程比较麻烦。实际开发过程中建议使用Apache等提供的IO工具类,比如使用org.apache.commons.io.IOUtils进行流的关闭。
缓冲流使用
BufferedInputStream和BufferedReader添加了缓冲区,会提升读写效率。普通的流读写时一次写一个字符或字节在文件系统,效率不高。
Copy
InputStream is = newFileInputStream("file.txt");
BufferedInputStreambis = new BufferedInputStream(is,1024);
Reader reader = newFileReader("file.txt");
BufferedReaderbufferedReader = new BufferedReader(reader,1024);
输入输出流体系#
在上图中PrintStrem可以用来进行简单方便输出操作。PrintWriter功能类似。
一个Reader可以和一个InputStream相结合。如果你有一个InputStream输入流,并且想从其中读取字符,可以把这个InputStream包装到InputStreamReader中。把InputStream传递到InputStreamReader的构造函数中。(装饰器模式的典型使用)
PushBackInputStream可以将已经读过的数据重新推回到流里面,从而达到对某些数据重复读的目的。(ServletHttpRequest中body体中的数据只能读一次,使用PushBackInputStream是否能解决这个问题??)
通过Process类可以读写其他进程的数据:
Copy
Process p =System.getRuntimes().exec("java -version");
InputStream is =p.getInputStream();
RandomAcessFile既可以向文件输入内容,也可以向文件读取内容,还可以随机访问。
Java IO中的管道为运行在同一个JVM中的两个线程提供了通信的能力。所以管道也可以作为数据源以及目标媒介。可以通过Java IO中的PipedOutputStream和PipedInputStream创建管道。一个PipedInputStream流应该和一个PipedOutputStream流相关联。一个线程通过PipedOutputStream写入的数据可以被另一个线程通过相关联的PipedInputStream读取出来。
关于基础的IO,暂时就介绍这么多。
Apache的Commons IO介绍#
Apache的Common IO工具包组要包括下面这些工具。
Utility classes - with static methods to perform common tasks
Input - useful Input Stream and Reader implementations
Output - useful Output Stream and Writer implementations
Filters - various implementations of file filters
Comparators - various implementations of java.util.Comparator for files
File Monitor - a component for monitoring file system events
下面列举几个常用的列子。
- IOUtils读取文件
简单优雅。IOUtils还有很对IO相关的方法,比如copy、write等。大家用的时候可以查看API。使用起来非常简单。
Copy
FileInputStream fileInputStream = null;
try {
fileInputStream = new FileInputStream("D:\\一周记录.txt"); String string = IOUtils.toString(fileInputStream, "UTF8"); System.out.println(string);
} catch (IOException e) {
e.printStackTrace();
} finally {
IOUtils.closeQuietly(fileInputStream);
}
- FileUtils
同样的,FileUtils提供了相当丰富的和File交互的API。大家可以按需使用。
Copy
File file = new File("D:\一周记录.txt");
String s = FileUtils.readFileToString(file);
因为Commons IO内容较多,具体还是建议参考官方文档。当我们自己想要写一个和IO相关的工具类时,不妨
先停下来看看Commons IO中有没类似的。毕竟大厂出的工具包久经考验,不易出错。还能节省我们的开发时间。
作者: 写代码的木公
低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
为什么阿里巴巴Java开发手册中强制要求不要在foreach循环里进行元素的remove和add操作?
在阅读《阿里巴巴Java开发手册》时,发现有一条关于在 foreach 循环里进行元素的 remove/add 操作的规约,具体内容如下: 错误演示 我们首先在 IDEA 中编写一个在 foreach 循环里进行 remove 操作的代码: import java.util.ArrayList; import java.util.List; public class ForEachTest { public static void main(String[] args) { List<String> list = new ArrayList<>(); list.add("wupx"); list.add("love"); list.add("huxy"); for (String temp : list) { if ("love".equals(temp)) { list.remove(temp); } } System.out.println(list); } } 此时执行代码,编译正确,执行成功!输出 [wupx, huxy]。 接着我们把 “love” 换...
- 下一篇
7种你应该知道的JavaScript常见的错误
7种你应该知道的JavaScript常见的错误从浏览器的控制台到运行Node.js的计算机终端,我们到处都会看到各类错误。 这篇文章的重点是概述我们在JS开发过程中可能遇到的错误类型。 RangeError当数字超出允许的值范围时,将抛出此错误。 例如, 123const l = console.logconst arr = [90,88]arr.length=90**99 我们有一个带有两个元素的arr。接下来,我们尝试使数组包含90**99 == 2.9512665430652753e+193元素。 这个数字超出了大小数组可以增长的范围。所以运行时它会抛出RangeError: 12345$ node errorserrors.js:4arr.length=90**99^RangeError: Invalid array length因为我们要增加arr数组的数量超出了JS指定的范围。 ReferenceError当对变量/项的引用被破坏或不存在时,将引发此错误。也就是说,变量/项不存在。 例如, 12345const l=console.log const cat ="cat"c...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- CentOS8编译安装MySQL8.0.19
- CentOS8,CentOS7,CentOS6编译安装Redis5.0.7
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- SpringBoot2整合Redis,开启缓存,提高访问速度
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- Hadoop3单机部署,实现最简伪集群
- CentOS7,CentOS8安装Elasticsearch6.8.6
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果