Java - Java IO 示例
1. 概述
面试偶尔会问到让你写 文件读写 的面试官
- 我搞不懂为啥必须会这玩意
- 面试官的意思是, 这玩意只要是个开发就得会
- 当然我现在又不是开发
一些概念
读与写
- 参照
- 以 进行读写行为的程序 作为参照
- 读
- 数据从 外部 进入 程序
- 写
- 数据从 程序 写出到 外部
- 参照
流 (stream)
- 传统 IO 是和 流(Stream) 做交互
- 流是单向的
- 流对数据操作的单位, 是 字节
- inputstream.read() 一次读入一个字节
- outputstream.write(), 有多种参数, 但还是以 字节, 或者 字节数组, 在做读写
Reader / Writer
- 但是有时候的读写, 使用 字符 作为单位, 会更加方便
- Reader / Writer 也是单向, 根据名字可以得知
- Reader / Writer 操作的单位, 是 字符, 这个就不举例子了
字符编码
- 这是个蛋疼的问题
- Reader / Writer 只能查看, 无法指定编码
- 需要一个 inputstreamReader / outputStreamWriter 来转换
- 这个真是蛋疼, 为啥 Reader 和 Writer 就无法直接指定呢
- 看了 Reader, BufferedReader, FileReader 都没有
- 于是就有了中间类
- InputStreamReader
- OutputStreamWriter
思路
只操作字节
- inputstream
- outputstream
只操作字符, 并且不需要考虑 字符集 问题
- reader
- writer
需要考虑字符集问题
- inputstream, inputstreamreader, reader
- ouputstream, outputstreamwriter, writer
- 后面的示例代码, 就采用这种思路
- 看了看是挺烦的
其他
- randomaccessfile
2. 环境
- 语言
- java 1.8
3. 准备
概述
- 基本概念
场景
- 一次读一行
- 读取指定编码
文件(File 对象)
概述
- 读写的目标
其他
- 要读的文件, 需要存在
- 通常不要针对同一个文件做读写
- 注意目录的 权限
输入
概述
- 就是读
- 多层嵌套
FileInputStream
- 概述
- 文件输入流
- 需要 文件对象 来确定输入
- 概述
InputStreamReader
- 概述
- 重要参数
- 编码
- 重要参数
- 概述
BufferedReader
- 概述
- 缓存读取效率较高
- 可以使用 readline 方法读取一行
- 概述
输出
概述
- 写文件
- 也是多层嵌套
FileOutputStream
- 概述
- 文件输出流
- 需要 文件对象
- 概述
OutputStreamWriter
1. 概述
1. 确定编码BufferedWriter
1. 概述
1. 可以缓存写
4. 示例代码
// 注意: 这里只给出思路, 文件类, 输入输出流可能会遇到异常, 需要 try catch 或者 throws, 并且这些东西, 最好在 finally 里清空和关闭
// 声明变量: 读
// inputPath 是 String 类型的变量, 记录着 输入文件 在文件系统里的位置
File inputFile = new File(inputPath);
FileInputStream fis = new FileInputStream(inputFile);
InputStreamReader isr = new InputStreamReader(fis, "UTF-8");
BufferedReader br = new BufferedReader(fis);
// 下面是简化版本
// BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(inputFile),"UTF-8"));
// 如果不需要调整编码, 也可以这么写
// BufferedReader br = new BufferedReader(new FileReader(inputFile)));
// 声明变量: 写
File outputFile = new File(outputPath);
FileOutputStream fos = new FileOutputStream(outputFile);
OutputStreamWriter osr = new OutputStreamWriter(fos, "UTF-8");
BufferedWriter bw = new BufferedWriter(fos);
// 下面是简化版本
// BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(outputFile),"UTF-8"));
// 如果不需要调整编码, 也可以这么写
// BufferedWriter bw = new BufferedWriter(new FileWriter(outputFile)));
//读取数据
//循环取出数据
String str = null;
while ((str = br.readLine()) != null) {
System.out.println(str);
//写入相关文件
bw.write(str);
bw.newLine();
}
//清楚缓存
bw.flush();
//关闭流
br.close();
bw.close();
4. 其他
ref
- 写的很清晰, 很详细
https://www.cnblogs.com/ll409546297/p/7197911.html
- 并发编程网: Java IO 教程, 是原作是老外写的, 他们翻译的不差, 比 TIJ 好懂, 循序渐进.
http://ifeve.com/java-io/
其他的读写场景
- 不需要关注编码的读写
- 每次读写固定 字符/字节 的场景
- randomaccessfile 场景
关于 Java 的 IO
- 这种管道套管道的方法, 真的让人难受
- 有空可以了解下 python 的 io, 简单的令人窒息
最后的 shutdown 处理
bw 需要一波输出
- 可能会有剩余内容
流的关闭
- 只用关闭最顶层的对象即可
- 下面的会自己关闭
- 只用关闭最顶层的对象即可
Java - Java IO 示例的更多相关文章
- Java的IO系统
Java IO系统 "对语言设计人员来说,创建好的输入/输出系统是一项特别困难的任务." 由于存在大量不同的设计方案,所以该任务的困难性是很容易证明的.其中最大的 ...
- Java的IO文档
1. File类 1.1. File类说明 存储在变量,数组和对象中的数据是暂时的,当程序终止时他们就会丢失.为了能够永 久的保存程序中创建的数据,需要将他们存储到硬盘或光盘的文件中.这些文件 ...
- 多线程Java Socket编程示例
package org.merit.test.socket; import java.io.BufferedReader; import java.io.IOException; import jav ...
- Java开发Hbase示例
Java开发Hbase示例 使用Hbase操作数据 package com.sunteng.clickidc.test; import java.io.IOException; import java ...
- java 动态代理示例,带主要注释
Java proxy是基于反射,仅仅支持基于接口的动态代理. java 动态代理是一切架构的基础,必须了解. 废话少说,先上代码获得感性认识. 示例代码有主要注释. 接口: public interf ...
- java的IO流
java的IO流继承四大抽象类分别是字节流 inputStream outputStream与字符流 read write.怎么理解记忆很重要. 直接连接读写对象的是结点流,例如对文件读取字节类的名字 ...
- java之io之File类的list()方法过滤目录的使用
java的io的知识中,File类必须掌握.File类是对文件或者文件夹的封装.它本身并不能对所封装的文件进行读写,它封装的只是文件或文件夹的周边知识,比如 大小啦,创建日期啦,路径啦等等. 如果Fi ...
- Java 新IO
NIO提供全新的底层I/O模型.与最初的java.io包中面向流(stream-oriented)概念不同,NIO采用了面向块的概念(block-oriented).在尽可能的情况下,I/O的操 ...
- JAVA中IO总结
JAVA中IO流主要分为两大类: 字节流:InputStream+OutputStream 字符流:Reader+Writer 字节流: InputStream是所有字节输入流的父类 OutputSt ...
随机推荐
- [SHOI2001] 小狗散步 - 二分图匹配
考虑到每次与主人相遇之前最多只去一个景点,很容易转化为匹配问题 由于数据很小,我们不妨枚举每个相遇点间隙和每个景点,判断是否来得及,如果来得及就连边 沙雕题搞了二十来分钟,我是憨憨 #include ...
- 国内下载Git的连接地址
Git国内下载: https://github.com/waylau/git-for-win
- 4817 [Sdoi2017]树点涂色
题目描述 Bob 有一棵 n 个点的有根树,其中 1 号点是根节点.Bob 在每个点上涂了颜色,并且每个点上的颜色不同. 定义一条路径的权值是:这条路径上的点(包括起点和终点)共有多少种不同的颜色. ...
- AcWing 1027. 方格取数
#include<iostream> using namespace std ; ; *N][N][N]; int w[N][N]; int n; int main() { cin> ...
- POJ 3368 (ST表)
链接:http://poj.org/problem?id=3368 题意:给出n个连续单调不递减数,q次询问,每次询问区间(L,R)出现频率最多的数,问出现了多少次 思路:因为n个数是单调不递减的,所 ...
- JavaScript对象之原型链
一个js对象,除了自己设置的属性外,还会自动生成proto.class.extensible属性,其中,proto属性指向对象的原型. 对象的属性也有writable.enumerable.confi ...
- mysql创建用户后无法访问数据库的问题
1.停止mysql服务器 sudo service mysql stop 2.启动mysql服务 sudo mysqld_safe --skip-grant-tables 3.登陆 mysql mys ...
- AcWing 338. 计数问题
#include <iostream> #include <algorithm> #include <vector> using namespace std; ; ...
- kruskal算法生成最小生成树
kurskal算法更适合稀疏图 kruskal算法伪代码: int kruskal(){ 令最小生成树的边权之和为ans, 最小生成树的当前边数为Num_Edge; 将所有边按边权从小到大排序; fo ...
- lighting
lighting lighting 是基于 nodejs 构建的一个命令行工具,使用 lighting 可以快速搭建 H5.APP.RestAPI 的开发工程环境(结合 VSCode 最佳).本地开发 ...