字节流
概念:以字节byte为单位读取和写出数据,(记事本打开,我们不能读懂内容的就是字节) 可以用于读取二进制文件及任何类型文件
使用场景:适用于所有非文本相关的文件读取和写出
字节流XMind图总结:
文件字节输入流FileInputStream用法举例
1,int read():一次读取一个字符案例
package cn.meitua.fileinputstream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
/**
* InputStream抽线父类
* 常用子类FileInputStream
* 字节输入流
*/
public class FileInputStreamTest {
public static void main(String[] args) throws Exception {
//创建一个File对象
File file = new File("D:\\Eclipse\\meitua\\fileinputstream01.java");
//创建一个子类对象
FileInputStream f = new FileInputStream(file);
//int read() 从该输入流读取一个字节的数据 ,这里获取的是一个int类型的ASCII码表,读到-1就执行结束
/*int read = f.read(); //读取的是一个ASCII码的值112
System.out.println(read);//
System.out.println((char)read);//需要转成char字符类型*/
int date;
//判断当都取到-1的时候就结束执行,
while ((date=f.read())!=-1) {//将f.read()读取的值赋值给date,保证读取一次就打印一次。
System.out.print((char)date);//打印int类型的 date,将ASCII码强转成char字符
//不能打印字符(字符乱码)是因为一个字符对应多个字节
}
//释放资源
f.close();
}
}
2,int read(byte[] buff, int index , int len):一次读取一个数组(这里就不写没有指定下标和长度的案例了因为局限性比较大,例如你要读取12345,每次读取的数组长度为3,就会出现123 453这种情况,因为底层原理读取的时候是进行覆盖的)
package cn.meitua.fileinputstream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; /** * InputStream 字节输入流 * * */ public class FileInputStreamByteArr { public static void main(String[] args) throws Exception { //创建一个File对象 File file = new File("D:\\Eclipse\\meitua\\fileinputstream01.java"); //创建一个字节数组 byte[] bys = new byte[3]; //创建一个子类对象 FileInputStream f = new FileInputStream(file); //int read(byte[] bys) 这里表示一次读取3个字节数组 ,读到-1就执行结束 int read = f.read(bys); //读取的是一个ASCII码的值112 System.out.println(read);// 这里读取的数据返回值是读取的长度为多少,而不是数据 System.out.println((char)read);// 需要转成char字符类型 //int date; //f.read(bys) 这里读取的数据返回值是读取的长度为多少,而不是数据,如果读不到数据就会返回-1 int date; while (( date = f.read(bys))!=-1) { //int read(byte[] b, int off, int len) 从该输入流读取最多 len字节的数据为字节数组。 //while (( date = f.read(bys,1,2))!=-1) {//当一次性读取3个字节时,当都不到字节数时就直接返回-1,长度也就变成了-1 //new String(bys) 构造方法,将byte数组转换成String类型 //System.out.println(new String(bys));//这里会进行覆盖会输出 eg总共只有1234 输出则为123 423 //为了避免出现423 我现在只要4 System.out.println(new String(bys,0,date));// 表示从那个数组获取数据,开始下标,获取的数组数组长度 } //释放资源 f.close(); } }
文件字节输入流FileOutputStream用法举例
1.void write(int ascii码):一次写出1个字节
package cn.meitua.fileoutputstream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
/**
* 字节输出流 写数据
*
*
*/
public class FileOutputStreamTest {
public static void main(String[] args) throws Exception {
//创建一个字节输出流进行写数据
//FileOutputStream out = new FileOutputStream("D:\\Eclipse\\meitua\\fileoutputstream01.java");//默认后面是false,会进行覆盖操作
FileOutputStream out = new FileOutputStream("D:\\Eclipse\\meitua\\fileoutputstream01.java",true);//是true,会进行追加写入
//调用方法进行写数据
out.write(65);
out.write(66);
out.write(66);
//释放资源
out.close();
}
}
2,void write(byte[] buff):一次写出多个字节
public class FileOutputStreamByteArr {
public static void main(String[] args) throws Exception {
//创建一个字节输出流进行 写数据
//FileOutputStream out = new FileOutputStream("D:\\Eclipse\\meitua\\fileoutputstream01.java");//默认后面是false,会进行覆盖操作
FileOutputStream out = new FileOutputStream("D:\\Eclipse\\meitua\\fileoutputstream01.java",true);//是true,会进行追加写入
//创建一个字节数组,表示每次写的数据
byte[] bys = {66,65,67,69};
//调用方法进行写数据
out.write(bys);
//输出字符串类型
String s = "你好世界";
byte[] bytes = s.getBytes();// 需要将字符串转换成byte数组
out.write(bytes);// 调用write方法写入指定的数组
//释放资源
out.close();
}
}
综合文件字节输入流和文件字节输出流给出一个案例,实现对文件数据的读取和写入
综合案例;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
/**
* 读取一个文件将文件写入到新文件
* 数据只能写在文件里面,不能写在文件名(目录)里面
*
* @author Mixi
*
*/
public class FileOutputStreamCoTest {
public static void main(String[] args) throws Exception {
// 创建一个文件字节输入流(读数据)
FileInputStream in = new FileInputStream("D:\\Eclipse\\meitua\\fileoutputstream01.java"\\代码.png");
// 创建一个文件字节输出流
FileOutputStream out = new FileOutputStream(""D:\\Eclipse\\meitua\\fileoutputstream01.java"\\测试代码是否成功.png");
// 创建一个字节数组表示每次读取的长度
byte[] bys = new byte[1024];
// 定义一个变量进行接收每次读取的个数(每次读取一个数组)
int date;
// 对文件字节输出流的文件进行读取,如果等于-1读取结束
while ((date = in.read(bys)) != -1) {// date = in.read(bys) 接收每次读取的长度,但是内容还是在数组里面,将来写入数据还是写的数据
// 写数据
//out.write(bys); // 这里如果不进行限制将会后面进行覆盖eg;1234 每次读取三个 这个会输出 123 423下面改进
out.write(bys, 0, date); // 表示指定要写入的数组,开始下标和写入的长度 会输出 123 4
}
// 释放资源 不释放资源的话资源就一直被占用。
in.close();
out.close();
}
}