heiamJava16IO流
Java
I/O流
按流的方向分
输入输出流
- I表示intput(输入),是数据从硬盘文件读入到内存的过程,称之输入,负责读。
- O表示output(输出),是内存程序的数据从内存到写出硬盘文件的过程,称之输出,负责写。
按流中的数据最小单位分
- 字节流
- 操作所有类型的文件
- InputStream 字节输入流
- 实现类 FileInputStream
- OutputStream 字节输出流
- 实现类 FileOutputStream
- 字符流
- Reader 字符输入流
- 实现类 FileReader
- Writer 字符输出流
- 实现类 FileWriter
- 只能操作纯文本文件
- Reader 字符输入流
文件字节输入流 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("拷贝完成!!!");
}
}
相关问题
- 字节流适合做一切文件数据拷贝吗
任何文件的底层都是字节,拷贝是一字不漏的欢迎字节,只要前后文件格式编码一致没有任何问题
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流的更多相关文章
- 使用C#处理基于比特流的数据
使用C#处理基于比特流的数据 0x00 起因 最近需要处理一些基于比特流的数据,计算机处理数据一般都是以byte(8bit)为单位的,使用BinaryReader读取的数据也是如此,即使读取bool型 ...
- HTML 事件(三) 事件流与事件委托
本篇主要介绍HTML DOM中的事件流和事件委托. 其他事件文章 1. HTML 事件(一) 事件的介绍 2. HTML 事件(二) 事件的注册与注销 3. HTML 事件(三) 事件流与事件委托 4 ...
- FILE文件流的中fopen、fread、fseek、fclose的使用
FILE文件流用于对文件的快速操作,主要的操作函数有fopen.fseek.fread.fclose,在对文件结构比较清楚时使用这几个函数会比较快捷的得到文件中具体位置的数据,提取对我们有用的信息,满 ...
- java.IO输入输出流:过滤流:buffer流和data流
java.io使用了适配器模式装饰模式等设计模式来解决字符流的套接和输入输出问题. 字节流只能一次处理一个字节,为了更方便的操作数据,便加入了套接流. 问题引入:缓冲流为什么比普通的文件字节流效率高? ...
- java 字节流与字符流的区别
字节流与和字符流的使用非常相似,两者除了操作代码上的不同之外,是否还有其他的不同呢?实际上字节流在操作时本身不会用到缓冲区(内存),是文件本身直接操作的,而字符流在操作时使用了缓冲区,通过缓冲区再操作 ...
- BZOJ 3504: [Cqoi2014]危桥 [最大流]
3504: [Cqoi2014]危桥 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 1407 Solved: 703[Submit][Status] ...
- java I/O流
输入流(读取数据的流) BufferedInputStream---继承--->FileInputStream--继承--->InputStream------> (1)字节流操作中 ...
- Ford-Fulkerson 最大流算法
流网络(Flow Networks)指的是一个有向图 G = (V, E),其中每条边 (u, v) ∈ E 均有一非负容量 c(u, v) ≥ 0.如果 (u, v) ∉ E 则可以规定 c(u, ...
- .NET基础拾遗(3)字符串、集合和流
Index: (1)类型语法.内存管理和垃圾回收基础 (2)面向对象的实现和异常的处理 (3)字符串.集合与流 (4)委托.事件.反射与特性 (5)多线程开发基础 (6)ADO.NET与数据库开发基础 ...
- C#开源实现MJPEG流传输
本文为 Dennis Gao 原创技术文章,发表于博客园博客,未经作者本人允许禁止任何形式的转载. 许久以前写了篇文章<基于.NET打造IP智能网络视频监控系统>,记录和介绍了自己几年来积 ...
随机推荐
- js扩展符号
扩展数组:const arr23 = ['a', 'b', 'c']; console.log(...arr23); a b c扩展字符串: abc = 'abcdefghi'; console.lo ...
- 1.java 开始
WelloWorld 随便新建一个文件夹,存放代码 新建一个java文件 编写代码 编译javac java文件,生成一个class文件 运行class文件,java class 可能遇到的情况 每个 ...
- mongodb对Obeject对象进行增删改操作
1.插入某个对象,如User对象 mongoTemplate.insert(user, "users");//第一个参数是实体类对象User, 第二个参数是mongodb对应的集合 ...
- MySQL之校对集问题
随笔记录方便自己和同路人查阅. #------------------------------------------------我是可耻的分割线--------------------------- ...
- password_encryption_type 和 pg_hba.conf 不匹配导致用户连不上
# 问题概述xxx客户新上一套opengauss数据库,在测试中用户输入正确的密码,提示用户密码错误,导致用户被锁# 问题原因password_encryption_type 和 pg_hba.con ...
- [ARC140D] One to One
个人思路: 一棵树也只有一个 \(a=-1\) 的点,所以可以把它看做一个点,但是要记录点的大小 \(sz_i\),即为这棵树的大小.如果本来就是一个点,那么大小为 \(1\). 状态:\(dp_{i ...
- 高精度计算_vector
#include<bits/stdc++.h> using namespace std; // return a+b; vector<int> add(vector<in ...
- Oracle ASM磁盘组的常用操作
1.查看现有磁盘组信息 select group_number gno,name,state,type,total_mb,free_mb,required_mirror_free_mb rmfmb,u ...
- Java基础——(综合练习)普通加密
package com.zhao.test; public class Test18 { /*需求: 某系统的数字密码(大于0),比如1983, 采用加密方式进行传输. 规则如下: 先得到每位 ...
- kali Linux--打开&关闭防火墙
1.安装ufw apt-get install ufw 2.关闭防火墙 ufw disable. 3.开启防火墙 ufw enable