1. 概述

  1. 面试偶尔会问到让你写 文件读写 的面试官

    1. 我搞不懂为啥必须会这玩意
    2. 面试官的意思是, 这玩意只要是个开发就得会
    3. 当然我现在又不是开发
  2. 一些概念

    1. 读与写

      1. 参照

        1. 以 进行读写行为的程序 作为参照
        1. 数据从 外部 进入 程序
        1. 数据从 程序 写出到 外部
    2. 流 (stream)

      1. 传统 IO 是和 流(Stream) 做交互
      2. 流是单向的
      3. 流对数据操作的单位, 是 字节
        1. inputstream.read() 一次读入一个字节
        2. outputstream.write(), 有多种参数, 但还是以 字节, 或者 字节数组, 在做读写
    3. Reader / Writer

      1. 但是有时候的读写, 使用 字符 作为单位, 会更加方便
      2. Reader / Writer 也是单向, 根据名字可以得知
      3. Reader / Writer 操作的单位, 是 字符, 这个就不举例子了
    4. 字符编码

      1. 这是个蛋疼的问题
      2. Reader / Writer 只能查看, 无法指定编码
      3. 需要一个 inputstreamReader / outputStreamWriter 来转换
        1. 这个真是蛋疼, 为啥 Reader 和 Writer 就无法直接指定呢
        2. 看了 Reader, BufferedReader, FileReader 都没有
      4. 于是就有了中间类
        1. InputStreamReader
        2. OutputStreamWriter
  3. 思路

    1. 只操作字节

      1. inputstream
      2. outputstream
    2. 只操作字符, 并且不需要考虑 字符集 问题

      1. reader
      2. writer
    3. 需要考虑字符集问题

      1. inputstream, inputstreamreader, reader
      2. ouputstream, outputstreamwriter, writer
      3. 后面的示例代码, 就采用这种思路
        1. 看了看是挺烦的
    4. 其他

      1. randomaccessfile

2. 环境

  1. 语言

    1. java 1.8

3. 准备

  1. 概述

    1. 基本概念
  2. 场景

    1. 一次读一行
    2. 读取指定编码
  3. 文件(File 对象)

    1. 概述

      1. 读写的目标
    2. 其他

      1. 要读的文件, 需要存在
      2. 通常不要针对同一个文件做读写
      3. 注意目录的 权限
  4. 输入

    1. 概述

      1. 就是读
      2. 多层嵌套
    2. FileInputStream

      1. 概述

        1. 文件输入流
        2. 需要 文件对象 来确定输入
    3. InputStreamReader

      1. 概述

        1. 重要参数

          1. 编码
    4. BufferedReader

      1. 概述

        1. 缓存读取效率较高
        2. 可以使用 readline 方法读取一行
  5. 输出

    1. 概述

      1. 写文件
      2. 也是多层嵌套
    2. FileOutputStream

      1. 概述

        1. 文件输出流
        2. 需要 文件对象
    3. OutputStreamWriter

      1. 概述

      1. 确定编码

    4. 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. 其他

  1. ref

    1. 写的很清晰, 很详细
    https://www.cnblogs.com/ll409546297/p/7197911.html
    1. 并发编程网: Java IO 教程, 是原作是老外写的, 他们翻译的不差, 比 TIJ 好懂, 循序渐进.
      http://ifeve.com/java-io/
  2. 其他的读写场景

    1. 不需要关注编码的读写
    2. 每次读写固定 字符/字节 的场景
    3. randomaccessfile 场景
  3. 关于 Java 的 IO

    1. 这种管道套管道的方法, 真的让人难受
    2. 有空可以了解下 python 的 io, 简单的令人窒息
  4. 最后的 shutdown 处理

    1. bw 需要一波输出

      1. 可能会有剩余内容
    2. 流的关闭

      1. 只用关闭最顶层的对象即可

        1. 下面的会自己关闭

Java - Java IO 示例的更多相关文章

  1. Java的IO系统

     Java IO系统     "对语言设计人员来说,创建好的输入/输出系统是一项特别困难的任务."     由于存在大量不同的设计方案,所以该任务的困难性是很容易证明的.其中最大的 ...

  2. Java的IO文档

    1.     File类 1.1. File类说明 存储在变量,数组和对象中的数据是暂时的,当程序终止时他们就会丢失.为了能够永 久的保存程序中创建的数据,需要将他们存储到硬盘或光盘的文件中.这些文件 ...

  3. 多线程Java Socket编程示例

    package org.merit.test.socket; import java.io.BufferedReader; import java.io.IOException; import jav ...

  4. Java开发Hbase示例

    Java开发Hbase示例 使用Hbase操作数据 package com.sunteng.clickidc.test; import java.io.IOException; import java ...

  5. java 动态代理示例,带主要注释

    Java proxy是基于反射,仅仅支持基于接口的动态代理. java 动态代理是一切架构的基础,必须了解. 废话少说,先上代码获得感性认识. 示例代码有主要注释. 接口: public interf ...

  6. java的IO流

    java的IO流继承四大抽象类分别是字节流 inputStream outputStream与字符流 read write.怎么理解记忆很重要. 直接连接读写对象的是结点流,例如对文件读取字节类的名字 ...

  7. java之io之File类的list()方法过滤目录的使用

    java的io的知识中,File类必须掌握.File类是对文件或者文件夹的封装.它本身并不能对所封装的文件进行读写,它封装的只是文件或文件夹的周边知识,比如 大小啦,创建日期啦,路径啦等等. 如果Fi ...

  8. Java 新IO

       NIO提供全新的底层I/O模型.与最初的java.io包中面向流(stream-oriented)概念不同,NIO采用了面向块的概念(block-oriented).在尽可能的情况下,I/O的操 ...

  9. JAVA中IO总结

    JAVA中IO流主要分为两大类: 字节流:InputStream+OutputStream 字符流:Reader+Writer 字节流: InputStream是所有字节输入流的父类 OutputSt ...

随机推荐

  1. [SDOI2012] Longge的问题 - 欧拉函数

    求 \(\sum\limits_{i=1}^{n}gcd(i,n)\) Solution 化简为 \(\sum\limits_{i|n}^{n}φ(\dfrac{n}{i})i\) 筛出欧拉函数暴力求 ...

  2. MariaDB Windows 安装

    1.复制安装文件到服务器 2.解压到指定的目录,并创建my.ini: 3.编辑my.ini文件内容 [client] port=3307 [mysql] default-character-set=u ...

  3. Linux系统初学者的常见问题解决集结大全

    http://www.embeddedlinux.org.cn/html/xinshourumen/200809/22-86.html 一. 如何建立多用户 提醒大家一句,别一直使用root用户,因为 ...

  4. 彻底禁用Chrome插件停用开发者模式提示插件version.dll

    下载后将dll文件放在和Chrome.exe同目录然后重启浏览器即可. 文件下载地址:https://download.csdn.net/download/ganquanzhong/11987360

  5. 363. 矩形区域不超过 K 的最大数值和(利用前缀和转化为最大子序和问题)

    题目: 链接:https://leetcode-cn.com/problems/max-sum-of-rectangle-no-larger-than-k/ 给定一个非空二维矩阵 matrix 和一个 ...

  6. model_Flask

    虚拟环境 新建一个虚拟环境:mkvirtualenv 环境名 删除一个虚拟环境:rmvirtualenv 环境名 退出:deactivate win10下安装 1. 打开cmd 安装虚拟环境包 pip ...

  7. 图的最短路径算法-- Floyd算法

    Floyd算法求的是图的任意两点之间的最短距离 下面是Floyd算法的代码实现模板: ; ; // maxv为最大顶点数 int n, m; // n 为顶点数,m为边数 int dis[maxv][ ...

  8. python3 读取串口数据

    python3 读取串口数据 demo import serial import time ser = serial.Serial("COM3",115200,timeout = ...

  9. EF简单的CodeFirst示例(自己创建数据库,不使用数据迁移)

    1.新建一个控制台应用程序 2.右键引用--管理NuGet程序包,安装如下几项 3.打开App.config文件,加入如下代码: <connectionStrings>    <ad ...

  10. [HNOI2017] 礼物 - 多项式乘法FFT

    题意:给定两个 \(n\) 元环,环上每个点有权值,分别为 \(x_i, y_i\).定义两个环的差值为 \[\sum_{i=0}^{n-1}{(x_i-y_i)^2}\] 可以旋转其中的一个环,或者 ...