Java

I/O流

按流的方向分

输入输出流

  • I表示intput(输入),是数据从硬盘文件读入到内存的过程,称之输入,负责读。
  • O表示output(输出),是内存程序的数据从内存到写出硬盘文件的过程,称之输出,负责写。

按流中的数据最小单位分

  • 字节流

    • 操作所有类型的文件
    • InputStream 字节输入流
      • 实现类 FileInputStream
    • OutputStream 字节输出流
      • 实现类 FileOutputStream
  • 字符流
    • Reader 字符输入流

      • 实现类 FileReader
    • Writer 字符输出流
      • 实现类 FileWriter
    • 只能操作纯文本文件
文件字节输入流 FileInputStream
  • 作用:以内存为基准,把磁盘文件中的数据以字节的形式读取到内存中去。
构造器 说明
public FileInputStream(File file) 创建字节输入流管道与源文件对象接通
public FileInputStream(String pathname) 创建字节输入流管道与源文件路径接通
方法名称 说明
public int read() 每次读取一个字节返回,如果字节已经没有可读的返回-1
public int read(byte[] buffer) 每次读取一个字节数组返回,如果字节已经没有可读的返回-1

测试数据

  • ab312
package com.yu.Day1005Demo;

import java.io.FileInputStream;
import java.io.InputStream; public class FileInputStreamDemo02 {
public static void main(String[] args) throws Exception{
InputStream in = new FileInputStream("src//data.txt");
//定义一个字节数组,用于读取字节数组
byte[] buffer = new byte[3];
int len = in.read(buffer);
System.out.println(len);
String rs = new String(buffer);
System.out.println(rs);
//当提取出的数据小于桶内数据时,只能替换前面的数据后面数据将保存
//这时需要根据提取出的数据长度来限制需要输出的数据长度
int len1 = in.read(buffer);
System.out.println(len1);
String rs1 = new String(buffer,0,len1);
System.out.println(rs1); }
}

输出结果

3
ab3
2
12
当遇见中文字符时可能会遇见乱码

解决方法

  • 方法1:自己定义一个字节数组与文件的大小一样大,然后使用读取字节数组的方法,一次性读取完成
方法名称 说明
public int read(byte[] buffer) 每次读取一个字节数组返回,如果字节已经没有可读的返回-1
  • 方法2:官方字节输入流InputStream提供了如下API可以直接把文件的全部数据读取到一个字节数组中
方法名称 说明
public byte[] readAllBytes() throws IOException 直接将当前字节输入流对应的文件对象的字节数据装到一个字节数组返回
文件字节输出流(FileOutputStream)
创建文件字节输出流
构造器 说明
public FileOutputStream(File file) 创建字节输出流管道与源文件对象接通
public FileOutputStream(file file,boolean append) 创建字节输出流管道与源文件对象接通,可追加数据
public FileOutputStream(String filepath) 创建字节输出流管道与源文件路径相通
public FileOutputStream(String filepath,boolean append) 创建字节输出流管道与源文件路径相通,可追加数据
写数据出去API
方法名称 说明
public void write (int a) 写一个字节出去
public void write(byte[] buffer) 写一个字节数组出去
public void write(byte[] buffer ,int pos,int len) 写一个字节数组的一部分出去
流的关闭与刷新
方法 说明
flush() 刷新流,还可以继续写数据
close() 关闭流,释放资源,但是在关闭之前会刷新流,一旦关闭,就不能再写数据
字节流实际应用——文件拷贝
package com.yu.Day1005Demo;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream; public class ziyuankaobei {
public static void main(String[] args) throws Exception{
//建立需要拷贝的文件
InputStream in = new FileInputStream("D:\\英雄时刻\\javaWeb1班\\movie\\1012下午.mp4");
//创建需要接收文件
OutputStream out = new FileOutputStream("F:\\daoluan\\new.avi");
//使用字节流方法拷贝
byte[] buffer = new byte[1024];
int len;
while((len=in.read(buffer)) != -1){
out.write(buffer,0,len);
}
out.flush();
out.close();
in.close();
System.out.println("拷贝完成!!!"); }
}
相关问题
  1. 字节流适合做一切文件数据拷贝吗

​ 任何文件的底层都是字节,拷贝是一字不漏的欢迎字节,只要前后文件格式编码一致没有任何问题

try-cath-finally

  • finally: 在异常处理提供finally块来执行所有清除操作,比如说IO流的释放资源

  • 特点:被finally控制的语句最终一定会执行,处分JVM退出

  • 异常处理标准格式:try...catch...finally

  • try-catch-finally格式

  • package com.yu.Day1005Demo;
    
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.InputStream; public class FileInputStreamDemo03 {
    public static void main(String[] args) {
    InputStream in = null;
    try {
    in = new FileInputStream("src\\data.txt");
    try {
    System.out.println(in.read());
    } catch (IOException e) {
    e.printStackTrace();
    }
    } catch (FileNotFoundException e) {
    e.printStackTrace();
    }finally {
    try {
    in.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    } }
    }
  • 作用

    • finally代码块是最终一定执行的,可以在代码执行完毕的最后用于释放资源

文件字符输入流(FileReader)

每次读取一个字符的API

方法名称 说明
public int read() 每次读取一个字符返回,如果字节已经没有可读的返回-1
  • 字符流好处,每次读取一个字符存在的问题

    • 读取中文字符不会出现乱码(如果代码和文件编码一致)
    • 性能较慢

每次读取多个字符的API

方法名称 说明
public int read(char[] buffer) 每次读取一个字符数组,返回读取的字符数,如果字节已经没有可读的返回-1
  • 每次读取一个字符数组的优势

    • 读取的性能得到了提升

1.字符输出流写数据的方法

方法名称 说明
void write(int c) 写一个字符
void write(char[] cbuf) 写入一个字符数组
void write(char[] cbuf,int off,int len) 写入字符数组的一部分
void write(String str) 写一个字符串
void write(String str,int off,int len) 写一个字符串的一部分

2.字符输出流如何实现按数据追加

方法名称 说明
public FileWriter(String filepath,boolean append) 创建字符输出流管道与源文件路径接通,可追加数据

3.字符输出流如何实现写出去的数据能换行

  • fw.write("\r\n");

4.字符输出流写完数据后必须做什么?

  • flush()刷新数据
  • close()方法是关闭流,关闭包含刷新,关闭后流不可以继续使用了

heiamJava16IO流的更多相关文章

  1. 使用C#处理基于比特流的数据

    使用C#处理基于比特流的数据 0x00 起因 最近需要处理一些基于比特流的数据,计算机处理数据一般都是以byte(8bit)为单位的,使用BinaryReader读取的数据也是如此,即使读取bool型 ...

  2. HTML 事件(三) 事件流与事件委托

    本篇主要介绍HTML DOM中的事件流和事件委托. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三) 事件流与事件委托 4 ...

  3. FILE文件流的中fopen、fread、fseek、fclose的使用

    FILE文件流用于对文件的快速操作,主要的操作函数有fopen.fseek.fread.fclose,在对文件结构比较清楚时使用这几个函数会比较快捷的得到文件中具体位置的数据,提取对我们有用的信息,满 ...

  4. java.IO输入输出流:过滤流:buffer流和data流

    java.io使用了适配器模式装饰模式等设计模式来解决字符流的套接和输入输出问题. 字节流只能一次处理一个字节,为了更方便的操作数据,便加入了套接流. 问题引入:缓冲流为什么比普通的文件字节流效率高? ...

  5. java 字节流与字符流的区别

    字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢?实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作 ...

  6. BZOJ 3504: [Cqoi2014]危桥 [最大流]

    3504: [Cqoi2014]危桥 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 1407  Solved: 703[Submit][Status] ...

  7. java I/O流

    输入流(读取数据的流) BufferedInputStream---继承--->FileInputStream--继承--->InputStream------> (1)字节流操作中 ...

  8. Ford-Fulkerson 最大流算法

    流网络(Flow Networks)指的是一个有向图 G = (V, E),其中每条边 (u, v) ∈ E 均有一非负容量 c(u, v) ≥ 0.如果 (u, v) ∉ E 则可以规定 c(u, ...

  9. .NET基础拾遗(3)字符串、集合和流

    Index: (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开发基础 ...

  10. C#开源实现MJPEG流传输

    本文为 Dennis Gao 原创技术文章,发表于博客园博客,未经作者本人允许禁止任何形式的转载. 许久以前写了篇文章<基于.NET打造IP智能网络视频监控系统>,记录和介绍了自己几年来积 ...

随机推荐

  1. jmeter分布式压测配置

    首选 压力机A,压力机B,压力机C,   压力机A作为控制台    压力机B,压力机C作为分布式的测试机 压力机Aip:172.16.23.69, 压力机Bip:192.168.184.128 压力机 ...

  2. pySpark RDD基本用法

    pySpark RDD基本用法 RDD的全称是:Resilient Distributed Dataset (弹性分布式数据集),它有几个关键的特性: RDD是只读的,表示它的不可变性. 可以并行的操 ...

  3. npm 使用阿里源

    npm config set registry https://registry.npm.taobao.org/ npm config get registry 安装vue-cli 报错 npm in ...

  4. pdf2docx:可将 PDF 转换成 docx 文件的 Python 库

    pdf2docx:https://github.com/dothinking/pdf2docx 可将 PDF 转换成 docx 文件的 Python 库. from pdf2docx import p ...

  5. spring boot整合druid

    其实网上有很多例子可供参考,主要是在整合的过程中遇到了一些问题,方便记录下.另外例子可参考以下两个链接: https://www.jianshu.com/p/e3cd2e1c2b0c https:// ...

  6. zabbix(历史数据保留时长和趋势存储时间的区别)

    zabbix(历史数据保留时长和趋势存储时间的区别)? zabbix(历史数据保留时长和趋势存储时间分别影响着哪里)? 001.影响grafana 数据展示的是历史数据还是趋势数据? 等把<历史 ...

  7. js中构造函数中this指向问题

    构造函数构造函数中的this指向new创建的新对象function FOO(name) {this.name = name;console.log(this) // Foo {name: " ...

  8. Word09 会计电算化节节高升office真题

    1.课程的讲解之前,先来对题目进行分析,首先需要在考生文件夹下,将Wrod素材.docx文件另存为Word.docx,后续操作均基于此文件,否则不得分. 2.这一步非常的简单,打开下载素材文件,在[文 ...

  9. 【C学习笔记】【分享】day2-2 不允许创建临时变量,交换两个数的内容(附加题)

    加法实现: #include <stdio.h> int main() { int a = 30; int b = 20; a = a + b; b = a - b; a = a - b; ...

  10. echarts 容器宽度设置百分比,但是图表缩成一团

    如图 明明设置了充满整个div,然后发现都缩成了一团,后来发现echarts不能和display:none;属性一起用 解决方法: 把v-show改成v-if就可以了充满容器了...