IO ——字节流
什么是流?
概念:内存与存储设备之间传输数据的通道。程序运行后保存在内存,文件一般在硬盘中,在程序中读写文件,需要在内存和存储设备中建立通道。数据借助流传输
流的分类:
按流向:
- 输入流:将存储设备中的内容读入到内存中
- 输出流:将内存中的内容写入到存储设备中
按单位:
- 字节流:以字节为单位,可以读写所有数据。因为所有数据都是以字节的方式来存储的
- 字符流:以字符为单位,只能读写文本数据。
按功能:
- 节点流:具有实际传输数据的读写功能
- 过滤流:在节点流的基础之上增强功能
字节流:
- 字节输入流: 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 ——字节流的更多相关文章
- JAVA IO 字节流与字符流
文章出自:听云博客 题主将以三个章节的篇幅来讲解JAVA IO的内容 . 第一节JAVA IO包的框架体系和源码分析,第二节,序列化反序列化和IO的设计模块,第三节异步IO. 本文是第一节. ...
- Java学习之IO字节流
字节流分为FileInputStream 和FileOutputStream package com.io; import java.io.File; import java.io.FileInput ...
- Java提高篇(二):IO字节流、字符流和处理流
在我们的Java语言当中,通常会有对文件进行读写,因此我们引入java的IO类来进行文件的读写. 一.字节流 下面是一个字节流的实例: import java.io.*; public class I ...
- Java学习笔记28(IO字节流)
IO定义: 写:Output操作:将内存上的数据持久化 到设备上,这个动作称为输出: 读:Input操作:把硬盘上的东西读取到内存,这个动作称为输入: 这两种操作称为IO流 ...
- 14、IO (字节流、字符流)
输入和输出 * A:输入和输出 * a: 参照物 * 到底是输入还是输出,都是以Java程序为参照 * b: Output * 把内存中的数据存储到持久化设备上这个动作称为输出(写)Output操作 ...
- IO字节流。
字节输出流: java.io.OutputStream :抽象类,是表示输出字节流的所有类的父类. java.io.FileOutputStream extends OutputStream: 文件字 ...
- Java IO 字节流与字符流 (五)
Java的IO流分为字符流(Reader,Writer)和字节流(InputStream,OutputStream),字节流顾名思义字节流就是将文件的内容读取到字节数组,然后再输出到另一个文件中.而字 ...
- Java IO 字节流与字符流 (三)
概述 IO流用来处理设备之间的数据传输 Java对数据的操作时通过流的方式 Java用于操作流的对象都在IO包中 流按操作的数据分为:字节流和字符流 流按流向不同分为:输入流和输出流 IO流常用基类 ...
- Java IO 字节流与字符流 (二)
1. 什么是流 Java中的流是对字节序列的抽象,我们可以想象有一个水管,只不过现在流动在水管中的不再是水,而是字节序列.和水流一样,Java中的流也具有一个“流动的方向”,通常可以从中读入一个字节序 ...
- 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_04 IO字节流_3_字节输出流_OutputStream类&FileOutputStream
都在IO包下 所有字节输出最顶层的父类 它是一个抽象类.abstract修饰的 一般这种类定义的都是所有字节流都可以使用公共的方法,
随机推荐
- 远程调用NFS超时,服务卡死
远程调用NFS超时,服务卡死 如何查看进程中使用了哪些文件句柄?
- 利用公网Msf+MS17010跨网段攻击内网
其实很多小白在对利用msf进行ms17010攻击的时候总是不成功,其实这都是因为网上大部分的文章都是写的内网对内网(192.168.1.2-->192.168.1.3)这样的案例,今天写了一下利 ...
- NO Oracle database,JUST USE Oracle client。远程导入导出dmp
序言: 你会发现,exp.exe 和imp.exe均存在于Oracle数据库的安装bin目录下.而很多情况下,我们不想安装庞大的Oracle数据库,但想使用imp和exp等工具命令,在我们本地机对Or ...
- Java 中 interrupted 和 isInterrupted 方法的区别?
interrupt interrupt 方法用于中断线程.调用该方法的线程的状态为将被置为"中断"状态. 注意:线程中断仅仅是置线程的中断状态位,不会停止线程.需要用户自己去监 视 ...
- Java 中的同步集合与并发集合有什么区别?
同步集合与并发集合都为多线程和并发提供了合适的线程安全的集合,不过并发 集合的可扩展性更高.在 Java1.5 之前程序员们只有同步集合来用且在多线程并发 的时候会导致争用,阻碍了系统的扩展性.Jav ...
- SpringDataJdbc多数据源
代码基于 SpringBoot + SpringDataJDBC + Mybatis 架构 介绍使用多数据源的关键的一些类:AbstractRoutingDataSource继承实现determine ...
- Zookeeper Watcher 机制 -- 数据变更通知 ?
Zookeeper 允许客户端向服务端的某个 Znode 注册一个 Watcher 监听,当服务 端的一些指定事件触发了这个 Watcher,服务端会向指定客户端发送一个事件通 知来实现分布式的通知功 ...
- Zookeeper 的 java 客户端都有哪些?
java 客户端:zk 自带的 zkclient 及 Apache 开源的 Curator.
- RabbitMQ踩坑记
之前我们给我们的系统加了一个使用SpringAOP+RabbitMQ+WebSocket进行实时消息通知功能(https://www.cnblogs.com/little-sheep/p/993488 ...
- .NET Core Ecosystem
.NET .NET Blog Application Models Web Mobile Desktop Microservices Gaming Machine Learning Cloud Int ...