什么是流?

概念:内存与存储设备之间传输数据的通道。程序运行后保存在内存,文件一般在硬盘中,在程序中读写文件,需要在内存和存储设备中建立通道。数据借助流传输

流的分类:

按流向:

  • 输入流:将存储设备中的内容读入到内存中
  • 输出流:将内存中的内容写入到存储设备中

按单位:

  • 字节流:以字节为单位,可以读写所有数据。因为所有数据都是以字节的方式来存储的
  • 字符流:以字符为单位,只能读写文本数据。

 按功能:

  • 节点流:具有实际传输数据的读写功能
  • 过滤流:在节点流的基础之上增强功能

字节流:

  • 字节输入流: InputStream类

    方法:

      int availble()  //返回此输入流下一个方法调用可以不受阻塞地从此输入流读取(或跳过)的估计字数

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

      void mark(int readlimit)  //在此输入流中标记当前位置

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

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

      int read(byte[] b, int off, int len)  //在指定位置将输入流中最多len个数据字节读入b数组

      void reset() //将此流重新定位到最后一次对此输入流调用mark方法时的位置

        long skip(long n)  //跳过和丢弃此输入流中数据的n个字节

  • 字节输出流:OutputStream类

     方法:

      void close()   //关闭此输出流并释放与该流关联的所有系统资源

      void flush()   // 刷新此输出流并强制写出所有缓冲的输出字节

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

      void write(byte[] b, int off, int len) //将指定byte数组中从偏移量off开始的len个字节写入此输出流

      abstract void wite(int b)  //将指定的字节写入此输出流

InputStream类和OutputStream类都是抽象类,不能实例化,应该用其子类,可用FileInputStream和FileOutputStream。

FileInputStream:

  构造方法:FileInputStream(File file)

       FileInputStream(String name)   //name指文件路径

         FileInputStream(FileDescriptor fdObj)

  方法:

    protected void finalize()   //确保文件不再引用文件输入流时调用close方法

FileOutputStream:

  构造方法:FileOutputStream(String name)  //每次写入都会覆盖原有的数据

         FileOutputStream(String name, boolean append)  //不覆盖原有数据

         FileOutputStream(File file)

         FileOutputStream(File file, boolean append)

       FileOutputStream(FileDescriptor fdObj)

       FileOutputStream(FileDescriptor fdObj, boolean isFdOwner)

package com.java.leetcode.io;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.Arrays; /*
演示FileInputStream(文件字节输入流)
演示FileOutputStream(文件字节输出流) */
public class Stream01 {
public static void main(String[] args) throws IOException {
//1.创建FileInputStream,文件可能没有,需要抛出异常
FileInputStream fis = new FileInputStream("D:\\stream01.txt");
//读取数据 单个字节fis.read() 效率低下
// int data;
// while ((data = fis.read()) != -1){ //fis.read()返回下一个字节,如果读到结尾返回-1
// System.out.print((char)data);
// }
byte[] buffer = new byte[3];
//比较拉垮,不采用,直接用循环读
// int count = fis.read(buffer); //该方法返回实际返回的个数
// System.out.println(new String(buffer)+"读取的字节数"+count); //hel只读了3个
// int count1 = fis.read(buffer); //接着读
// System.out.println(new String(buffer)+"读取的字节数"+count1); //lo 读取了三个
// int count2 = fis.read(buffer); //接着读
// System.out.println(new String(buffer)+"读取的字节数"+count2);//io读取了2个
int count = 0;
while ((count = fis.read(buffer)) != -1){
System.out.println(new String(buffer)+"读取的字节数"+count);
}
//2.创建FileOutputStream
//FileOutputStream fos = new FileOutputStream("D:\\stream01.txt");//该构造方法为每次写入的数据都覆盖原来的
FileOutputStream fos = new FileOutputStream("D:\\stream01.txt",true); //为不覆盖
fos.write(97);
fos.write('a');
fos.write('c');
System.out.println("执行完毕");
String str = "helloword";
fos.write(str.getBytes());
}
}

运行结果:

文件内容:

注意:代码的顺序是先读取再写入进去。

字节流复制文件

package com.java.leetcode.io;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException; /*
使用文件字节流实现文件的复制
*/
public class Stream02 {
public static void main(String[] args) throws IOException {
//文件字节输入流
FileInputStream fis = new FileInputStream("E:\\face01.jpg"); //抛出异常,文件可能不存在
//文件字节输出流
FileOutputStream fos = new FileOutputStream("E:\\face001.jpg"); //未复制前并不存在该文件。将face01复制,复制后的图片放在E盘下,明明为face001。jpg
//一边读,一边写
byte[] buffer = new byte[1024]; //每次读1k
int count = 0;
while ((count = fis.read(buffer))!=-1) {
fos.write(buffer);
}
//关闭
fis.close();
fos.close();
System.out.println("复制完毕!");
}
}

IO ——字节流的更多相关文章

  1. JAVA IO 字节流与字符流

    文章出自:听云博客 题主将以三个章节的篇幅来讲解JAVA IO的内容 . 第一节JAVA IO包的框架体系和源码分析,第二节,序列化反序列化和IO的设计模块,第三节异步IO. 本文是第一节.     ...

  2. Java学习之IO字节流

    字节流分为FileInputStream 和FileOutputStream package com.io; import java.io.File; import java.io.FileInput ...

  3. Java提高篇(二):IO字节流、字符流和处理流

    在我们的Java语言当中,通常会有对文件进行读写,因此我们引入java的IO类来进行文件的读写. 一.字节流 下面是一个字节流的实例: import java.io.*; public class I ...

  4. Java学习笔记28(IO字节流)

    IO定义: 写:Output操作:将内存上的数据持久化 到设备上,这个动作称为输出: 读:Input操作:把硬盘上的东西读取到内存,这个动作称为输入:              这两种操作称为IO流 ...

  5. 14、IO (字节流、字符流)

    输入和输出 * A:输入和输出 * a: 参照物 * 到底是输入还是输出,都是以Java程序为参照 * b: Output * 把内存中的数据存储到持久化设备上这个动作称为输出(写)Output操作 ...

  6. IO字节流。

    字节输出流: java.io.OutputStream :抽象类,是表示输出字节流的所有类的父类. java.io.FileOutputStream extends OutputStream: 文件字 ...

  7. Java IO 字节流与字符流 (五)

    Java的IO流分为字符流(Reader,Writer)和字节流(InputStream,OutputStream),字节流顾名思义字节流就是将文件的内容读取到字节数组,然后再输出到另一个文件中.而字 ...

  8. Java IO 字节流与字符流 (三)

    概述 IO流用来处理设备之间的数据传输 Java对数据的操作时通过流的方式 Java用于操作流的对象都在IO包中 流按操作的数据分为:字节流和字符流 流按流向不同分为:输入流和输出流 IO流常用基类 ...

  9. Java IO 字节流与字符流 (二)

    1. 什么是流 Java中的流是对字节序列的抽象,我们可以想象有一个水管,只不过现在流动在水管中的不再是水,而是字节序列.和水流一样,Java中的流也具有一个“流动的方向”,通常可以从中读入一个字节序 ...

  10. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_04 IO字节流_3_字节输出流_OutputStream类&FileOutputStream

    都在IO包下 所有字节输出最顶层的父类 它是一个抽象类.abstract修饰的 一般这种类定义的都是所有字节流都可以使用公共的方法,

随机推荐

  1. ctf之计算器

    题目信息如下: 打开环境,发现是一道简单的计算题 只能输入一位数字 F12查看源码发现作者将最大长度设置为1,我们将最大长度修改了即可 输入答案即可得到flag

  2. Molecule实现数栈至简前端开发新体验

    Keep It Simple, Stupid. 这是开发人耳熟能详的 KISS 原则,也像是一句有调侃意味的善意提醒,提醒每个前端人,简洁易懂的用户体验和删繁就简的搭建逻辑就是前端开发的至简大道. 这 ...

  3. 面向对象编程(C++篇4)——RAII

    目录 1. 概述 2. 详论 2.1. 堆.栈.静态区 2.2. 手动管理资源的弊端 2.3. 间接使用 2.4. 自下而上的抽象 3. 总结 4. 参考 1. 概述 在前面两篇文章<面向对象编 ...

  4. Java基础 (上)

    基础概念与常识 Java 语言有哪些特点? 简单易学: 面向对象(封装,继承,多态): 平台无关性( Java 虚拟机实现平台无关性): 支持多线程( C++ 语言没有内置的多线程机制,因此必须调用操 ...

  5. 详细描述一下 Elasticsearch 搜索的过程?

    想了解 ES 搜索的底层原理,不再只关注业务层面了. 解答: 搜索拆解为"query then fetch" 两个阶段. query 阶段的目的:定位到位置,但不取. 步骤拆解如下 ...

  6. 关于TP框架

    TP的特性有哪些? 1.多表查询非常方便,在model中几句代码就可以完成对多表的关联操作. 2.融合了smarty模板,使前后台分离 3.支持多种缓存技术,尤其对memcache技术支持非常好 4. ...

  7. js技术之分割split()

    案例:把所有单词以空格为分割并将首字母转为大写 <!DOCTYPE html><html lang="en"><head> <meta c ...

  8. hitcon_2017_ssrfme

    hitcon_2017_ssrfme 进入环境给出源码 <?php if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { $http_x_headers ...

  9. i2c总线编码

    i2c总线编码 发送启动信号S 在同步时钟线SCL 为高电平时,数据线出现的由高到低的下降沿. 启动信号子程序STA 1 /************************************** ...

  10. 如何将Matlab中“模糊控制设计器”的隶属度函数导出图片(figure)

    如何将Matlab中"模糊控制设计器"的隶属度函数导出图片(figure)详情参考matlab官方帮助手册:plotmf()函数https://www.mathworks.com/ ...