一、FileInputStream:从文件系统中的文件获取输入字节,读取诸如图像数据的原始字节流。
1.创建文件字节输入流对象的时候,可以用绝对路径的方式。
2.其中read()方法返回的是字节本身。例如文件中是字符a,那么程序中读到的就是97。
3.注意:读取数组的时候。read()读取到的是字节数量,最大为数组长度。如果一个字节也没有就返回-1.
实操:
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
public class A {
public static void main(String[] args) {
FileInputStream fis=null;
try {
fis=new FileInputStream("src/temp1");
byte[] a=new byte[4];
int datacount=0;
while((datacount=fis.read(a))!=-1)
{
System.out.print(new String(a,0,datacount));
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally{
if(fis!=null)
{
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
4.其他常用方法:
available():返回剩下多少个字节没有读。这个方法的作用就是在开始的时候获取文件中的字节数。这样可以不用循环,读一遍就可以了。但这种方法不适合大文件,因为byte数组不能太大
skip():跳过几个字节不读取
二、FileOutputStream:文件字节输出流,负责写。从内存到硬盘
1.如果文件不存在,会创建文件
2。如果在创建的时候,加上true就代表以追加的方式从文件末尾写入,不会清空文件内容。
3.如果要写出一个字符串的话,可以使用getBytes()方法把字符串转换成byte数组。
实操:
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.FileOutputStream;
public class A {
public static void main(String[] args) {
FileOutputStream fos=null;
try {
//如果文件不存在,会自动创建
fos=new FileOutputStream("D:/temp1",true);
byte[] a={97,98,99,100};
fos.write(a);//将a数组全部写出
fos.write(a,0,2);//将a数组部分写出,从0开始,写出2个
String s="哈哈哈哈";
//将字符串转换成byte数组
byte[] bs=s.getBytes();
fos.write(bs);
fos.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally {
if(fos!=null)
{
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
三、拷贝文件:采用边读边写,任何类型的文件都可以拷贝。
实操:
import java.io.*;
public class A {
public static void main(String[] args) {
FileInputStream pis=null;
FileOutputStream pos=null;
try {
pis=new FileInputStream("C:\\Users\\SHIJINTAO\\Pictures\\2021-08\\IMG_2368.JPG");
pos=new FileOutputStream("D:\\IMG_2368.JPG");
byte[] a=new byte[1024*1024];//一次最多拷贝1MB
int readcount=0;
while((readcount=pis.read(a))!=-1)
{
pos.write(a,0,readcount);//读了多少写多少
}
pos.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally
{
if(pos!=null) {
try {
pos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(pis!=null) {
try {
pis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
四、FileReader和FileWriter与上面两个基本上差不多。区别在于:
1.把byte[]数组改成了char[]数组
2.可以直接传入字符串
五、BufferedReader:带有缓冲区的字符输入流,使用这个流的时候不需要自定义char数组或者byte数组。它的构造方法中不是一个路径而是一个字符流。
1、当一个流的构造方法中需要一个流的时候,这个被传进来的流叫做:节点流
2.外部负责包装的这个流叫做:包装流/处理流。
3.对于包装流来说,只需要关闭最外层流就行,里面的节点流会自动关闭。
4.常用方法:readline():读取第一个文本行,但不带换行符。读取失败返回null
实操:
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.BufferedReader;
import java.io.IOException;
public class A {
public static void main(String[] args) throws IOException {
FileReader reader=new FileReader("D:/temp");//节点流
BufferedReader br=new BufferedReader(reader);//包装流
String s=null;
while((s=br.readLine())!=null)//直接读取一行
{
System.out.println(s);
}
br.close();//关闭包装流
}
}
六、InputStreamReader:将字节输入流转换成字符输入流
例如:BufferedReader中必须传入字符流,那我们可以先用FileInputStream创建字节流,然后用InpuerStreamReader将字节流转换成字符流,然后传入BufferedReader中。
实操:
七、OutputStreamwriter:带有缓冲的字符输出流。用法和转换与InputStreamReader差不多。
八、OutputStreamWriter:将字节输出流抓换成字符输出流
九、DataOutputStream:数据专属的字节输出流。它所写的文件不是普通文件,用记事本打开是乱码。它是将数据以及其类型一并写入到文件中。因此读入只能用DataInputStream。
十、DataInputStraem:数据专属字节输入流,读出的顺序必须和写入的顺序相同。
十一、 PrintStream:标准输出流
1.常用方法:setOut():默认方向是控制台,而此方法可以修改输出方向