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 ...
随机推荐
- VScode usage
Common settings editor.minimap.enabled //close the preview workbench.editor.show tabs // show f ...
- 【分享】一款特别轻量的gif生成工具
github链接:https://github.com/NickeManarin/ScreenToGif/releases/tag/2.19.3 超级好用!支持多种方式(摄像头也可√)录制gif
- Python读取Excel,日期列读出来是数字的处理
Python读取Excel,里面如果是日期,直接读出来是float类型,无法直接使用. 通过判断读取表格的数据类型ctype,进一步处理. 返回的单元格内容的类型有5种: ctype: 0 empty ...
- SpringBoot--SSM框架整合
方式一 1 建立一个Spring Starter 2.在available中找到要用的包,配置mybatis 3.建立file,application.yml 文件 spring: datasourc ...
- 题解 【Codefoeces687B】Remainders Game
题意: 给出c1,c2,...cn,问对于任何一个正整数x,给出x%c1,x%c2,...的值x%k的值是否确定; 思路: 中国剩余定理.详见https://blog.csdn.net/acdream ...
- MySQL数据库重点监控指标
MySQL数据库重点监控指标 QPS queries per seconds 每秒中查询数量 show global status like 'Question%'; Queries/seconds ...
- php核心技术与最佳实践--- oop
<?php /** * Created by PhpStorm. * User: cl * Date: 2019/8/12 * Time: 7:08 */ /*oop*/ class Perso ...
- Vue 任务清单
<style> li{ list-style: none; } #root{ width: 400px; min-height: 400px; box-shadow: 0 0 10px # ...
- HTML的图像标签
网页的图像标签 常见的图像格式 JPG GIF PNG BMP 图像标签可以带属性,格式为: <img src="path" alt="text" tit ...
- 这里有一份热乎乎的git相关操作
文件操作 git init (添加文件): git status (查看文件状态): git diff (查看修改内容): git rm (删除文件): git add (把文件保存在暂存区): gi ...