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 ...
随机推荐
- H3C链路聚合
以太网链路聚合通过将多条以太网物理链路捆绑在一起形成一条以太网逻辑链路,实现增加链路带宽的目的,同时这些捆绑在一起的链路通过相互动态备份,可以有效地提高链路的可靠性. 一.基本概念 1.聚合接口/聚合 ...
- centos7搭建zabbix
参考:https://blog.csdn.net/xiaocong66666/article/details/82818893 安装所需的依赖包即可: yum install gcc gcc-c++ ...
- oracle 处理Session不够用
1.执行语句 scope=spfile; scope=spfile; 2.查看现在的链接数 select count(*) from v$process --当前正在使用的 select value ...
- postgresql + omniDB
docker:组装 使用Postgres数据库的web应用 登录到psql的方法: psql --host=localhost --dbname=database-name --username=po ...
- gogs迁移至gitlab
一.先来聊一聊迁移的思路,不管是gogs迁移至gitlab,还是gitlab迁移至gogs,亦或gitlab迁移至gitlab,手动迁移的步骤都是如下图所示(在gitlab上新建一个空项目就会有这样的 ...
- zabbix4.4.2安装部署
1.下载阿里的源,执行 wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo 2 ...
- Docker最全教程——从理论到实战(九)
使用Tencent Hub来完成CI 关于Tencent Hub Tencent Hub是腾讯出品的DevOps服务.主要提供多存储格式的版本管理,支持Docker Image.Binary.Helm ...
- 全排列(dfs-有重复数字)
给出一个字符串S(可能有重复的字符),按照字典序从小到大,输出S包括的字符组成的所有排列.例如:S = "1312", 输出为: 1123 1132 1213 1231 131 ...
- Go变量与常量
变量与常量 变量声明 定义变量时指定变量类型式 定义变量时依靠类型推断 go是静态,强类型语言(java,c++也是如此). 静态语言: 在编译时就能确定变量类型的语言,类型推导在编译阶段可以不用指明 ...
- ReLU(inplace=True),这里的inplace=true的意思
ReLU(inplace=True),这里的inplace=true的意思 待办 inplace=True means that it will modify the input directly, ...