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. SQL0818N/SQL0901N error when running db2advis

    Skip to content     Support     DownloadsDocumentationForumsCasesMonitoringManage support account   ...

  2. vs2019下 c++中 dll 的新建和引用步骤

    在工作目录下新建文件夹 DllImportTest  ,作为解决方案所在目录 新建项目动态链接库(DLL)项目 DllDemo 位置  指定到 上面新建文件夹 DllImportTest 所在的路径, ...

  3. Java实现发红包模拟

    1.先画界面 package com.cmk; import javax.swing.*; import java.awt.*; import java.awt.event.KeyAdapter; i ...

  4. C# winfrom 添加Log4Net日志库

    简介:log4net库是Apache log4j框架在Microsoft .NET平台的实现,是一个帮助程序员将日志信息输出到各种目标(控制台.文件.数据库等)的工具.当项目发布之后遇到一些问题,无法 ...

  5. 1255. 得分最高的单词集合 (Hard)

    问题描述 1255. 得分最高的单词集合 (Hard) 你将会得到一份单词表 words,一个字母表 letters (可能会有重复字母),以及每个字母对应的得分情况表 score. 请你帮忙计算玩家 ...

  6. 简单的python线程池实现线程安全demo

    from concurrent.futures import ThreadPoolExecutor import threading import time import sys sys.path.a ...

  7. springboot java redis 监听超时事件

    package ideal4j.pfa.config.redis; import cn.hutool.core.date.DateTime; import com.alibaba.fastjson.J ...

  8. Mysql学习:1、mysql安装及配置及连接Navicat

    1.下载地址: https://dev.mysql.com/downloads/windows/installer/8.0.html 2.安装流程: a.选自定义安装:custom. b. 在下一步的 ...

  9. bzoj 3924

    动态点分治好题 首先我们考虑一个暴力做法: 每次修改之后选一个点作为根搜索整棵树,然后换根dp即可 考虑每次换根时,移向的点的消耗会减少子树代价之和*边权,而其余部分代价会增加剩余代价*边权 这样每次 ...

  10. 标准c++中string类函数介绍

    之所以抛弃char*的字符串而选用C++标准程序库中的string类,是因为他和前者比较起来,不必担心内存是否足够.字符串长度等等,而且作为一个类出现,他集成的操作函数足以完成我们大多数情况下(甚至是 ...