Java基础22–用文件字节流读写文件:FileInputStream和FileOutputStream
InputStream:
(1)int read() :一次读取一个字节,返回本次读取的字节的值
(2)int read(byte[] b) :一次读取多个字节,返回本次实际读取字节数,读取的字节存到b数组中,从[0]开始存储,一次最多读取b.length个字节
(3)int read(byte[] b, int off, int len) :一次读取多个字节,返回本次实际读取字节数,读取的字节存到b数组中,从[off]开始存储,一次最多读取len个字节
(4)close()
如果到达流末尾,返回-1
三、使用字节流,来读取纯文本文件
步骤:
(1)选择IO流
(2)读/写
(3)关闭
处理文本文件:
public class Test06FileInputStream {
public static void main(String[] args) throws IOException {
//(1)选择IO流
//这里故意选取字节流,因为字节流可以用于处理所有类型的问题
FileInputStream fis = new FileInputStream("1.txt");
//(2)读
byte[] arr = new byte[10];
int len;
while((len = fis.read(arr)) != -1){
// System.out.println(Arrays.toString(arr));//最后有重复的元素
//字节数组-->字符串 new String(byte[],off,len)
System.out.println(new String(arr,0,len));//可能乱码
//乱码的原因:本次读了10个字节,就用10个字节去组成字符串显示了,出现缺字节
}
// (3)关闭
fis.close();
}
}
处理非文本文件
例如图片
public class Test07FileInputStream {
public static void main(String[] args) throws IOException {
//(1)选择IO流
//这里故意选取字节流,因为字节流可以用于处理所有类型的问题
FileInputStream fis = new FileInputStream("单身狗.jpg");
//(2)读
byte[] arr = new byte[10];
int len;
while((len = fis.read(arr)) != -1){
// System.out.println(Arrays.toString(arr));
//字节数组-->字符串 new String(byte[],off,len)
System.out.println(new String(arr,0,len));//乱码,因为图片无法在控制台显示,一次读的字节不完整
}
// (3)关闭
fis.close();
}
}
以上路径都是相对项目的
任意类型的文件的复制功能
OutputStream:
(1)void write(int b) :写一个字节
(2)void write(byte[] b) :写一个字节数组的所有
(3)void write(byte[] b, int off, int len) :写一个字节数组的部分
(4) void close()
(5)void flush()
public class TestCopy {
@Test
public void test02() throws IOException{
copy("单身狗.jpg", "2.jpg");//可以,不乱码
}
@Test
public void test01() throws IOException{
copy("1.txt", "3.txt");//可以,不乱码
/*
* 这里没有乱码,把1.txt的所有字节,全部复制到3.txt中,然后一起显示,没有缺字节
* 而且1.txt和3.txt的编码是一致的
* 而之前案例乱码原因是:一次读了几个字节,就用那几个字节去组成字符串显示了,出现缺字节,字节不完整
*/
}
//复制任意类型的文件的功能
//任意类型的文件,只能选择字节流
public void copy(String srcFilename , String destFilename) throws IOException{
FileInputStream fis = new FileInputStream(srcFilename);
FileOutputStream fos = new FileOutputStream(destFilename);
byte[] arr = new byte[10];
int len;
//数据: srcFilename --> fis --> arr --> fos --> destFilename
while((len = fis.read(arr)) !=-1){
fos.write(arr, 0, len);
}
fis.close();
fos.close();
}
}