Java的IO包主要关注数据源的读取和输出到目标媒介。示意图如下
常用的源数据和目标媒介如下:
Files
Pipes
Network Connections
In-memory Buffers (e.g. arrays)
System.in, System.out, System.error
流从概念上说一个连续的数据流,既可以从流中读取数据,也可以往流中写入数据。主要分为字节流和字符流,字节流指以字节为单位进行读写,字符流指以字符为单位进行读写。
一个程序需要InputStream或者Reader从数据源读取数据,需要OutputStream或者Writer将数据写入到目标媒介中。示意图如下:
Java IO针对不同的业务场景,不同的功能,设计了不同的类,各类用途如下:
File Access
Network Access
Internal Memory Buffer Access
Inter-Thread Communication (Pipes)
Buffering
Filtering
Parsing
Reading and Writing Text (Readers / Writers)
Reading and Writing Primitive Data (long, int etc.)
Reading and Writing Objects
通过输入、输出、基于字节或者字符、以及其他比如缓冲、解析之类的特定用途可以将Java IO流进行如下划分:
Byte Based Character Based
Input Output Input Output
Basic InputStream OutputStream Reader
InputStreamReader Writer
OutputStreamWriter
Arrays ByteArrayInputStream ByteArrayOutputStream CharArrayReader CharArrayWriter
Files FileInputStream
RandomAccessFile FileOutputStream
RandomAccessFile FileReader FileWriter
Pipes PipedInputStream PipedOutputStream PipedReader PipedWriter
Buffering BufferedInputStream BufferedOutputStream BufferedReader BufferedWriter
Filtering FilterInputStream FilterOutputStream FilterReader FilterWriter
Parsing PushbackInputStream
StreamTokenizer PushbackReader
LineNumberReader
Strings StringReader StringWriter
Data DataInputStream DataOutputStream
Data - Formatted PrintStream PrintWriter
Objects ObjectInputStream ObjectOutputStream
Utilities SequenceInputStream
File类
在讨论Stream的具体使用前,我们先看看IO库里面的File类。
Java文件类以抽象的方式代表文件名和目录路径名。该类主要用于文件和目录的创建、文件的查找和文件的删除等,但File对象却不能直接访问文件内容本身,要查看内容,则需要使用IO流。
通过以下构造方法创建一个File对象。
通过给定的父抽象路径名和子路径名字符串创建一个新的File实例。
File(File parent, String child);
通过将给定路径名字符串转换成抽象路径名来创建一个新 File 实例。
File(String pathname)
根据 parent 路径名字符串和 child 路径名字符串创建一个新 File 实例。
File(String parent, String child)
通过将给定的 file: URI 转换成一个抽象路径名来创建一个新的 File 实例。
File(URI uri)由于其方法均比较简单,不再罗列,具体见https://docs.oracle.com/javase/8/docs/api/。一个具体的实例如下:
package com.molyeo.java.io; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.io.File; import java.io.IOException; import java.util.Arrays; /** * Created by zhangkh on 2018/7/19. */ public class FileDemo { static Logger logger = LoggerFactory.getLogger(FileDemo.class.getName()); public static void main(String[] args) throws IOException { File path = new File("."); if (path.isDirectory()) { logger.info("root: directory is {}", path.getAbsolutePath()); String[] list = path.list(); Arrays.sort(list, String.CASE_INSENSITIVE_ORDER); for (String dirItem : list) { File file = new File(path, dirItem); if (file.isDirectory()) { logger.info("child: {} is a directory", dirItem); } else { logger.info("child: {} is a file", dirItem); } } } else { logger.info("root is not a directory"); } } }