IO流

水流

特点

连续性

逝者如斯夫,不舍昼夜;

方向性

一江春水向东流。水往低处流。百川东到海,何时复西归?少壮不努力,老大徒伤悲!

源头尽头

唯有源头活水来;覆水难收

Java里的IO也有这样的特点。

IO:数据从硬盘流向内存(Input),或者从内存流向硬盘(Output)。

IO流分类:

按照流的流向来分:输入流、输出流。

|-输入流:读入内存。

|-输出流:写出到硬盘等设备。

按操作数据单元分:字节流、字符流

|-字节流:8位

|-字符流:16位

按流的角色分:节点流、处理流。

|-节点流:特定的IO设备(如硬盘),也叫低级流

|-处理流:经过封装的流,也叫高级流、包装流,可以消除不同节点流的差异(典型的装饰器模式)

Java的IO流有40多个类,高抽象层的基类有四个:

字节流

字符流

输入流

InputStream

Reader

输出流

OutputStream

Writer

字节流

字节流:100100011010100010

可以操作所有文件,包括文本文件、视频、音频、压缩文件等等都可以用字节流读写。

两个重要的抽象类:

(1)抽象类 java.io.OutputStream,是输出字节流的所有类的超类

|--API方法摘要:

|--|--void write(byte[] b) 将 b.length 个字节从指定的 byte 数组写入此输出流。

|--|--abstract void write(int b) 将指定的字节写入此输出流。

|--|--void close()关闭此输出流并释放与此流有关的所有系统资源。

(2)抽象类 java.io.InputStream,是输入字节流的所有类的超类

|--API方法摘要:

|--|--abstract int read()从输入流中读取数据的下一个字节。

|--|--int read(byte[] b) 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。

|--|--void close() 关闭此输入流并释放与该流关联的所有系统资源。

FileOutputStream写文件

// 文件输出流。完整地说,是文件字节输出流。

public class FileOutputStream extends OutputStream

步骤:

1.创建流对象

2.调用write方法,把数据写入文件

3.释放资源

import java.io.*;

public class 文件字节输出流 {

public static void main(String[] args) {

File file = new File("文件字节输出流.txt"); // 创建文件对象

try {

// (1)构造:通过文件对象创建文件输出流对象

FileOutputStream fos = new FileOutputStream(file);

// (2)写入文件

// (2.1)write(int b) 将"单个字节"写入到文件中

for (int i = 49; i < 97; i++) {

fos.write(i);

fos.write(' ');

}

// (2.2)write(byte[] b) 将"字节数组"中的数据全部写入文件

byte[] buffer = "I Love Java,你呢?".getBytes();

fos.write(buffer);

// (3)关闭流

fos.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

追加:

使用构造方法:FileOutputStream(File file, boolean append)

// 构造:通过文件对象创建文件输出流对象

// 附加第二个参数true,指定进行文件追加,默认为不追加

fos = new FileOutputStream(file, true);

回车换行:

CR(carriage return),回车,\r

LF(line feed),换行,\n

windows:\r\n

linux或unix:\n

mac:\r

FileInputStream读文件

public class FileInputStream extends InputStream

import java.io.*;

public class 文件字节输入流 {

static final int C_CONDITION = 2;

public static void main(String[] args) {

try {

File file = new File("testRead.dat"); // 创建文件对象

// 【1】创建输入流对象,相当于打开文件

FileInputStream fis = new FileInputStream(file);

if (C_CONDITION == 1) {

// 【2】.read():读取单个字节

for (int i = 0; i < file.length(); i++) {

// 循环读取"字节",转为字符输出,英文没问题

int read = fis.read();

char ch = (char) read;

System.out.print(ch);

}

System.out.println();

} else {

// 【2】.read(byte[] b):读取文件中的数据到字节数组

// 根据文件的字节长度创建字节数组

long len = file.length();

byte[] buf = new byte[(int) len];

fis.read(buf);

// 利用字节数组创建字符串

String str = new String(buf);

System.out.println(str);

}

// 【3】关闭流

fis.close();

} catch (FileNotFoundException fnfe) {

System.out.println("文件打开失败。");

} catch (IOException ioe) {

ioe.printStackTrace();

}

}

}

复制文件

package ahjava.io;

import java.io.*;

public class 复制文件 {

public static void main(String[] args) {

字节流复制文件();

}

static void 字节流复制文件() {

File srcFile = new File("testRead.dat"); // 源文件对象

File destFile = new File("testCopy.java"); // 目标文件对象

if (destFile.exists()) {

// 判断目标文件是否存在,存在则删除

destFile.delete();

}

// 目标文件不存在才复制

try {

destFile.createNewFile();

// 创建文件输入/输出流对象

FileInputStream fis = new FileInputStream(srcFile);

FileOutputStream fos = new FileOutputStream(destFile);

// 创建字节数组,作为临时缓冲

byte[] buf = new byte[128];

System.out.println("开始复制文件...");

int len = -1;

// 循环从文件输入流中读取数据

while ((len = fis.read(buf)) != -1) {

System.out.println(len);

// 写入到文件输出流中

fos.write(buf, 0, len);

}

System.out.println("文件复制成功!");

fis.close(); // 关闭流

fos.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

上面的代码有哪些风险?

改进版:

static void 字节流复制文件2() {

// 1.close()提取到finally中

// 2.提取FilexxxStream对象

// 3.初始化(否则不准close)

// 4.close()时加判空语句

FileInputStream fis = null;

FileOutputStream fos = null;

File srcFile = new File("testRead.dat"); // 源文件对象

File destFile = new File("testCopy.java"); // 目标文件对象

if (destFile.exists()) {

// 判断目标文件是否存在,存在则删除

destFile.delete();

}

// 目标文件不存在才复制

try {

destFile.createNewFile();

fis = new FileInputStream(srcFile);

fos = new FileOutputStream(destFile);

// 创建字节数组,作为临时缓冲

byte[] buf = new byte[128];

System.out.println("开始复制文件...");

int len = -1;

// 循环从文件输入流中读取数据

while ((len = fis.read(buf)) != -1) {

System.out.println(len);

// 写入到文件输出流中

fos.write(buf, 0, len);

}

System.out.println("文件复制成功!");

// 关闭流

} catch (IOException e) {

e.printStackTrace();

} finally {

if (fis != null) {

try {

fis.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

fis = null;

}

if (fos != null) {

try {

fos.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

fos = null;

}

}

}

又臭又长!

Java 7异常处理写法:

try后面增加括号,其中定义流对象,该流对象仅在try中有效,执行完毕自动释放,不需要写finally。

try(流对象){

} catch (IOException e) {

}

具体代码如下:

static void 字节流复制文件3() {

File srcFile = new File("testRead.dat"); // 源文件对象

File destFile = new File("testCopy.java"); // 目标文件对象

if (destFile.exists()) {

// 判断目标文件是否存在,存在则删除

destFile.delete();

}

// try(流对象)

try (FileInputStream fis = new FileInputStream(srcFile);

FileOutputStream fos = new FileOutputStream(destFile)) {

destFile.createNewFile();

// 创建字节数组,作为临时缓冲

byte[] buf = new byte[128];

System.out.println("开始复制文件...");

int len = -1;

// 循环从文件输入流中读取数据

while ((len = fis.read(buf)) != -1) {

System.out.println(len);

// 写入到文件输出流中

fos.write(buf, 0, len);

}

System.out.println("文件复制成功!");

// 关闭流

} catch (IOException e) {

e.printStackTrace();

}

}

*Java9异常处理写法

觉得try里的代码太繁琐,try()中可以引入外部的变量:

FileInputStreamfis = new FileInputStream(srcFile);

FileOutputStream fos = new FileOutputStream(destFile);

try (fis;fos){...}

// ↑ 理想状态,代码并不能这么写

然而,fis、fos本身需要抛异常,如果直接try...catch,这两个变量会变成另外的try中的局部变量;

如果把声明提取到try之外,try (fis;fos)又需要变量是final的

FileInputStream fis = null;

FileOutputStream fos = null;

try {

fis = new FileInputStream(srcFile);

fos = new FileOutputStream(destFile);

} catch (FileNotFoundException e1) {

e1.printStackTrace();

}

try (fis;fos) {

CopyFile.java:20: 错误: 用作 try-with-resources 资源的变量 fis 既不是最终变量, 也不是实际上的最终变量

try (fis;fos) {

^

CopyFile.java:20: 错误: 用作 try-with-resources 资源的变量 fos 既不是最终变量, 也不是实际上的最终变量

try (fis;fos) {

所以,fis和fos需要往外抛出异常,外部调用的地方又需要捕获异常。比不用此功能还要麻烦。可运行代码如下:

import java.io.*;

public class CopyFile{

public static void main(String[] args) {

try {

copyJDK9();

} catch (FileNotFoundException e) {

e.printStackTrace();

}

}

static void copyJDK9() throws FileNotFoundException {

File srcFile = new File("testRead.dat");

File destFile = new File("testCopy.java");

if (destFile.exists()) {

destFile.delete();

}

FileInputStreamfis = new FileInputStream(srcFile);

FileOutputStream fos = new FileOutputStream(destFile);

try (fis;fos) {

destFile.createNewFile();

byte[] buf = new byte[128];

System.out.println("start copy...");

int len = -1;

while ((len = fis.read(buf)) != -1) {

System.out.println(len);

fos.write(buf, 0, len);

}

System.out.println("success");

} catch (IOException e) {

e.printStackTrace();

}

}

}

字节流java_Java基础教程——字节流相关推荐

  1. 除号java_Java基础教程-运算符

    所谓运算符,就好比日常生活中的运算符号"+"."-"."*"."/",这些符号几乎天天都要用到.在Java中,运算符就和 ...

  2. C++基础教程,基本的输入输出

    标题:C++基础教程,基本的输入输出 C++ 的 I/O 发生在流中,流是字节序列.如果字节流是从设备(如键盘.磁盘驱动器.网络连接等)流向内存,这叫做输入操作.如果字节流是从内存流向设备(如显示屏. ...

  3. java入门基础教程(纯干货知识点+视频资源)

    本套Java视频教程是黑马程序员冯老师精心录制的Java基础班视频,该视频专门针对零基础的学员录制,授课讲究通俗易懂.干货.通过该套Java视频教程的学习,相信你能够轻轻松松地入门java语言. 完整 ...

  4. java程序设计之网络编程基础教程_Java程序设计之网络编程基础教程

    基本信息 书名:Java程序设计之网络编程基础教程(21世纪高等学校计算机基础实用规划教材) :43.50元 作者:李芝兴 主编 出版社:清华大学出版社 出版日期:2012-12-1 ISBN:978 ...

  5. 适合Java零基础小白学习的Java零基础教程

    很多Java零基础小白,在刚刚快入门的时候玩命的学习,玩命的记住Java原理,天天早上五点起床背Java的一些英文词汇,然后遇见一些未知的困难,让自己打到癫狂状态,逐渐迷失自我放弃Java,为了解决这 ...

  6. HTML入门基础教程相关知识

    HTML入门基础教程 html是什么,什么是html通俗解答: html是hypertext markup language的缩写,即超文本标记语言.html是用于创建可从一个平台移植到另一平台的超文 ...

  7. Java教程,Java基础教程,2020年全新Java基础学习教程

    时代在变化,Java的知识也在不断的变化,今天分享一下2020年Java全新的基础教程,想学习Java的小伙伴,看这个!全新哦,涵盖了2019年新增知识,并且视频完全源于课堂实录哦! 本套JAVA课程 ...

  8. 下面哪段程序能够正确的实现了GBK编码字节流到UTF-8编码字节流的转换

    下面哪段程序能够正确的实现了GBK编码字节流到UTF-8编码字节流的转换: byte[] src,dst; dst=String.fromBytes(src,"GBK").getB ...

  9. Spring Cloud Alibaba基础教程:使用Nacos实现服务注册与发现

    自Spring Cloud Alibaba发布第一个Release以来,就备受国内开发者的高度关注.虽然Spring Cloud Alibaba还没能纳入Spring Cloud的主版本管理中,但是凭 ...

最新文章

  1. mysql最高权限超级用户是_MySQL中,预设的、拥有最高权限超级用户的用户名为( )...
  2. Bash字符串处理(与Java对照) - 17.判断是否以另外的字符串结尾
  3. (130)FPGA面试题-FPGA设计中波特率和比特率的区别
  4. QT5新建工程错误-无法打开源文件QtWidgets/QApplication
  5. opencv-api convexityDefects
  6. 2021为什么大家都在选做独立站运营?
  7. 【bzoj 入门OJ】[NOIP 热身赛]Problem C: 星球联盟(并查集)
  8. 整理一年中使用到的工具和类库,可能正有你需要的!
  9. 操作系统概念第五章部分作业题答案
  10. Linux dos攻击服务器,Linux服务器如何防止DoS攻击
  11. paypal支付注意事项
  12. 金铜仙人辞汉歌-李贺
  13. 机器人鸣人是哪一集_火影忍者596集剧情介绍番外篇九尾抢夺指令_鸣人VS机器人版鸣人...
  14. html表单自动编号,Q&A|如何实现会员自动编号?
  15. 洛谷月赛T2 P6858[深海少女与胖头鱼]题解
  16. 经典问题 小白鼠试毒药 这个算法你绝对不知道
  17. 如何查看Oracle数据库的版本号
  18. 纪中DAY15做题小结
  19. paypal IPN and PDT
  20. java图书管理系统目的_java_图书管理系统java版,本文的目的就是通过图书管理 - phpStudy...

热门文章

  1. [UE5蓝图基础一] 5.鼠标滚轮前后设置视角远近
  2. vs下载问题:请检查网络连接
  3. 安装VBox共享文件增强功能VBoxGuestAdditions
  4. 一句话概括Docker
  5. Macbook air M1 关闭SIP;更改安全策略
  6. Linux命令_lsof 网络/文件监控
  7. 交大大佬新作上市!微内核架构操作系统ChCore全新升级
  8. 计算机神经影像学是干什么的,神经系统常用的影像学检查有哪些?
  9. 烽火HG2543C1获得超级密码删除tr069
  10. 跨站数据请求哪家强——青出于蓝的jsonp