流概述
流是一组有序的数据序列,根据操作的类型,可分为输入流和输出流,I/O流提供了一条通道程序,可以使用这条通道把源中的字节序列送到目的地,虽然I/O流通常与磁盘文件存取有关,但是程序的源和目的地也可以是键盘,鼠标,内存或显示器窗口。
Java由数据流处理输入/输出模式,程序从指向源的输入流中读取源中的数据,输出流的指向是数据要到达的目的地,程序通过向输出流中写入数据把信息传递到目的地。
输入/输出流
关于各种方式的输入/输出,这些类都放在java.io包中,其中,所有输入流类都是抽象类InputStream(字节输入流)或抽象流Reader(字符流输入流)的子类,所有输出流类都是抽象类OutputStream(字节输出流)或抽象类Writer(字符输出流)的子类
输入流
1.InputStream类
InputStream类是所有字节输入流的父类,该类中所有的方法遇到错误是都会引发IOException异常,
- read()方法:从输入流中读取数据下一个字节,返回0~255范围内的int字节值,如果因为已经到达流末尾而没有可用的字节,则返回值为-1
- read(byte[] b):从输入流中读入一定长度的字节,并以整数的形式返回字节数。
- mark(int readlimit)方法:在输入路的当前位置放置一个标志,readlimit参数告知此输入流在标记位置失效之前允许读取的字节数。
- reset()方法:将输入指针返回到当前所作的标记处
- skip(long n)方法:跳过输入流上的n个字节并返回实际跳过的字节数
- markSupported()方法:如果当前流支持mark()/set()操作就返回true。
- close()方法:关闭此输入流并释放与该流关联的所有系统资源。
注意:并不是所有的InputStream类的子类都支持Input Stream中的方法,Input Stream类中某些方法只对某些子类有用。
2.Reader类
Reader类是字符输入流的抽象类,所有字符输入流的实现都是它的子类,Reader类中的方法与Input Stream类中方法类似,Reader类结构图如下
输出流
1.OutputStream类
OutputStream类是字节输出流的抽象类,此抽象类是所有输出字节流的父类,OutputStream类的层次结构如下图
OutputStream类的方法均返回void,在遇到错误是会引发IOException异常,以下是此类中各个方法的介绍:
- write(int b)方法:将指定的字节写入此输出流。
- write(byte[] b)方法:将b个字节从指定的byte数组写入此输出流。
- write(byte[] b,int off,int len)方法:将指定byte数组中从偏移量off开始的len个字节写入此输出流。
- flush()方法:彻底完成输出并清空缓存区。
- close()方法:关闭输出流
2.Writer类
Writer类是字符输出流的抽象类,所有字符输出类的实现都是它的子类。Writer的层次结构如下图:File类
File类是java.io包中唯一代表磁盘文件本身的对象,可以通过File类中的一些方法,实现创建、删除、重命名文件等操作。File类中的对象主要用来获取文件本身的一些信息,如文件所在的目录、文件的长度、文件的读写权限。文件的创建与删除
File(String pathname):此构造方法通过将给定路径名字符串转换成抽象路径名来创建一个新File实例,语法结构如下:
new File(String pathname);
//实例
File file=new File("d:/1.txt");
File(String parent,String child):根据定义的父路径和子路径字符串创建一个新的File对象,语法如下:
new File(String parent,String child);
File(File f,String parent):该构造方法根据parent抽象路径名和child路径字符串创建一个新的File实例,语法如下:
new File(File f,String child);
获取文件信息
File类提供了很多获取文件信息的方法,如下。
getName()方法:返回值是String,获取文件的名称。
- canRead()方法:返回值是boolean,用来判断文件是否是可读的。
- canWrite()方法:返回值是boolean,用来判断文件是否可被写入。
- exits()方法:返回值是boolean,用来判断文件是否存在。
- length()方法:返回值是long,用来获取文件的长度。
- getAbsolutePath()方法:返回值是String,用来获取文件的绝对路径。
- getParent()方法:返回值是String,用来获取文件的父路径。
- isFile()方法:返回值是boolean,用来判断文件是否存在。
- isDirectory方法:返回值是boolean,用来判断文件是否为一个目录。
- isHidden()方法:返回值是boolean,用来判断文件是否为隐藏文件。
- lastModified()方法:返回值是long,用来获取文件最后修改时间。
以下为例子
import java.io.File;
import java.sql.SQLOutput;
public class FileTest {
public static void main(String[] args) {
//File file=new File("D:/1.txt");
//File file=new File(")
File file=new File("D:/school/","letter.txt");
if (file.exists()){
file.delete();
System.out.println("文件已删除");
}else {
try{
file.createNewFile();
System.out.println("文件已创建");
String name=file.getName();
long length=file.length();
boolean hidden=file.isHidden();
System.out.println("文件名字"+name);
System.out.println("文件长度"+length);
System.out.println("该文件是否为隐藏文件"+hidden);
}catch (Exception e){
e.printStackTrace();
}
}
}
}
文件输入/输出流
FileInputStream与FileOutputStream类
FileInputStream与FileOutputStream类都用来操作磁盘对象,FileInputStream类继承自InputStream类,FileOutputStream类继承自OutputStream类。
FileInputStream类常用的构造方法:
FileInputStream(String name);
FileInputStream(File file);
FileOutputStream类常用的构造方法:创建一个FileOutputStream对象时,可以指定不存在的文件名,但此文件不能是一个已被其他程序打开的文件。
FileOutputStream(String name);
FileOutputStream(File file);
以下是例子
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
public class FileTest2 {
public static void main(String[] args) {
File file=new File("D:/word.txt");
try{
FileOutputStream out=new FileOutputStream(file);
byte[] buy="我u一直是的哈手机号大数据库打卡机是 ".getBytes();
out.write(buy);
out.close();
}catch (Exception e){
e.printStackTrace();
}
try{
FileInputStream in=new FileInputStream(file);
byte[] bytes=new byte[1024];
int len=in.read(bytes);
System.out.println("文件的信息是"+new String(bytes,0,len));
in.close();
}catch (Exception e){
e.printStackTrace();
}
}
}
FileReader和FileWriter类
FileInput Stream和FileOutputStream这两个类只提供了对字节或字节数组的读取方法,如果是读取汉字的话,使用字节流,如果读取不好的话会出现乱码现象,此时采用字符流Reader或Writer类就可避免这种现象。
带缓存的输入/输出流
缓存是I/O的一种性能优化,缓存流为I/O流增加了内存缓存区,有了缓存区,使得在流上执行skip(),mark(),reset()方法都成为可能。
BufferedInputStream和BufferedOutputStream类
BufferedInputStream
BufferedInputStream类可以对所有InputStream类进行带缓存区的包装已达到性能的优化,BufferedInputStream类有两个构造方法:第一种构造方法创建了一个带有32个字节的缓存流,第二种构造方法按指定的大小来创建缓存区,一个最优 的缓存区的大小,取决于它所在的操作系统、可用的内存空间和机器配置。
BufferedInputStream(InputStream in);
BufferedInputStream(InputStream in,int size);
BufferedOutputStream
使用BufferedOutputStream输出信息和使用OutputStream输出信息完全一样,但是BufferedOutputStream类有一个flush()方法用来将缓存区的数据强制输出完,BufferedOutputStream类有两个构造方法:
BufferedOutputStream(OutputStream in);
BufferedOutputStream(OutputStream in,int size);
注意 :flush()方法就是用于即使在缓存区没有满的情况下,也将缓存区的内容强制写入到外设,flush()方法只对使用缓存区的OutputStream类的子类有效,当调用close()方法时,系统在关闭流之前,也会将缓存区中的信息刷新到磁盘文件中
BufferedReader和BufferedWriter类
BufferedReader
常用方法:
- read()方法:读取单个字符。
readLine()方法:读取一个文本行,并将其返回为字符串,若无数据可读,则返回null。
BufferedWriter
常用方法:
write(String s,int off,int len)方法:写入字符串的某一部分。
- flush()方法:刷新该流的缓存。
- newLine()方法:写入一个行分隔符。
注意:在使用BufferedWriter类的Write()方法时,数据并没有立刻被写入输出流,而是首先进入缓存区中,如果向立刻将缓存区中的数据写入输出流,一定要调用flush()方法。下面是例子。
import java.io.*;
public class BufferedTest {
public static void main(String[] args) {
String content[]={"好久不见","最近好吗","再联系"};
File file=new File("D:/wordd.txt");
try{
FileWriter fileWriter=new FileWriter(file);
BufferedWriter bufferedWriter=new BufferedWriter(fileWriter);
for (int i=0;i<content.length;i++){
bufferedWriter.write(content[i]);
bufferedWriter.newLine();
}
bufferedWriter.close();
fileWriter.close();
}catch(Exception exception){
exception.printStackTrace();
}
try{
FileReader fileReader=new FileReader(file);
BufferedReader bufferedReader=new BufferedReader(fileReader);
String s=null;
int k=0;
while ((s=bufferedReader.readLine())!=null){
k++;
System.out.println("第"+k+"行"+s);
}
bufferedReader.close();
fileReader.close();
}catch (Exception e){
e.printStackTrace();
}
}
}