文章目录
前言
才疏学浅,能力有限,文章中有什么错误,欢迎评论指出,一起进步~
学习I/O流之前,还得学习一下File类。
1、File类的理解
- 文件和目录路径名的抽象表示。
- File类的一个对象,代表一个文件或一个文件目录(文件夹)。
- File类声明在java.IO包下。
- File类中涉及到关于一些文件和文件目录的创建、删除、重命名、修改时间文件大小等办法,并未涉及到读取或写入文件内容的操作。如果需要读写文件,必须使用I/O流来操作。
- 后续File类的对象常会作为参数传递到流的构造器中,知名读取或写入的“终点”。
2、FIle类的构造器
-
File(File parent, String child) :从父抽象路径名和子路径名字符串创建新的 File实例。
相当于创建了路径为 parent / child(在parent的路径后面再拼接上child)的File实例。 -
File(String pathname) :通过将给定的路径名字符串转换为抽象路径名来创建新的 File实例。
参数直接传文件的相对路径或者绝对路径。 -
File(String parent, String child) :从父路径名字符串和子路径名字符串创建新的 File实例。
3、常用方法
public static void main(String[] args) throws IOException {
//file类得到的文件不能直接写入。
File file = new File("E:\\javaStudy\\src\\yg\\day10\\Demo01.java");
if(file.exists()){
System.out.println(file.getAbsoluteFile()); //获取文件的绝对路径
System.out.println(file.getName());//获取文件名
System.out.println(file.getPath());//获取文件路径(相对或者绝对)
System.out.println(file.length());//返回文件中内容长度
System.out.println(file.isFile());//判断该路径对应的是不是文件,是返回true
System.out.println(file.isDirectory());//判断该路径对应的是不是文件夹,是返回true
System.out.println(file.canWrite());//判断该文件是否可写,是返回true
}else {
System.out.println("file not found");
file.createNewFile();
}
}
运行结果:
一、什么是I/O流
- I/O流是Input/Output的缩写,I/O是非常实用的技术,用于处理设备之间的数据传输。如读写文件,网络通讯等。
- Java程序中,对于数据的输入/输出的操作以“流(Stream)”的方式进行。
- 输入Input,读取外部数据到内存。
- 输出Output,将内存数据输出到外部存储设备。
二、I/O流的分类
- 按照操作数据单位不同分为:字节流(8bit),字符流(16bit)
- 按照流向不同分为:输入流,输出流
- 按照角色不同分为:节点流,处理流
三、I/O流的框架
来源:W3C菜鸟教程
四、字节流
1、特点
- 字节流处理单元为1个字节,操作字节和字节数组。
- 字节流可用于操作任何类型的对象,包括二进制对象,但他不能直接处理Unicode字符。
- 字节流是最基本的,所有的InputStream和OutputStream的子类都是字节流。
- 一般用于对二进制数据的读写,例如:图像,声音等数据。
2、InputStream和OutputStream
InputStream: 抽象类。
(1.) InputStream是个输入流,同样也是一个字节流。
(2.) 使用该类可能发生异常,所以要进行异常处理。
(3.) InputStream的直接子类。
(4.) 创建了该类的子类对象后,需要调用close()方法手动关闭。
- FileInputStream:从文件系统中的文件获取输入字节,用于读取诸如图像数据的原始字节流。是一个比较常用的类。
其两个常用的构造方法:
FileInputStream(File file) :通过打开与实际文件的连接创建一个 FileInputStream ,该文件由文件系统中的 File对象 file命名。
实例代码如下:
public static void main(String[] args) throws IOException {
//file类得到的文件不能直接写入。
File file = new File("E:\\javaStudy\\src\\yg\\day10\\Demo01.java");
//初始化
InputStream is = new FileInputStream("E:\\javaStudy\\src\\yg\\day10\\Demo01.java");
InputStream inputStream = new FileInputStream(file);
}
FileInputStream(String name) :通过打开与实际文件的连接来创建一个 FileInputStream ,该文件由文件系统中的路径名 name命名。
该路径可以是绝对路径也可以是相对路径。
- ByteArrayInputStream:包含一个内部缓冲区,可以读取字节数组中的数据。
构造方法:
ByteArrayInputStream(byte[] buf) :创建一个 ByteArrayInputStream ,使其使用 buf作为其缓冲区数组。
ByteArrayInputStream(byte[] buf, int offset, int length) :创建 ByteArrayInputStream使用 buf作为其缓冲器阵列。
注意:该类调用了close方法后,依然可以使用该类中的其他方法。代码如下:
public static void main(String[] args) throws IOException {
byte[] bytes = new byte[10];
bytes[0] = 1;
bytes[1] = 3;
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes);
System.out.println(byteArrayInputStream.read());
byteArrayInputStream.close();
System.out.println(byteArrayInputStream.read());
}
运行结果:
- PipedInputStream:管道字节输入流,可以实现多线程间的管道通信。
- ObjectInputStream:对象输入流,反序列化中使用。
- BufferedInputStream:添加了缓冲输入和支持mark和reset方法的功能。默认缓冲区大小为8192。先将数据读入缓冲区,在从缓冲区读入到程序当中。
OutputStream 输出字节流
- FileOutputStream的使用
public static void main(String[] args) {
//file类得到的文件不能直接写入。
File file = new File("E:\\javaStudy\\src\\yg\\day10\\Demo02.java");
OutputStream os = null;
try {
OutputStream outputStream = new FileOutputStream(file);
os = new FileOutputStream(file);
String s = "1111";
os.write(s.getBytes());
outputStream.close();
os.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
如果指定路径的文件或文件夹不存在,使用该类写入时会自动创建文件夹。并且写入数据的时候要将数据转换成字节。
- ByteArrayOutputStream:向字节数组中写入数据。
- PipedOutputStream:向与其它线程共用的管道中写入数据.
- PrintStream:为另一个输出流添加了功能,即能够方便地打印各种数据值的表示。类似缓冲流一样给底层介质流提供功能,这功能就是数字和对象转化为文本。PrintStream从不抛出IOException ,可以自动刷新。
System.out和PrintStream类的关系:
先看看 System类中的字段public static final PrintStream out;实际上out就是PrintStream类的实例。
五、字符流
1、特点
- 字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串。
- 字符流只能处理字符或者字符串。
- 字符流是按虚拟机的编码来处理数据。
2、Reader和Write
Reader 字符输入流
- Reader:字符输出流的所有父类。
- CharArrayReader:从字符数组中读取数据。
- PipedReader:与其它线程共用的管道中读取数据。
- FilterReader:所有自定义具体装饰流的父类。
- BufferedReader:从字符输入流读取文本,缓冲区存放字符,以提供字符,数组和行的高速读取。如果没有缓冲,每次使用read()和readLine()可能会导致从文件中读取字节,转换成字符,这可能非常低效。
构造方法:
1、 BufferedReader(Reader in) :创建使用默认大小的输入缓冲区的缓冲字符输入流。(默认缓冲区大小,8192)
2、 BufferedReader(Reader in, int sz) :创建使用指定大小的输入缓冲区的缓冲字符输入流。 (指定缓冲区大小)
代码实例:
public static void main(String[] args) throws IOException {
File file = new File("E:\\javaStudy\\src\\yg\\day10\\Demo01.java");
Reader reader = new FileReader(file);
BufferedReader bufferedReader = new BufferedReader(reader);
System.out.println((char)bufferedReader.read());
reader.close();
bufferedReader.close();
}
主要成员方法:
- InputStreamReader:是一个连接字节流和字符流的桥梁,它将字节流转变为字符流。FileReader实现此功能的常用工具类。
Write 字符输出流
- write:所有字符输出流的父类。
- CharArrayWriter:向Char 数组中写入数据。
- PrintWriter 和PrintStream 极其类似,功能和使用也非常相似。
- OutputStreamWriter 是OutputStream 到Writer 转换的桥梁,它的子类FileWriter 其实就是一个实现此功能的具体类。
- BufferedWriter:将文本写入字符输出流,缓冲字符,以提供单个字符,数组和字符串的高效写入。提供了一个newLine()方法,它使用平台自己的系统属性line.separator定义的行分隔符概念。 并非所有平台都使用换行符(’\ n’)来终止行。
六、字符流和字节流的转换
- InputStreamReader(OutStream out):将字节流以字符流输出。
- OutputStreamWriter(InputStream in):将字节流以字符流输入。
总结
- 字节输入流中常用的类是FileInputStream;
- 字节输出流中常用的类是FileOutputStream。注意:写入文件时,如不需覆盖原本文件内容时,需要将其构造方法第二个参数设为true。例如:FileOutputStream(file, true);参数为false,表示新写入的内容将覆盖原有文件内容。
- 字符输入流中常用类是FileReader。
- 字符输出流中常用类是FileWrite。构造函数第二个参数为false,覆盖原有内容;true,原有内容后面添加新内容。