什么是流?

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

流的分类:

按流向:

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

按单位:

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

 按功能:

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

字节流:

  • 字节输入流: 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. 说一下linux启动过程boot流程

    linux启动过程 https://www.ibm.com/developerworks/cn/linux/l-linuxboot/index.html http://www.ruanyifeng.c ...

  2. request的自动urlencode问题解决

    今天写盲注脚本的时候,由于题目对空格进行了过滤,所以必须要用%09进行代替,然而当我在脚本中,将payload的空格替换成%09的时候,抓包发现进行了两次编码,导致脚本一直跑不通. 自己在网上也没有找 ...

  3. 字节跳动社会招聘&内推-帮助你更快加入字节跳动

    字节跳动社会招聘&内推「[内推码]:4J8CA3W」 内推时间:一直有效 招聘对象:根据招聘要求而定 社招投递链接: https://job.toutiao.com/s/de5teaA 应届生 ...

  4. BZOJ3159: 决战(FHQ Treap)

    传送门: 解题思路: 算是补坑了,这题除了Invert以外就可以树剖线段树解决了. 考虑Invert操作,延续先前树链剖分的做法,考虑先前算法的瓶颈. 最暴力的方法是暴力交换权值,然而这种方法忽略了当 ...

  5. jvm大局观之内存管理篇(二):当java中new一个对象,背后发生了什么

    https://zhuanlan.zhihu.com/p/257863129?utm_source=ZHShareTargetIDMore 番茄番茄我是西瓜 那是我日夜思念深深爱着的人啊~ 已关注   ...

  6. rabbitmq 中 vhost 的作用是什么?

    vhost本质上是一个mini版的RabbitMQ服务器,拥有自己的队列.绑定.交换器和权限控制: vhost通过在各个实例间提供逻辑上分离,允许你为不同应用程序安全保密地运行数据: vhost是AM ...

  7. jQuery对象的创建

    1.js类库 JavaScript封装了很多的预定义的对象和实用函数,能帮助使用者建立有高难度交互 客户端页面,并且兼容各大浏览器.跑在浏览器,请求服务器 当前比较流行的js库: jquery EXT ...

  8. SpringMvc怎么和AJAX相互调用的?

    通过Jackson框架就可以把Java里面的对象直接转化成Js可以识别的Json对象.具体步骤如下 : (1)加入Jackson.jar (2)在配置文件中配置json的映射 (3)在接受Ajax方法 ...

  9. java接口返回为空时候如何处理

    java前后端分离以后,后端常常返回给前端以下的内容: 如果遇到某个字段的内容为空的时候会出现这样的情况: 图中红色箭头的情况是一个数组集合,但是该集合为空,所以就返回null,但是我们如果想对于这样 ...

  10. 【C/C++】C语言基础知识【第二版】

    基础语法 输出语句 #include <stdio.h> int main(void) { printf("-------分界线1------- \n"); print ...