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 ...
随机推荐
- java_HashMap的遍历方法_4种
1.通过接收keySet来遍历: HashMap<String,String> map = new HashMap<>(); map.put("bb",&q ...
- The view or its master was not found or no view engine supports the searched locations
Error like:The view 'LoginRegister' or its master was not found or no view engine supports the searc ...
- 155.XSS攻击原理
XSS攻击: XSS(Cross Site Script)攻击叫做跨站脚本攻击,他的原理是用户使用具有XSS漏洞的网站的时候,向这个网站提交一些恶意代码,当用户在访问这个网站的某个页面的时候,这个恶意 ...
- STL-priority_queue H - 看病要排队
H - 看病要排队 看病要排队这个是地球人都知道的常识.不过经过细心的0068的观察,他发现了医院里排队还是有讲究的.0068所去的医院有三个医生(汗,这么少)同时看病.而看病的人病情有轻重,所以不能 ...
- c++ 踩坑大法好 枚举
1,枚举是个啥? c++允许程序员创建自己的数据类型,枚举数据类型是程序员自定义的一种数据类型,其值是一组命名整数常量. ,wed,thu,fri,sat,sun}; //定义一个叫day的数据类型, ...
- 转: Struts2中拦截器与过滤器的区别及执行顺序
当接收到一个httprequest , a) 当外部的httpservletrequest到来时 b) 初始到了servlet容器 传递给一个标准的过滤器链 c) FilterDispatecher会 ...
- python接口自动化之发送get(三)
1.安装requests requests是python的第三方库,需要进行安装.安装之前最好先关闭fiddler cmd(win+R快捷键)输入:pip install requests 其他命令: ...
- H5与native 普及
H5与native 普及: H5是基于web,native基于客户端native是使用原生系统内核的,相当于直接在系统上操作.,是我们传统意义上的软件,更加稳定.但是H5的APP先得调用系统的浏览器内 ...
- ping和tracert
ping命令常用于测试2台主机网络是否连通 TTL的默认值有:64(linux),128(windows),255(路由器) 此例TTL是63所以选用64来减去63等于1,这是说明经过了1个路由器,没 ...
- Ajax返回值一直获取不到啊
原理: 同步异步的问题 Return 位置的问题 首先同步异步改为async : false, Return 的值写在ajax外部 function submit_answer(){ ...