IO字节输入流
java.io.InputStream 抽象类是表示字节输入流的所有类的超类,可以读取字节信息到内存中。它定义了字节输入流的基本共性功能方法。
public void close() :关闭此输入流并释放与此流相关联的任何系统资源。
public abstract int read() : 从输入流读取数据的下一个字节。
public int read(byte[] b) : 从输入流中读取一些字节数,并将它们存储到字节数组 b中 。
小贴士:
close方法,当完成流的操作时,必须调用此方法,释放系统资源。
2.5 FileInputStream类
java.io.FileInputStream 类是文件输入流,从文件中读取字节。
构造方法
FileInputStream(File file) : 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系
统中的 File对象 file命名。
FileInputStream(String name) : 通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件
系统中的路径名 name命名。
当你创建一个流对象时,必须传入一个文件路径。该路径下,如果没有该文件,会抛出 FileNotFoundException 。
构造举例,代码如下:
public class FileInputStreamConstructor throws IOException{
public static void main(String[] args) {
// 使用File对象创建流对象
File file = new File("a.txt");
FileInputStream fos = new FileInputStream(file);
// 使用文件名称创建流对象
FileInputStream fos = new FileInputStream("b.txt");
}
}
FileOutputStream读取一个字节
package com.itheima.demo02.InputStream;
import java.io.FileInputStream;
import java.io.IOException;
/*
java.io.InputStream 抽象类是表示字节输入流的所有类的超类
定义了所有子类共性的方法:
public void close() :关闭此输入流并释放与此流相关联的任何系统资源。
public abstract int read() : 从输入流读取数据的下一个字节。
public int read(byte[] b) : 从输入流中读取一些字节数,并将它们存储到字节数组 b中 。
long skip(long n) 跳过并从输入流中丢弃 n字节的数据。
java.io.FileInputStream extends InputStream
FileInputStream:文件字节输入流
作用:把硬盘文件中的数据读取到内存中使用
构造方法:
FileInputStream(File?file) :
FileInputStream(String?name) :
参数:
String name:文件的路径
File file:文件
构造方法的作用:
1.会创建一个FIleInputStream对象
2.会把FileInputStream对象指定构造方法中要读取的文件
读取数据的原理(硬盘-->内存):
java程序-->JVM-->OS-->OS读取数据的方法-->读取文件
字节输入流的使用步骤(重点):
1.创建FileInputStream对象,构造方法中绑定要读取的数据源
2.使用FileInputStream对象中的方法read,读取文件
3.释放资源
*/
public class Demo01InputStream {
public static void main(String[] args) throws IOException {
/*
从文件”file.dat”文件中读出第 10 个字节到变量 c 中
*/
FileInputStream in=new FileInputStream("file.dat");
in.skip(9);
int c=in.read();
//1.创建FileInputStream对象,构造方法中绑定要读取的数据源
FileInputStream fis = new FileInputStream("09_IOAndProperties\\c.txt");
//2.使用FileInputStream对象中的方法read,读取文件
//int read()读取文件中的一个字节并返回,读取到文件末尾返回-1
int len = 0;//记录读取到的字节
/*
布尔表达式(len=fis.read())!=-1
1.fis.read():读取到一个字节
2.len = fis.read():把字节赋值给变量len
3.(len=fis.read())!=-1:判断len是否不等于-1
*/
while ((len = fis.read()) != -1) {
System.out.println((char) len);
}
/*
指针不对
*/
while (fis.read() != -1) {
System.out.println(fis.read());
}
//3.释放资源
fis.close();
}
}
FileOutputStream读取多个字节
package com.itheima.demo02.InputStream;
import java.io.FileInputStream;
import java.io.IOException;
import java.util.Arrays;
/*
字节输入流一次读取多个字节的方法:
public int read(byte[] b) : 从输入流中读取一些字节数,并将它们存储到字节数组 b中 。
明确两件事:
1.方法的参数byte[]的作用
起到缓冲作用,存储每次读取到的多个字节
数组的长度定义为1024(1kb)或者1024的倍数
2.方法的返回值int是什么
每次读取的有效字节个数
String类的构造方法
String(byte[] bytes) 通过使用平台的默认字符集解码指定的字节数组来构造新的 String 。
String(byte[] bytes, int offset, int length) 构造一个新的String由指定用指定的字节的数组解码charset 。
*/
public class Demo02InputStream {
public static void main(String[] args) throws IOException {
//创建FileInputStream对象,构造方法中绑定要读取的数据源
FileInputStream fis = new FileInputStream("09_IOAndProperties\\b.txt");
//使用FileInputStream对象中的方法read读取文件
//int read(byte[] b)从输入流中读取一定数量的字节,并将其存储在缓冲区数组b中
/*
错误数据 4 ,是由于最后一次读取时,只读取一个字节 5 ,数组中,上次读取的数据没有被完全替换,所以要通过 len ,获取有效的字节,代码使用演示:
byte[]bytes = new byte[2];
int len = fis.read(bytes);
System.out.println(len);//2
System.out.println(Arrays.toString(bytes));//49 50
System.out.println(new String(bytes));//12
len = fis.read(bytes);
System.out.println(len);//2
System.out.println(Arrays.toString(bytes));//51 52
System.out.println(new String(bytes));//34
len = fis.read(bytes);
System.out.println(len);//1
System.out.println(Arrays.toString(bytes));//53 52
System.out.println(new String(bytes));//54
len = fis.read(bytes);
System.out.println(len);//-1
System.out.println(Arrays.toString(bytes));//49 50
System.out.println(new String(bytes));//54
*/
/*
代码重复,循环优化
*/
byte[] bytes = new byte[1024];
int len = 0;
//通过 len ,获取有效的字节
while ((len = fis.read(bytes)) != -1) {
System.out.println(new String(bytes, 0, len));
}
//释放资源
fis.close();
}
}
字节流练习:图片复制
package com.itheima.com.itheima.demo03.CopyFile;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
/*
文件复制练习:一读一写
明确:
数据源:c:\\1.jpg
目的地:d:\\1.jpg
文件复制的步骤:
1.创建一个字节输入流对象,构造方法中绑定要读取的数据源
2.创建一个字节输出流对象,构造方法中绑定要写入得目的
3.使用字节输入流对象中的方法read读取文件
4.使用字节输出流中的方法write,把读到的字节写入到目的地的文件中
5.释放资源
*/
public class Demo01CopyFile {
public static void main(String[] args) throws IOException {
long start = System.currentTimeMillis();
//1.创建一个字节输入流对象,构造方法中绑定要读取的数据源
FileInputStream fis = new FileInputStream("C:\\Users\\Ao\\Desktop\\day08【File类、递归】-笔记.pdf");
//2.创建一个字节输出流对象,构造方法中绑定要写入得目的
FileOutputStream fos = new FileOutputStream("D:\\day08【File类、递归】-笔记.pdf");
byte[] b = new byte[1024];
int len = 0;
//3.使用字节输入流对象中的方法read读取文件
while ((len = fis.read(b)) != -1) {
//4.使用字节输出流中的方法write,把读到的字节写入到目的地的文件中
fos.write(b, 0, len);
}
//5.释放资源(先关写的,后关读的,如果写完了,肯定读取完毕了
fos.close();
fis.close();
long end = System.currentTimeMillis();
System.out.println(end - start);//16
}
}
字节流中读取中文问题(使用字符流读取包含中文数据)
package com.itheima.com.itheima.Demo04.Reader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
/*
使用字节流读取中文文件
1个中文:
GBK:占用两个字节
UTF-8:占用3个字节
*/
public class Demo01InputStream {
public static void main(String[] args) throws IOException {
FileInputStream fis = new FileInputStream("09_IOAndProperties\\c.txt");//你好
int len = 0;
while ((len = fis.read()) != -1) {
System.out.println(len);
// 196
// 227
// 186
// 195
}
fis.close();
}
}