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. (转载)Overlay网络

    1. Overlay 网络1.1 Overlay 技术概述    Overlay 在网络技术领域,指的是一种网络架构上叠加的虚拟化技术模式,其大体框架是对基础网络不进行大规模修改的条件下,实现应用在网 ...

  2. RPS网卡多队列

    一体机上传1G文件导致服务器很卡,怀疑是网卡未开启多核多队列导致. 脚本如下 #!/bin/bash # Enable RPS (Receive Packet Steering) read -p &q ...

  3. uniapp APP端 跳转微信小程序 完成微信支付功能,并回跳回来

    先保存   参考链接    完成功能在做具体记录 https://blog.csdn.net/qq_40146789/article/details/121262700?spm=1001.2101.3 ...

  4. allure安装成功后,执行未生成报告解决

    在搜索了很多方法尝试后,执行依然没有生成测试报告,在尝试在pycharm里面修改配置解决了: file>setting>tools>Python integrated tools&g ...

  5. Access-Control-Allow-Origin php跨域报错

    Access-Control-Allow-Origin php跨域 解决办法: 1.PHP中echo:header(""Access-Control-Allow-Origin: * ...

  6. mongoDB日常操作02

    db.TABLE_NAME.find({<query>})//普通查询db.TABLE_NAME.find({<query>},{'_id':0,'f1':1,'f2':1}) ...

  7. vue3 vite等笔记

    1.脚手架 vue-cli基于webpack封装,生态非常强大,可配置性也非常高,几乎能够满足前端工程化的所有要求.缺点就是配置复杂,甚至有公司有专门的webpack工程师专门做配置,另外就是webp ...

  8. 进程间通信测试-signal

    截图 代码 #include <stdio.h> #include <unistd.h> #include <signal.h> #include <stri ...

  9. iOS 12.3 - iOS 13.X 爱思助手越狱教程

    原文链接 本教程使用工具为爱思助手 Mac 版,Windows 电脑可以安装"黑苹果"系统后,在"黑苹果"系统内安装爱思助手再进行操作. 支持设备:iPhone ...

  10. pytorch学习笔记(9)--损失函数

    1.损失函数的作用: (1)计算实际输出和目标输出之间的差距: (2)为我们更新输出提供一定的依据(也就是反向传播) 官网链接:https://pytorch.org/docs/1.8.1/nn.ht ...