I/O

相关简介

  • 什么是I/O?

    IO,即Input (输入)和Output (输出)的首字母缩写。

  • 什么是流?

    流(Stream)是抽象概念,它代表任何有能力产出数据的数据源对象或者是与能力接收数据的接收端对象,“流”屏蔽了实际的I/O设备中处理数据的细节。

  • 流的种类

    • 1.字符流
    • 2.字节流

字符流

字符输出流

输出流是将内容“写”到外部文件


public void test1() { FileWriter fileWriter = null;
try {
// ./代表当前目录
fileWriter = new FileWriter("./aaa.txt", true); fileWriter.write("冰川双子天下第一"); //括号里是想输出的东西
fileWriter.write("mskk天下第一");
fileWriter.write("彩千圣天下第一"); // fileWriter.close(); //必须要关了流才能把东西写进去,但是要在finally里写,见以下代码
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (fileWriter != null) {
fileWriter.close(); //先try catch 再surround
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

字符输入流

输入流是将内容“读”进内部文件

  • read方法的过程

    • 1.从文件中读取的内容会依次放入buffer数组中
    • 2.要么读满数组,要么文件结束
    • 3.如果文件已经到达最后的位置,就会返回-1

public void test2() { FileReader fileReader = null;
try {
fileReader = new FileReader("./aaa.txt"); //每次读取的最大长度
char[] buffer = new char[8]; // int len = fileReader.read(buffer);//len是字符数
// System.out.println(len);
// System.out.println(new String(buffer, 0, len)); int len = 0;
while ((len = fileReader.read(buffer)) != -1) { System.out.println(new String(buffer, 0, len));//参数意义:使用buffer数组,从第0个开始,读取len长度 } } catch (IOException e) {
e.printStackTrace();
} finally { try {
if (fileReader != null) {
fileReader.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

练习:将aaa.txt复制一份生成一个bbb.txt


public void test3() { FileWriter fileWriter1 = null;
FileReader fileReader1 = null; try {
fileWriter1 = new FileWriter("./bbb.txt");
fileReader1 = new FileReader("./aaa.txt"); char[] buffer = new char[8]; int len = 0; while ((len = fileReader1.read(buffer)) != -1) { fileWriter1.write(buffer, 0, len);
}
} catch (IOException e) { e.printStackTrace();
} finally { if (fileWriter1 != null) { try {
fileWriter1.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fileReader1 != null) { try {
fileReader1.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}

带缓冲区的字符输出流


public void test4() { FileWriter fileWriter2 = null;
BufferedWriter bufferedWriter = null; try {
fileWriter2 = new FileWriter("./ccc.txt"); //bufferedWriter对象并不是一个真正的流
//他只是在fileWriter对象的基础上添加了新的逻辑
bufferedWriter = new BufferedWriter(fileWriter2);//括号里一定要填一个流 bufferedWriter.write("写一行");
bufferedWriter.newLine(); //换行 //将缓冲区的内容写到文件中,清空缓冲区
//方便后续继续写入
bufferedWriter.flush(); //刷新缓冲区 } catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (bufferedWriter != null) {
bufferedWriter.close(); //当使用缓冲区时,只关闭缓冲区就可以
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

带缓冲区的字符输入流


public void test5() { FileReader fileReader2 = null; BufferedReader bufferedReader = null; try {
fileReader2 = new FileReader("./ccc.txt"); bufferedReader = new BufferedReader(fileReader2); String line = null;
while ((line = bufferedReader.readLine()) != null) { System.out.println(line); } } catch (IOException e) {
e.printStackTrace();
}
}

练习:使用缓冲区将ccc.txt复制到ddd.txt


public void test6() { FileReader fileReader3 = null;
BufferedReader bufferedReader1 = null; FileWriter fileWriter3 = null;
BufferedWriter bufferedWriter1 = null; try {
fileReader3 = new FileReader("./ccc.txt");
bufferedReader1 = new BufferedReader(fileReader3); fileWriter3 = new FileWriter("./ddd.txt");
bufferedWriter1 = new BufferedWriter(fileWriter3); String line = null;
while ((line = bufferedReader1.readLine()) != null) { bufferedWriter1.write(line); bufferedWriter1.flush(); }
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (bufferedWriter1 != null) {
bufferedWriter1.close();
}
if (bufferedReader1 != null) {
bufferedReader1.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

字节流

字节输出流


public void test7() { FileOutputStream fileOutputStream = null;
try {
fileOutputStream = new FileOutputStream("./eee.txt"); fileOutputStream.write("摩卡兰天下第一".getBytes()); } catch (IOException e) {
e.printStackTrace();
} finally { try {
if (fileOutputStream != null) {
fileOutputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

字节输入流


public void test8() {
FileInputStream fileInputStream = null;
try {
fileInputStream = new FileInputStream("./eee.txt"); int len = 0;
byte[] bytes = new byte[1024];
while ((len = fileInputStream.read(bytes)) != -1) { System.out.println(new String(bytes));
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (fileInputStream != null) {
fileInputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

练习:用字节流复制图片


public void test9() { FileOutputStream fileOutputStream = null;
FileInputStream fileInputStream = null;
try {
fileOutputStream = new FileOutputStream("G:\\破烂\\666.jpg"); //此处是新图片地址,可以新建可以覆盖
fileInputStream = new FileInputStream("G:\\破烂\\11111.jpg"); //此处是想要复制的图片的地址 int len = 0;
byte[] bytes = new byte[1024];
while ((len = fileInputStream.read(bytes)) != -1) { fileOutputStream.write(bytes, 0, len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (fileOutputStream != null) {
fileOutputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
} try {
if (fileInputStream != null) {
fileInputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

练习:用字节流复制mp3



public void test10() {

        FileOutputStream fileOutputStream = null;
FileInputStream fileInputStream = null;
try {
fileOutputStream = new FileOutputStream("G:\\破烂\\有你的江湖.mp3");
fileInputStream = new FileInputStream("G:\\破烂\\DMYoung,岚aya - 有你的江湖-TVsize.mp3"); int len = 0;
byte[] bytes = new byte[10240000];
while ((len = fileInputStream.read(bytes)) != -1) { fileOutputStream.write(bytes, 0, len);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
if (fileOutputStream != null) {
fileOutputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
} try {
if (fileInputStream != null) {
fileInputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

缓冲区字节输出流


public void test11() { BufferedOutputStream bufferedOutputStream = null;
FileOutputStream fileOutputStream= null; try { fileOutputStream = new FileOutputStream("./xxx.txt");
bufferedOutputStream = new BufferedOutputStream(fileOutputStream); bufferedOutputStream.write("花音千圣天下第一".getBytes());
bufferedOutputStream.flush(); } catch (IOException e) {
e.printStackTrace();
}finally {
try {
if (bufferedOutputStream != null) {
bufferedOutputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

缓冲区字节输入流


public void test12(){ FileInputStream fileInputStream = null;
BufferedInputStream bufferedInputStream = null; try {
fileInputStream = new FileInputStream("./xxx.txt");
bufferedInputStream = new BufferedInputStream(fileInputStream); byte[] bytes = new byte[1024];
int len = 0;
while ((len = bufferedInputStream.read(bytes)) != -1){ System.out.println(new String(bytes,0,len));
}
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
bufferedInputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
  • 字符流和字节流的区别

    • 1.处理对象不同
    • 2.处理数据的单位不同,字符流操作char,字节流操作byte(Java中一个中文占3个字节)

序列化

序列化


public void test13(){ Student student = new Student(); student.setName("刘子博");
student.setAge(22);
student.setId("12345678"); //1.类结构要不要保存? 不需要
//2.数据要不要? 需要
//3.变量名和创建位置要不要? 不需要 //保存一个对象最重要的就是保存数据 ObjectOutputStream oos = null;
FileOutputStream fos = null; try {
fos = new FileOutputStream("./stu.out");
oos = new ObjectOutputStream(fos); //将一个对象写入本地
oos.writeObject(student); } catch (IOException e) {
e.printStackTrace();
}finally {
try {
if (fos != null) {
fos.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

反序列化


public void test14(){ ObjectInputStream ois = null;
FileInputStream fis = null; try {
fis = new FileInputStream("stu.out");
ois = new ObjectInputStream(fis); Object o = ois.readObject();
System.out.println(o); } catch (IOException | ClassNotFoundException e) {
e.printStackTrace();
}finally {
try {
if (fis != null) {
fis.close();
}
} catch (IOException e) {
e.printStackTrace();
}
}
}

工程

链接:https://pan.baidu.com/s/1BwbDrxsoAkLMAvzQwg6kMg

提取码:yhm0

2019.3.20 I/O相关的更多相关文章

  1. 【盛派周三分享-2019.2.20】开放分享内容,本期主题:《SCF、DDD及相关架构思想讨论》

    “周三分享”是盛派网络约定的每周三晚上定时举办的内部分享活动,活动主要由技术人员分享各方面的技术主题,并由所有参与者围绕主题进行讨论.除技术话题外,也可能涉及到相关的设计.财税.金融.政策等方面的延伸 ...

  2. Python + Anaconda + vscode环境重装(2019.4.20)

    目录 卸载程序 安装Ananconda 检查系统环境变量 更换国内镜像源 设置VS CODE 用户配置及工作环境配置 @(Python + Anaconda + vscode环境重装) 工程目录的使用 ...

  3. 2019.03.20 mvt,Django分页

    MVT模式   MVT各部分的功能:   M全拼为Model,与MVC中的M功能相同,负责和数据库交互,进行数据处理.       V全拼为View,与MVC中的C功能相同,接收请求,进行业务处理,返 ...

  4. 2019.4.18 HTML + CSS相关整理

    目录 标签 块标签 行标签 行块转化 嵌套规则 css引入方式 行间样式 内部引入 外部引入 选择器 基础选择器 组合选择器 盒模型 css样式 字体属性 设置字体的大小 设置字体的粗细 设置字体的风 ...

  5. 【2019.8.20 NOIP模拟赛 T3】小X的图(history)(可持久化并查集)

    可持久化并查集 显然是可持久化并查集裸题吧... 就是题面长得有点恶心,被闪指导狂喷. 对于\(K\)操作,直接\(O(1)\)赋值修改. 对于\(R\)操作,并查集上直接连边. 对于\(T\)操作, ...

  6. 【2019.7.20 NOIP模拟赛 T1】A(A)(暴搜)

    打表+暴搜 这道题目,显然是需要打表的,不过打表的方式可以有很多. 我是打了两个表,分别表示每个数字所需的火柴棒根数以及从一个数字到另一个数字,除了需要去除或加入的火柴棒外,至少需要几根火柴棒. 然后 ...

  7. 2019.6.20 校内测试 NOIP模拟 Day 1 分析+题解

    这次是zay神仙给我们出的NOIP模拟题,不得不说好难啊QwQ,又倒数了~ T1 大美江湖 这个题是一个简单的模拟题.   ----zay 唯一的坑点就是打怪的时候计算向上取整时,如果用ceil函数一 ...

  8. 【2019.3.20】NOI模拟赛

    题目 这里必须标记一下那个傻逼问题,再不解决我人就没了! 先放一个 $T3$ $20$ 分暴力 #include<bits/stdc++.h> #define rep(i,x,y) for ...

  9. 2019.10.20 csp-s模拟测试 lrd试题 反思总结

    赶进度赶进度,丢个代码两三句备注一下完事了. day1: 前面两道题没实际写代码怕印象不深所以描述一下大意. T1: 题目大意:给出两个数&.|.^的结果(可能只给出其中某一项或者某两项),求 ...

随机推荐

  1. python文件处理os模块

    一.os模块概述 Python os模块包含普遍的操作系统功能.如果你希望你的程序能够与平台无关的话,这个模块是尤为重要的.(一语中的) 二.常用方法 1.os.name 输出字符串指示正在使用的平台 ...

  2. Media Queries 媒体类型

    引用方法:1.<link rel="stylesheet" type="text/css" href="style.css" medi ...

  3. requests基础

    爬虫的基本原理:爬虫本质上是模拟人浏览信息的过程,只不过他通过计算机来达到快速抓取筛选信息的目的.所以我们想要写一个爬虫,最基本的就是要将我们需要抓取信息的网页原原本本的抓取下来.这个时候就要用到re ...

  4. C++ 中 dynamic_cast 浅析

    简述:dynamic_cast 操作符,将基类的指针或引用安全的转换为派生类的指针或引用.主要讲解,dynamic_cast操作符的原理.使用方式.编译器设置.返回值等相关知识. dynamic_ca ...

  5. js原型链prototype与__proto__以及new表达式

    对象模型的细节 https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Details_of_the_Object_Model

  6. Build fat static library (device + simulator) using Xcode and SDK 4+

    155down votefavorite 185 It appears that we can - theoretically - build a single static library that ...

  7. SharePoint 2013报错之“指定的文件不是有效的电子表格或者没有包含要导入的数据”

    当你尝试用SharePoint 2013中的“导入电子表格”功能时,可能会遇到报错“指定的文件不是有效的电子表格或者没有包含要导入的数据” 解决方法:只需要将你的SharePoint网址添加到浏览器的 ...

  8. C语言/C++编程学习三种循环用法和区别

    C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构.C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现 ...

  9. 利用find同时查找多种类型文件

    find . -name "*.c" -o -name "*.cpp" -o -name "*.h" 就可以列出当前目录下面所有的c,cpp ...

  10. cdq分治略解

    前言 陌上花开,可缓缓归矣                         --吴越王 寓意:意思是:田间阡陌上的花开了,你可以一边赏花,一边慢慢回来. 隐意:春天都到了,你怎么还没有回来.形容吴越王 ...