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
下面列举几个常用的列子。

  1. 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);

}

  1. FileUtils
    同样的,FileUtils提供了相当丰富的和File交互的API。大家可以按需使用。

Copy
File file = new File("D:\一周记录.txt");
String s = FileUtils.readFileToString(file);
因为Commons IO内容较多,具体还是建议参考官方文档。当我们自己想要写一个和IO相关的工具类时,不妨
先停下来看看Commons IO中有没类似的。毕竟大厂出的工具包久经考验,不易出错。还能节省我们的开发时间。

作者: 写代码的木公

出处:https://www.cnblogs.com/54chensongxia/p/12487764.html

相关文章
|
4月前
|
存储 Java
【IO面试题 四】、介绍一下Java的序列化与反序列化
Java的序列化与反序列化允许对象通过实现Serializable接口转换成字节序列并存储或传输,之后可以通过ObjectInputStream和ObjectOutputStream的方法将这些字节序列恢复成对象。
|
21天前
|
Java
java 中 IO 流
Java中的IO流是用于处理输入输出操作的机制,主要包括字节流和字符流两大类。字节流以8位字节为单位处理数据,如FileInputStream和FileOutputStream;字符流以16位Unicode字符为单位,如FileReader和FileWriter。这些流提供了读写文件、网络传输等基本功能。
40 9
|
2月前
|
存储 缓存 Java
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
这篇文章详细介绍了Java中的IO流,包括字符与字节的概念、编码格式、File类的使用、IO流的分类和原理,以及通过代码示例展示了各种流的应用,如节点流、处理流、缓存流、转换流、对象流和随机访问文件流。同时,还探讨了IDEA中设置项目编码格式的方法,以及如何处理序列化和反序列化问题。
88 1
java基础:IO流 理论与代码示例(详解、idea设置统一utf-8编码问题)
|
3月前
|
安全 Java API
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
String常量池、String、StringBuffer、Stringbuilder有什么区别、List与Set的区别、ArrayList和LinkedList的区别、HashMap底层原理、ConcurrentHashMap、HashMap和Hashtable的区别、泛型擦除、ABA问题、IO多路复用、BIO、NIO、O、异常处理机制、反射
【Java面试题汇总】Java基础篇——String+集合+泛型+IO+异常+反射(2023版)
|
2月前
|
Java 数据处理 开发者
揭秘Java IO流:字节流与字符流的神秘面纱!
揭秘Java IO流:字节流与字符流的神秘面纱!
39 1
|
2月前
|
自然语言处理 Java 数据处理
Java IO流全解析:字节流和字符流的区别与联系!
Java IO流全解析:字节流和字符流的区别与联系!
97 1
|
3月前
|
Java 大数据 API
Java 流(Stream)、文件(File)和IO的区别
Java中的流(Stream)、文件(File)和输入/输出(I/O)是处理数据的关键概念。`File`类用于基本文件操作,如创建、删除和检查文件;流则提供了数据读写的抽象机制,适用于文件、内存和网络等多种数据源;I/O涵盖更广泛的输入输出操作,包括文件I/O、网络通信等,并支持异常处理和缓冲等功能。实际开发中,这三者常结合使用,以实现高效的数据处理。例如,`File`用于管理文件路径,`Stream`用于读写数据,I/O则处理复杂的输入输出需求。
236 12
|
2月前
|
Java
Java 中 IO 流的分类详解
【10月更文挑战第10天】不同类型的 IO 流具有不同的特点和适用场景,我们可以根据具体的需求选择合适的流来进行数据的输入和输出操作。在实际应用中,还可以通过组合使用多种流来实现更复杂的功能。
62 0
|
2月前
|
存储 Java 程序员
【Java】文件IO
【Java】文件IO
39 0
|
3月前
|
安全 Java API
Java 18 概述:新特性一览
Java 18 作为 Java 平台的最新版本,引入了多项令人振奋的新特性和改进,包括模式匹配、记录类型、流库改进、外部函数与内存 API 以及并发处理增强。这些新功能不仅提升了开发者的生产力,还显著增强了 Java 的性能和安全性。本文将详细介绍 Java 18 的主要新特性,并通过代码示例帮助读者更好地理解和应用这些功能。