InputStram和OutputStream 输入字节流和输出字节流
在Java中,InputStream代表输入字节流,OuputStream代表输出字节流,这是最基本的两种IO流。
int read():会读取输入流的下一个字节,并返回字节表示的int值,如果已经读到末尾,返回-1表示不能在进行读写了。
FileInputStream:从文件流中读取数据,是InputStream的一个子类。
public void readFile()throws IOException{
//创建一个FileInputStream对象
InputStream input=new FileInputStream("src/test.txt");
for(;;){
int n=input.read();//反复调用read()方法,直到返回-1
if(n==-1){break}
}System.out.println(n);
}input.close();//关闭流
}
实际编码的时候要加上try语句,让编译器自动为我们关闭资源。
缓冲:在读取流的时候,一次读取一个字节并不是最高效的方法。很多流支持一次性读取多个字节到缓冲区,对于文件和网络流来说,利用缓冲区一次性读取多个字节效率往往要高很多。InputStream提供了两个重载方法来支持读取多个字节。
int read(byte[] b);读取若干个字节并填充到byte[]数组,返回读取的字节数。
int read(byte[] b,int off,int len);指定byte[]的数组最大偏移量和最大填充数。
利用上述方法一次读取多个字节时,需要先定义一个byte[]数组作为缓冲区,read()方法会尽可能多地读取字节到缓冲区, 但不会超过缓冲区的大小。read()方法的返回值不再是字节的int值,而是返回实际读取了多少个字节。如果返回-1,表示没有更多的数据了。
public void readFile()throws IOException{
try(InputStream input=new FileInputStream("src/test.txt"))
//定义缓冲区
byte[] buffer=new byte[1000];
int n;
while (n=input.read(buffer) !=-1){//将数据读到缓冲区
System.out.println("read"+n+"bytes");
}
}
OutputStream:最基本的输出流,也是一个抽象类。定义了一个最重要的方法void write(int b)
void write(int b):会写入一个字节到输出流。(其实是写入内存区,等内存区数据满了之后在发送到网络)
flush();将缓冲区的内容真正输出到目的地。
FileOutputStream:文件输出流。
public void writeFile()throws IOException{
try(OutputStream output =new FileOutputStream("out/ream.tex")){
output.write("Hello".getBytes(UTF-8));
}
}
Reader/Writer
Reader:输入字符流
Writer:输出字符流
Reader和Writer本质上是一个能自动编解码的InputStream和OutputStream
File对象
Java.io提供了File对象来操作文件和目录。
要构造一个File对象,需要传来文件路径
File f=new File("c:\\ window\\xx.exe");
在window平台使用\作为路径分隔符,在Java字符串中需要用**\表示一个**。
File对象既可以表示文件,也可以表示目录。
构造一个File对象,即使传入的文件或目录不存在,代码也不会出错,因为构造一个File对象,并不会导致任何磁盘操作。只有当我们调用File对象的某些方法的时候,才真正进行磁盘操作
调用isFile(),判断该File对象是否是一个已经存在的文件,调用isDiretory(),判断该File对象是否是一个已经存在的目录。返回Boolean值。
创建和删除文件
createNewFile():创建一个新的文件。
delete():删除该文件
File file=new File();
file.createNewFile(); //创建文件
file.delete; //删除文件
遍历文件和目录
当File对象表示一个目录的时候,可以使用**list()和listFiles()**来列出目录下的文件和子目录。**listFiles()**提供了一系列重载方法,可以过滤不需要的文件和目录。
mkdir():创建当前File对象表示的目录
delete():删除当前File对象表示的目录,当前目录必须为空才能删除成功