输出流:将内存中的数据输出到硬盘中,即写入
输入流:将硬盘中的数据输入到内存中,即读取
字节输入流
package com.字节流;
import org.testng.annotations.Test;
import java.io.*;
/*
输出流:将内存中的数据输出到硬盘中,即写入
输入流:将硬盘中的数据输入到内存中,即读取
*/
public class 字节输入流 {
@Test
public void 单字节读取() throws IOException {
//源文件:哇ABC
FileInputStream fis = new FileInputStream(new File("E:\\excel\\t3.txt"));
int len = fis.read();//读取文件一个字节,读到文件末尾返回-1
System.out.println(len);//第一个字节
len = fis.read();//第二个字节
System.out.println(len);
len = fis.read();//第三个字节
System.out.println(len);
//UTF-8一个汉字3给字节
//JBK一个汉字2个字节
len = fis.read();//第四个字节
System.out.println(len);
len = fis.read();//第五个字节
System.out.println(len);
len = fis.read();//第六个字节
System.out.println(len);
len = fis.read();//第七个字节 -1
System.out.println(len);
len = fis.read();//第8个字节 -1
System.out.println(len);
fis.close();
}
//优化读取,循环读取
@Test
public void 循环读取() throws IOException {
FileInputStream fis = new FileInputStream(new File("E:\\excel\\t3.txt"));
int len = 0;//读到文件末尾返回-1
//将fis.read()看作一个循环
while ((len = fis.read()) != -1){
char len1 = (char) len;
System.out.print(len1);
}
//该方法读取汉字出现乱码
fis.close();
}
/*
数组长度定义1024(1KB)或者1024的整数倍
*/
@Test
public void 数组读取() throws IOException {
FileInputStream fis = new FileInputStream(new File("E:\\excel\\t3.txt"));
//读到文件末尾返回-1
//先定义一个数组
byte[] a = new byte[1024];
//记录有效字节个数
int len = 0;
while ((len = fis.read(a)) != -1){
//读取的是整个1024长度数组,需要优化
//String s = new String(a);
System.out.println(new String(a));
}
//该方法读取的长度太长
fis.close();
}
@Test
public void 优化数组有效读取() throws IOException {
FileInputStream fis = new FileInputStream(new File("E:\\excel\\t3.txt"));
//读到文件末尾返回-1
//先定义一个数组
byte[] a = new byte[1024];
//记录有效字节个数
int len = 0;
while ((len = fis.read(a)) != -1){
//读取的是整个1024长度数组,需要优化,从0索引开始,有效个数是len,即读取的长度
System.out.println(new String(a,0,len));
}
fis.close();
}
@Test
public void 文件复制() throws IOException {
//将源文件读取出来,写入新文件
//定义两个字节流
FileInputStream fis = new FileInputStream(new File("E:\\excel\\t2.txt"));
FileOutputStream fos = new FileOutputStream(new File("E:\\excel\\复制后的文件.txt"));
//先读,后写
byte[] bytes = new byte[1024];
int len= 0;
String 复制文件内容 = null;
while ((len = fis.read(bytes)) != -1){
复制文件内容 = new String(bytes, 0, len);
}
//输出,写入目标文件 复制后的文件.txt
fos.write(复制文件内容.getBytes());
//写完了,那肯定读完了
fos.close();
fis.close();
}
@Test
public void 视频复制() throws IOException {
//原理和复制文件一样
//字节流可以复制图片、txt、word、视频、音乐等文件
long time1 = System.currentTimeMillis();
FileInputStream fis = new FileInputStream(new File("E:\\音频\\第一章 测试基础\\什么是测试01.mp4"));
FileOutputStream fos = new FileOutputStream(new File("E:\\excel\\视频.mp4"));
byte[] bytes = new byte[1024*3];
int len= 0;
while ((len = fis.read(bytes)) != -1){
fos.write(bytes,0,len);
}
fos.close();
fis.close();
long time2 = System.currentTimeMillis();
System.out.println("复制视频所用时间:"+ (time2-time1) + "毫秒");//byte[1024] 982毫秒 byte[1024*3]是否更快,花费469毫秒
}
}
输出字节流
package com.字节流;
import org.testng.annotations.Test;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
/*
输出流:将内存中的数据输出到硬盘中,即写入
输出流:将硬盘中的数据输入到内存中,即读取
*/
public class 输出字节流 {
public static void main(String[] args) throws IOException {
//创建一个输入流
FileOutputStream fos = new FileOutputStream(new File("E:\\excel\\t2.txt"));
//输入数组
fos.write(new byte[]{65,66,67,68});
//输入数组的一部分,索引位置和输入长度
fos.write(new byte[]{65,66,67,68},1,2);
//输入字符串
//utf-8三个字节是一个中文;jdk中两个字节是一个中文
fos.write("你好,李焕英".getBytes());
fos.close();
}
@Test
public void 追加写() throws IOException {
/*
追加写,把开关append打开true
如果是false是重新创建文件,覆盖源文件(默认是false)
*/
FileOutputStream fos = new FileOutputStream(new File("E:\\excel\\t2.txt"),true);
fos.write("!我可以请你吃饭吗?".getBytes());
fos.close();
}
@Test
public void 追加换行写() throws IOException {
/*
追加写,把开关append打开true
如果是false是重新创建文件,覆盖源文件(默认是false)
*/
FileOutputStream fos = new FileOutputStream(new File("E:\\excel\\t2.txt"),true);
fos.write("\n今天有点开心,捡到100块钱,哈哈哈~".getBytes());
fos.close();
}
}