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. linux系统:共享库问题之如version `ZLIB_1.2.9‘ not found

    1. 错误提示: Gtk-WARNING **: Error loading image 'file:///usr/share/themes/Ambiance/gtk-3.0/assets/butto ...

  2. db2入门必看命令清单--日常运维必需

    关注 推荐 嘉兴 视频 财经 科技 热点 国际 更多   搜索 34 消息 发布     5   2   收藏 分享 db2入门必看命令清单--日常运维必需 https://www.toutiao.c ...

  3. Chrome 中的 JavaScript 断点设置和调试技巧--转自hanguokai.com

    你是怎么调试 JavaScript 程序的?最原始的方法是用 alert() 在页面上打印内容,稍微改进一点的方法是用 console.log() 在 JavaScript 控制台上输出内容.嗯~,用 ...

  4. Java 03-基础 堆和栈(另,理解Java内存)

    概述: 栈区(STACK)堆区(HEAP) 1.栈中主要存放一些基本类型的变量,且每一个基本数据类型有固定的大小(byte,short,int,long,float,double,boolean,ch ...

  5. 常见的SPA首屏优化方式

    核心是加载和解析的性能优化 加载优化的核心是资源体积和首屏资源数量. 解析优化的核心是资源体积和代码的执行性能. 加载优化 通过webpack 的code splitting合理分包:   Code ...

  6. 关闭Windows form窗体

    原文https://www.cnblogs.com/HappyEDay/p/5713707.html  在c#中退出WinForm程序包括有很多方法 this.Close(); Application ...

  7. 1.win10安装centos虚拟机并设置允许远程

    一.下载并安装 打开如下连接,下载VMware和CentOS7镜像安装好虚拟机 http://t.zoukankan.com/onlymate-p-9837651.html这个链接的镜像是7.0的,我 ...

  8. 项目启动报错:关于modals以及node版本相关

    programme1: 1.代码用master分支的. 2. 删除node_module ,  yarn lock 文件,package-lock文件. 3. 用 npm install 或者 yar ...

  9. 【C学习随笔】day1-4 写一篇博客

    1>写一个自我介绍 大家好 我是一名普普通通的单片机CODER,懒懒散散的度过了四年大学时光,等到工作时才发现自己缺失了很多的技术.打算在一年内恶补大学时的知识,争取早日成为一名合格的码农.2& ...

  10. [node]把静态html挂到node接口下

    主要适用于同网段下不同设备查看同一html. 来自知乎. 需要先安装一个node,安装过程不表. 新建文件:nodeServer.js var express = require('express') ...