1. FileInputStream流

简介:FileInputStream实现类继承自抽象父类InputStream类,是一个基于字节输入流的类。利用FileInputStream类可以从硬盘文件中读取数据到内存中供程序使用。如果所填路径下文件不存在会爆出文件找不到异常。

1. 三种构造方法

常用的构造方法是第一种和第三种。

//通过打开与实际文件的连接创建一个FileInputStream ,该文件由文件系统中的File对象file
FileInputStream(File file)
File file = new File("E:\\IO\\file.txt");        //file类又可以单独操作。
FileInputStream fin = new FileInputStream(file);//创建 FileInputStream通过使用文件描述符fdObj ,其表示在文件系统中的现有连接到一个实际的文件。
public FileInputStream(FileDescriptor fdObj)//通过打开与实际文件的连接来创建一个FileInputStream ,该文件由文件系统中的路径名path
FileInputStream(String path)
FileInputStream fin = new FileInputStream("E:\\IO\\file.txt");
2. 常用方法
  1. int read()方法,如果成功读取返回值就是这个直接所对应的字符编码值。否则返回值是-1。
import java.io.*;public class Demo01 {public static void main(String[] args) {try {// file.txt中存放了       abcdefgFileInputStream in = new FileInputStream("E:\\IO\\file.txt");int cnt = 0;while((cnt = in.read()) != -1){System.out.println(cnt + " " + (char)cnt);}System.out.println("执行完毕!");in.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
}
/*97 a98 b99 c100 d101 e102 f103 g执行完毕!*/
  1. int read(byte[] b) 方法,从该输入流读取最多 b.length个字节的数据为字节数组。 这里的返回值是读取到的字节数组b的长度。设置byte buf[2]的两个字节大小的数组,利用read(buf)方法,每次从流中读取两个字节,测试结果如下。如果buf数组大小比较大恰巧文件里的内容比较少,可能会一次性读取完毕。
import java.io.*;public class Demo03 {public static void main(String[] args) {try {// file.txt中存放了       abcdefgFileInputStream in = new FileInputStream("E:\\IO\\file.txt");byte[] buf = new byte[2];int len = 0;while((len = in.read(buf)) != -1){System.out.println(len + " " + new String(buf,0,len));}System.out.println("执行完毕!");in.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
}
/*2 ab2 cd2 ef1 g执行完毕!
*/
  1. int read(byte[] b, int off, int len) 从该输入流读取最多len字节的数据为字节数组,这个方法和第2个方法差不多,返回值都是所读取到的字节长度。第二个方法本质还是调用了第三个方法的read(byte[] b) == read(byte[] b, 0, b.length)。
import java.io.*;public class Demo03 {public static void main(String[] args) {try {// file.txt中存放了       abcdefgFileInputStream in = new FileInputStream("E:\\IO\\file.txt");byte[] buf = new byte[3];int len = 0;while((len = in.read(buf,0,buf.length)) != -1){System.out.println(len + " " + new String(buf,0,len));}System.out.println("执行完毕!");in.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
}
/*3 abc3 def1 g执行完毕!*/
  1. skip(long n)跳过并从输入流中丢弃 n字节的数据,首先要注意所有的流都可以看做一个先进先出的管道,必须按顺序读取包括写入。
import java.io.*;public class Demo04 {public static void main(String[] args) {try {// file.txt中存放了       abcdefgFileInputStream in = new FileInputStream("E:\\IO\\file.txt");in.skip(3);             //跳过3个字节,那么abc会舍弃byte[] buf = new byte[3];int len = 0;while((len = in.read(buf,0,buf.length)) != -1){System.out.println(len + " " + new String(buf,0,len));}System.out.println("执行完毕!");in.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
}
/*3 def1 g执行完毕!
*/
  1. 输入流关闭方法close(),关闭此文件输入流并释放与流相关联的任何系统资源。不要小看了这个方法,如果不关闭流会占用系统资源。
  1. 另外还有一些不常用的方法可以查JDK帮助文档了解。真正使用其实就是2,4,5使用的多。

2.FileOutputStream流

简介:FileOutputStream实现类继承自抽象父类OutputStream类,是一个基于字节输出流的类。利用FileOutStream类可以将程序运行的数据输出到硬盘进行存储。FileOutputStream流不会出现找不到文件的异常,如果当前路径下文件不存在会自动新建一个。

1. 五种构造方法

这里主要介绍带boolean append参数的方法,append参数是用来针对以存在文件如何处理的。如果给定的一个文件路径已经存在,恰好append参数传入true,那么该文件不会进行覆盖,会在文件的末尾追加需要写入的数据,如果append传入的值为false那么会直接对文件进行覆盖。所以可以大致知道构造方法1和4,默认第二个参数是false,最后还是调用两个参数的方法进行。

创建文件输出流以写入由指定的 File对象表示的文件。
FileOutputStream(File file) 创建文件输出流以写入由指定的 File对象表示的文件,是否覆盖?
FileOutputStream(File file, boolean append) 创建文件输出流以写入指定的文件描述符,表示与文件系统中实际文件的现有连接。
FileOutputStream(FileDescriptor fdObj) 创建文件输出流以指定的名称写入文件。
FileOutputStream(String name) 创建文件输出流以指定的名称写入文件,是否覆盖?
FileOutputStream(String name, boolean append)

测试如下

import java.io.*;public class Demo01 {public static void test(boolean append) throws Exception {//out.txt文件最开始是: abcFileOutputStream out = new FileOutputStream("E:\\IO\\out.txt",append);String name = "Hello IO";out.write(name.getBytes());FileInputStream in = new FileInputStream("E:\\IO\\out.txt");byte[] buf = new byte[1024];int len = 0;System.out.print("append = " + append + " -> ");while((len = in.read(buf)) != -1){System.out.println(len + " " + new String(buf,0,len));}out.close();in.close();}public static void main(String[] args) {try {//最开始文本中的字符串是     abc-//测试追加test(true);//现在得到的字符串是abc-hello IO//测试覆盖test(false);/*输出:append = true -> 12 abc-Hello IOappend = false -> 8 Hello IO*/}  catch (Exception e) {e.printStackTrace();}}
}
2. 常用的方法
  1. void write(int b) 将指定的字节写入此文件输出流,这里直接采用append = false覆盖的方式。一定要注意写入的数据保证是一个字节大小。
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;public class Demo02 {public static void main(String[] args) {try {FileOutputStream out = new FileOutputStream("E:\\IO\\out.txt");String name = "Hello IO";out.write(name.charAt(0));System.out.println("写入执行完毕!");FileInputStream in = new FileInputStream("E:\\IO\\out.txt");byte[] buf = new byte[1024];int len = 0;while((len = in.read(buf)) != -1){System.out.println(len + " " + new String(buf,0,len));}System.out.println("读取执行完毕!");out.close();in.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
}
/*写入执行完毕!1 H读取执行完毕!
*/
  1. void write(byte[] b) 将 b.length个字节从指定的字节数组写入此文件输出流。
import java.io.*;public class Demo03 {public static void main(String[] args) {try {FileOutputStream out = new FileOutputStream("E:\\IO\\out.txt");String name = "Hello IO";byte[] buf = name.getBytes();out.write(buf);System.out.println("写入执行完毕!");FileInputStream in = new FileInputStream("E:\\IO\\out.txt");buf = new byte[1024];int len = 0;while((len = in.read(buf)) != -1){System.out.println(len + " " + new String(buf,0,len));}System.out.println("读取执行完毕!");out.close();in.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
}
/*写入执行完毕!8 Hello IO读取执行完毕!
*/
  1. void write(byte[] b, int off, int len) 将byte[] b数组中从下标off开始,字节数为len个写入输出流。一定要注意当off过大时小心len的长度过大直接不存在就会爆出异常。另外write(byte[] b) == write(byte[] b, 0, b.length)。
import java.io.*;public class Demo04 {public static void main(String[] args) {try {FileOutputStream out = new FileOutputStream("E:\\IO\\out.txt");String name = "Hello IO";byte[] buf = name.getBytes();int idx = 1;out.write(buf,idx,buf.length-idx);   //第三个参数的含义是写入数据字节数,不是长度。System.out.println("写入执行完毕!");FileInputStream in = new FileInputStream("E:\\IO\\out.txt");buf = new byte[1024];int len = 0;while((len = in.read(buf)) != -1){System.out.println(len + " " + new String(buf,0,len));}System.out.println("读取执行完毕!");out.close();in.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
}
/*写入执行完毕!7 ello IO读取执行完毕!*/
  1. close()方法,关闭此文件输出流并释放与此流相关联的任何系统资源防止占用内存。

3. 利用文本字节流实现文件的拷贝。

现在有这样一张图片,需要从文件中读取,然后重新拷贝一份。

import java.io.*;public class test {public static void main(String[] args) {try {FileInputStream in = new FileInputStream("E:\\IO\\001.jpg");FileOutputStream out = new FileOutputStream("E:\\IO\\002.jpg");byte[] buf = new byte[1024];int len = 0,cnt = 1;while((len = in.read(buf)) != -1){System.out.println(cnt++);out.write(buf);}System.out.println("复制完毕!");in.close();out.close();} catch (FileNotFoundException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}
}

4. 总结

  1. FileInputStream需要注意文件不存在时会爆出异常。

  2. FileInputStream有三个构造方法,读取数据时需要注意按照先进先出的顺序读取,对于不需要的可以使用skip(long size)方法跳过固定的字节数。

  3. FileOutputStream对于不存在的文件路径会新建一个路径,不会爆出异常。

  4. FileOutputStream需要注意的是它的5个构造方法中有两个用来设置是追加还是覆盖的。

  5. 字节流的实现类很多,应该说IO流的东西很多。我们要做的就是尽自己的能力学好每一个流。掌握基础的IO流是必不可少的。

FileInputStream 和 FileOutStream流相关推荐

  1. InputStream Reader FileInputStream BufferedReader InputStreamReader FileReader FileInputStream和转换流

    原文地址,转发备忘 https://blog.csdn.net/liu940204/article/details/79994467 ava.io下面有两个抽象类:InputStream和Reader ...

  2. java数据通道抽象为流_【java】IO流

    对于java的IO流的理解很长时间来都是很乱,包括学习其他的语言对这一块知识也都算是一个盲点.更多的时候一提到读取保存数据就是使用数据库.这一次学习了IO流,自己又解决了一个很大的盲点. IO流为我们 ...

  3. 韩顺平--IO流专题

    一.文件 (一)概念 1.文件流 (二)常用操作 1.创建文件 package com.hspedu.file;import org.junit.jupiter.api.Test;import jav ...

  4. Java学习笔记----File类与IO流

    第五章:File类与IO流 第一节:File类 1.1 概述 java.io.File类是文件和目录路径名的抽象表示,主要用于文件和目录的创建.查找和删除等操作 Java把电脑中的文件和文件夹(目录) ...

  5. 一篇文章搞定IO流(超级详细!!!)

    文章目录 一.IO流的分类: (1)根据流向分为输入流和输出流: (2)根据传输数据单位分为字节流和字符流: (3)根据流的角色分为节点流和处理流: 二.IO流的四大基类 (1)InputStream ...

  6. Java基础系列——IO流

    2019独角兽企业重金招聘Python工程师标准>>> ---恢复内容开始--- Java对数据的操作都是通过流的方式,数据的输入和输出是相对内存来说的,将外设的数据读到内存:输入流 ...

  7. java--IO流(详)

    IO流也称为输入.输出流,就是用来读写数据的. 一.概述: 1.IO流的作用? 读写文件数据的 2.IO流是怎么划分的,大体分为几类,各自的作用? 字节流:字节输入流,字节输出流(读写字节数数据的) ...

  8. java IO之 File类+字节流 (输入输出 缓冲流 异常处理)

    1. File类 File 路径问题: 上下级文件夹之间使用分隔符分开: 在Windows中分隔符为'\' ,在Unix/Linux中分隔符为'/' 跨平台分隔符: 专业的做法是使用File.sepa ...

  9. Java中IO流的总结

    有关Java中IO流总结图 流分类 按方向分 输入流 输出流 按单位分 字节流 字符流 按功能分 节点流 处理流(过滤流) 其他 所有的流继承与这四类流:InputSteam.OutputStream ...

最新文章

  1. linux 进程内存解析
  2. mysql dba系统学习(21)mysql存储引擎InnoDB
  3. 从上千篇论文脱颖而出,支付宝论文凭什么获得WWW2020评委认可?
  4. python中怎么写注释_Python中注释的写法
  5. (转)彻底学会使用epoll(一)——ET模式实现分析
  6. Angular模板高级使用
  7. [TC SRM 685 div1 lev1] MultiplicationTable2
  8. Linux常用的服务器构建
  9. linux ip addr peer,CentOS 7 设置网络IP地址
  10. swiftui动画之tab自定义切换动画_骨骼动画制作|万彩骨骼大师
  11. Java开发工程师面试笔试试题,真题;
  12. CSS半透明磨砂效果实现
  13. 【20G】三菱PLC全套资料(手册+视频教程+编程软件+仿真软件)
  14. C#_HelloWorld 篇
  15. 2020全球C++及系统软件技术大会议程
  16. 基于CCS工程MSP430串口升级(三)
  17. 怎么把好几行弄成一行_怎么把excel表格里多行变成一行数据|excel表格中让多行内容变成为一行...
  18. 微信小程序获取绑定授权用户手机号getPhoneNumber-全流程及手机号带*号问题
  19. vue-devtools 各版本安装
  20. 【SpringBoot学习】39、SpringBoot 集成 wxJava 微信小程序:订单支付

热门文章

  1. QRCode自定义二维码中间图片
  2. 用window10装逼
  3. VS2022安装Python开发环境
  4. 2022年山东省安全保护服务人员(初级保安员)考试练习题及答案
  5. Docker 下使用Weave Scope监控容器
  6. Allegro设置Cline到Shape按照区域规则避让操作指导
  7. 在html中实现家用电器商品分类,综合练习(一)——网站首页的整体布局、商品分类版块.doc...
  8. XTransfer技术新人进阶秘诀:不可错过的宝藏Mentor
  9. 学习软件测试线上和线下哪个好,线上VS线下陪玩APP独家测评|好用到哭!
  10. php配置辨别图片形式,基于OpenCV的PHP图像人脸辨别技术(转载)