一、Java标准I/O知识体系图:

二、I/O是什么

I/O 是Input/Output(输入、输出)的简称,输入流可以理解为向内存输入,输出流是从内存输出。

三、Java I/O 用途与对应的流一览

注:粗体为节点流。蓝色为转换流(字节流转为字符流)。

四、流结构介

Java所有的流类位于java.io包中,都分别继承字以下四种抽象流类型。

1.继承自InputStream/OutputStream的流都是用于向程序中输入/输出数据,且数据的单位都是字节(byte=8bit)。

2.继承自Reader/Writer的流都是用于向程序中输入/输出数据,且数据的单位都是字符(2byte=16bit),如图。

四、流的处理

流分为节点流和处理流两种:

节点流: 从一个特定的数据源读写数据。即节点流是直接操作文件,网络等的流,例如FileInputStream和FileOutputStream,他们直接从文件中读取或往文件中写入字节流。

处理流:是对一个已存在的流的连接和封装,通过所封装的流的功能调用实现数据读写。如BufferedReader.处理流的构造方法总是要带一个其他的流对象做参数。一个流对象经过其他流的多次包装,称为流的链接

五、文件的访问

(1)读取文件

如果你需要在不同端使用读取文件,你可以根据你要读的文件是二进制文件还是文本文件,或者根据你要处理的数据是准备采取字节方式还是字符方式,决定使用 FileInputStream 或者 FileReader。两者支持你从文件开头开始到文件结尾读取一个字节或者字符,也可以将读取的多个字节或字符,写入到内存的字节数组或字符数组。

单字节读取文件示例:

public class test5 {
public static void main(String[] args) throws Exception {
String filepath = "test.bin";
java.io.InputStream is = null;
try {
is = new FileInputStream(filepath);
int data = -1;
while ((data = is.read()) != -1) {// -1 表示读取到达文件结尾
//操作数据
System.out.print((byte)data + " ");
}
} finally {
if (is != null) {
is.close();// 关闭流
}
}
}
}

字节数组读取文件示例:

public class test5 {
public static void main(String[] args) throws Exception {
String filepath = "test.bin";
java.io.InputStream is = null;
try {
is = new BufferedInputStream(new FileInputStream(filepath));// 组装BufferedInputStream流,加入缓冲能力
byte[] data = new byte[256];
int len = -1;
while ((len = is.read(data)) != -1) {// -1 表示读取到达文件结尾
//操作数据
for (int i = 0; i < len; i++) {
System.out.print(data[i] + " ");
}
}
} finally {
if (is != null) {
is.close();// 关闭流
}
}
}
}

单字符读取文件示例:

public class test5 {
public static void main(String[] args) throws Exception {
String filepath = "test.txt";
java.io.Reader r = null;
try {
r = new FileReader(filepath);
int data = -1;
while ((data = r.read()) != -1) {// -1 表示读取到达文件结尾
//操作数据
System.out.print((char) data);
}
} finally {
if (r != null) {
r.close();// 关闭流
}
}
}
}

字符数组读取文件示例:

public class test5 {
public static void main(String[] args) throws Exception {
String filepath = "file.txt";
java.io.Reader r = null;
try {
r = new BufferedReader(new FileReader(filepath));// 组装BufferedReader流,加入缓冲能力
char[] data = new char[256];
int len = -1;
while ((len = r.read(data)) != -1) {// -1 表示读取到达文件结尾
//操作数据
for (int i = 0; i < len; i++) {
System.out.print(data[i]);
            }
        }
    } finally {
if (r != null) {
r.close();// 关闭流
        }
    }
}
}
public class test5 {
public static void main(String[] args) throws Exception {
String filepath = "file.txt";
java.io.Reader r = null;
try {
r = new BufferedReader(new FileReader(filepath));// 组装BufferedReader流,加入缓冲能力
char[] data = new char[256];
int len = -1;
while ((len = r.read(data)) != -1) {// -1 表示读取到达文件结尾
//操作数据
for (int i = 0; i < len; i++) {
System.out.print(data[i]);
            }
        }
    } finally {
if (r != null) {
r.close();// 关闭流
        }
    }
}
}

(2)写入文件与读取文件类似

单字节写入文件示例:

public class test5 {
public static void main(String[] args) throws Exception {
String filepath = "test.bin";
    java.io.OutputStream os = null;
    try {
        os = new FileOutputStream(filepath);
        os.write('1');
        os.write('2');
        os.write('3');
        os.write('4');
        os.flush();// 把缓冲区内的数据刷新到磁盘
         
    } finally {
        if (os != null) {
            os.close();// 关闭流
        }
    }
}
}

字符数组写入文件示例:

public class test5 {
public static void main(String[] args) throws Exception {
String filepath = "file.txt";
java.io.Writer w = null;
try {
w = new BufferedWriter(new FileWriter(filepath));// 组装BufferedWriter流,加入缓冲能力
// 模拟
char[] data = new char[256];
String f = "0123456789abcdefghijklmnopqrstuvwxyz";
Random rd = new Random();
for (int i = 0; i < data.length; i++) {
data[i] = f.charAt(rd.nextInt(f.length()));
}
w.write(data);
w.flush();// 把缓冲区内的数据刷新到磁盘
} finally {
if (w != null) {
w.close();// 关闭流
}
}
}
}

(3)随机访问文件

如果你需要不按特定的存取顺序,随意读取或者写入文件,可以考虑RandomAccessFile。

void seek(long pos) 设置到此文件开头测量到的文件指针偏移量,在该位置发生下一个读取或写入操作。

public class test5 {
public static void main(String[] args) throws Exception {
RandomAccessFile file = null;
try {
file = new RandomAccessFile("test.bin", "rw");
file.seek(0);
file.writeChar('1');
file.seek(0);
System.out.println(file.readChar());
/**
* 读取
*/
int data = -1;
while ((data = file.read()) != -1) {// -1 表示读取到达文件结尾
//操作数据
System.out.print((byte)data + " ");
} } finally {
if (file != null) {
file.close();// 关闭流
}
}
}
}

Java 标准 I/O 介绍的更多相关文章

  1. Java 标准日志工具 Log4j 的使用(附源代码)

    源代码下载 Log4j 是事实上的 Java 标准日志工具.会不会用 Log4j 在一定程度上可以说是衡量一个开发人员是否是一位合格的 Java 程序员的标准.如果你是一名 Java 程序员,如果你还 ...

  2. Web---JSTL(Java标准标签库)-Core核心标签库、I18N国际化、函数库

    前面为JSTL中的常用EL函数,后面的为具体演示实例! JSTL简介: JSTL(Java Standard Tag Library) –Java标准标签库. SUN公司制定的一套标准标签库的规范. ...

  3. Java常用日志框架介绍

    Java常用日志框架介绍 java日志概述 对于一个应用程序来说日志记录是必不可少的一部分.线上问题追踪,基于日志的业务逻辑统计分析等都离不日志.java领域存在多种日志框架,目前常用的日志框架包括L ...

  4. Java常用日志框架介绍(转)

    Java常用日志框架介绍 java日志概述 对于一个应用程序来说日志记录是必不可少的一部分.线上问题追踪,基于日志的业务逻辑统计分析等都离不日志.java领域存在多种日志框架,目前常用的日志框架包括L ...

  5. Java 11 新特性介绍

    Java 11 已于 2018 年 9 月 25 日正式发布,之前在Java 10 新特性介绍中介绍过,为了加快的版本迭代.跟进社区反馈,Java 的版本发布周期调整为每六个月一次——即每半年发布一个 ...

  6. Java 12 新特性介绍,快来补一补

    Java 12 早在 2019 年 3 月 19 日发布,它不是一个长久支持(LTS)版本.在这之前我们已经介绍过其他版本的新特性,如果需要可以点击下面的链接进行阅读. Java 11 新特性介绍 J ...

  7. Java 14 新功能介绍

    不做标题党,认认真真写个文章. 文章已经收录在 Github.com/niumoo/JavaNotes 和未读代码博客,点关注,不迷路. Java 14 早在 2019 年 9 月就已经发布,虽然不是 ...

  8. 标准I/O介绍

    标准I/O库 1. 标准I/O介绍 不仅是在UNIX系统中,很多操作系统上都实现了标准I/O库. 标准I/O库由ANSI C 标准说明 标准 I/O 库处理很多细节,例如带有缓冲分配.以优化长度执行的 ...

  9. java web服务器tomcat介绍【转载】

    机器矩阵2016-08-10 22:14 java程序员亲切地称他为tom猫,看到这只猫可以说明1 服务器部署成功了 ,2 网络是联通的. 到底这只猫是什么来头呢? tomcat是Apache基金会下 ...

随机推荐

  1. Django访问量和页面点击数统计

    http://blog.csdn.net/pipisorry/article/details/47396311 下面是在模板中做一个简单的页面点击数统计.model阅读量统计.用户访问量统计的方法 简 ...

  2. 【算法导论】八皇后问题的算法实现(C、MATLAB、Python版)

    八皇后问题是一道经典的回溯问题.问题描述如下:皇后可以在横.竖.斜线上不限步数地吃掉其他棋子.如何将8个皇后放在棋盘上(有8*8个方格),使它们谁也不能被吃掉?         看到这个问题,最容易想 ...

  3. session效率

    (1)-不恰当的request.getSession() 在HttpServlet中,HttpSession对象通常在request.getSession(true)方法调用时才创建. HttpSes ...

  4. LIRe 源代码分析 6:检索(ImageSearcher)[以颜色布局为例]

    ===================================================== LIRe源代码分析系列文章列表: LIRe 源代码分析 1:整体结构 LIRe 源代码分析 ...

  5. LeetCode之“动态规划”:Minimum Path Sum && Unique Paths && Unique Paths II

    之所以将这三道题放在一起,是因为这三道题非常类似. 1. Minimum Path Sum 题目链接 题目要求: Given a m x n grid filled with non-negative ...

  6. github搭建个人网站

    1. 注册账号: 地址: https://github.com/  输入账号.邮箱.密码,然后点击注册按钮.  2. 初始设置 注册完成后,选择Free免费账号完成设置. 2.1 验证邮箱 请打开你的 ...

  7. 【Qt编程】基于Qt的词典开发系列<十一>系统托盘的显示

    本文主要讨论Qt中的系统托盘的设置.系统托盘想必大家都不陌生,最常用的就是QQ.系统托盘以简单.小巧的形式能让人们较快的打开软件.废话不多说,下面开始具体介绍. 首先,新建一个Qt Gui项目,类型选 ...

  8. Android BLE与终端通信(一)——Android Bluetooth基础API以及简单使用获取本地蓝牙名称地址

    Android BLE与终端通信(一)--Android Bluetooth基础API以及简单使用获取本地蓝牙名称地址 Hello,工作需要,也必须开始向BLE方向学习了,公司的核心技术就是BLE终端 ...

  9. 【Qt编程】基于Qt的词典开发系列<十四>自动补全功能

    最近写了一个查单词的类似有道词典的软件,里面就有一个自动补全功能(即当你输入一个字母时,就会出现几个候选项).这个自动补全功能十分常见,百度搜索关键词时就会出现.不过它们这些补全功能都是与你输入的进行 ...

  10. 我的.net并发系列文章及项目经验整理

    一直在关注研究.net下的并发处理,之前也发布过几篇文章,今天就都整理下. 使用BlockingCollection来做并发处理,同时增加并发队列来做并发处理时的退出判断: 你真的知道.NET Fra ...