1.流的概念
流是一种有序的数据序列,根据操作类型,可以分为输入流和输出流两种。I/O流(输入输出)提供了一条通道程序,可以使用这条通道把源中的字节序列送到目的地。
1.1 输入流:
程序从指向源的输入流中读取源中的数据,源可以是文件、网络、压缩包、其他数据。
1.2 输出流:
输出流的指向是数据要到达的目的地,程序通过向输出流中写入数据吧信息传递到目的地。输出流的目标可以是文件、网络、压缩包、控制台、其他数据输出目标。
2.输入/输出流
Java中所有的输入/输出流分为【字节输入/输出流】和【字符输入/输出流】
2.1 字节输入流:InputStream类
InputStream类是字节输入流的抽象类,是所有字节输入流的父类,该类中所有方法遇到错误都会发生IOException异常。
2.1.1 read()方法:
从输入流中读取数据的下一个字节,返回0~255范围内的int字节值,如果到达流末尾而没有可用字节,则返回-1;
2.1.2 read(byte[] b)方法:
从输入流中读取一定长度的字节,并以整数的形式返回字节数;
2.1.3 mark(int readlimit)方法:
在输入流的当前位置放置一个标记,readlimit参数告知此输入流在标记位置失效之前允许读取的字节数;
2.1.4 reset()方法:
将输入指针返回到当前所做的标记处;
2.1.5 skip(long n)方法:
跳过输入流上的n各字节,并返回实际跳过的字节数;
2.1.6 markSupported()方法:
如果当前流支持mark()/reset()操作就返回true;
2.1.7 close()方法:
关闭此输入流,并释放与该流有关联的所有系统资源;
2.2 字节输入流:Reader类
2.3 字节输出流:OutputStream类
OutputStream类是字节输出流的抽象类,此抽象类是所有字节输出流类的父类(超类)。OutputStream类的所有方法都返回void,在遇到错误时都会引发IOException异常。
2.2.1 write(int b)方法:
将指定的字节写入此输出流;
2.2.2 write(byte[] b)方法:
将b个字节从指定的byte数组中写入到此输出流;
2.2.3 write(byte[] b, int off, int len)方法:
将指定的byte数组b中从偏移量off开始的len个字节写入此输出流;
2.2.4 flush()方法:
彻底完成输出并清空缓存区;
2.2.5 close()方法:
关闭输出流,并释放与该流有关联的所有系统资源;
2.4 字符输出流:Writer类
3.File类
File类是java.io包中唯一代表磁盘文件本身的对象。可以同File类中的方法来实现创建、删除、重命名文件等操作。File类的对象主要用来获取文件本身的一些信息,如文件所在的目录,文件的长度,文件的读写权限等。
3.1 文件的创建与删除
使用File类创建文件对象有3种方法:
3.1.1 File(String pathname)
此构造方法通过将指定的路径名字符串转换为抽象路径名,来创建一个新的File实例。
语法:
File file = new File(String pathname);
pathname为指定路径名称(包含文件名),如:File file = new File("/chuntian/word.txt")
3.1.2 File(String parent, String child)
此构造方法根据定义父路径和子路径字符串(含文件名)创建一个新的File对象。
语法:
File file = new File(String parent, String child);
parent:父路径字符串,如“D:/doc”;
child:子路径字符串,如“word.txt”
3.1.3 File(File f, String child)
语法:
File file = new File(File f, String child);
f:父路径对象,如“D:/doc/”;
child:子路径字符串,如“word.txt”;
通过File类创建一个文件对象后,如File file = new File("word.txt"),如果当前目录中不存在名为word.txt的文件,File类会通过调用createNewFile()方法创建一个名称为word.txt的文件;如果存在word.txt文件,可以通过调用文件对象的delete()方法删除这个文件。
package io;import java.io.File;
import java.io.IOException;public class FileTest {public static void main(String[] args) {File file = new File("./word.txt"); //创建文件对象fileif (file.exists()) {file.delete(); //如果文件存在就删除文件System.out.println("文件已删除~");} else {try {file.createNewFile(); //如果文件不存在,创建文件System.out.println("文件已创建!");} catch (IOException e) {e.printStackTrace();}}}
}输出:文件已创建!
3.2 获取文件信息
File类提供了很多方法来获取文件本身的信息,如:
方法 | 返回值 | 说明 |
getName() | String | 获取文件的名称 |
canRead() | boolean | 判断文件是否可读 |
canWrite() | boolean | 判断文件是否可写 |
exist() | boolean | 判断文件是否存在 |
length() | long | 获取文件的长度(以字节byte为单位) |
getAbsolutePath() | String | 获取文件的绝对经 |
getParent() | String | 获取文件的父路径 |
isFIle() | boolean | 判断文件是否为文件 |
isDirectory() | boolean | 判断文件是否为一个目录 |
isHidden() | boolean | 判断文件是否为隐藏文件 |
LastModified() | long | 获取文件最后修改时间 |
package io;import java.io.File;
import java.io.IOException;public class FileTest {public static void main(String[] args) {File file = new File("word.txt"); //创建文件对象fileif (file.exists()) {System.out.println("文件名称是:" + file.getName());System.out.println("文件长度是:" + file.length());System.out.println("该文件是隐藏文件吗?" + file.isHidden());System.out.println("文件的绝对路径是:" + file.getAbsolutePath());} else {System.out.println("该文件不存在");}}
}输出:文件名称是:word.txt文件长度是:8该文件是隐藏文件吗?false文件的绝对路径是:/Users/jeanet/IdeaProjects/MyProject/word.txt
4.文件输入/输出流
4.1 字节的输入/输出:FileInputStream类和FileOutputStream类
FileInputStream类是inputStream类的子类;
构造方法:
4.1.1 FileInputStream(String name)
使用给定的文件名创建一个FileInputStream对象;
4.1.2 FileOutputStream(File file)
使用File对象创建FileInputStream对象;
FileOutputStream类是outputStream类的子类。
FileOutputStream与FileInputStream的构造方法类似,创建FileOutputStream对象时可以指定一个不存在的文件名,但此文件不能是一个已被其他程序打开的文件。
package io;import java.io.*;public class FileTest {public static void main(String[] args) {File file = new File("word.txt"); //创建文件对象filetry {FileOutputStream fos = new FileOutputStream(file); //创建一个FileOutputStream对象String mystr = "希望在田野上,我爱春田~";byte[] mybyte = mystr.getBytes(); //创建byte型数组fos.write(mybyte); //将byte数组中的信息写入文件中fos.close(); //关闭流} catch (Exception e) {e.printStackTrace(); //输出异常信息}try {FileInputStream fis = new FileInputStream(file); //创建FileInputStream对象byte[] mybyte = new byte[1024]; //创建byte数组int len = fis.read(mybyte); //读取文件信息String fileinfo = new String(mybyte, 0, len);System.out.println("文件中的信息是:" + fileinfo);fis.close();} catch (Exception e) {e.printStackTrace();}}
}输出:文件中的信息是:希望在田野上,我爱春田~
4.2 字符的输入/输出:FileReader类和FileWriter类
4.2.1 FileReader
FileReader流顺序地读取文件,只要不关闭流,每次调用read()方法就能顺序地读取源文件中的字符内容,直到源的末尾或流被关闭。
4.2.2 FileWriter
package io;import java.io.*;public class FileTest {public static void main(String[] args) {File file = new File("word.txt"); //创建文件对象filetry {FileWriter fw = new FileWriter(file); //创建FileWriter字符对象fw.write("春天在哪里呀?");fw.close();} catch (Exception e) {e.printStackTrace(); //输出异常信息}try {FileReader fr = new FileReader(file); //创建FileReader对象char[] mychar = new char[1024]; //创建char型数组int len = fr.read(mychar); //将字节读入数组String mystr = new String(mychar, 0, len); //设置文本域的显示信息System.out.println("文件内容是:" + mystr);} catch (Exception e) {e.printStackTrace();}}
}输出:文件内容是:春天在哪里呀?
5.带缓存的输入/输出流
缓存是I/O的一种性能优化。缓存流为I/O流增加了内存缓存区,有了缓存区,在流上执行skip()、mark()、reset()方法就成为了可能。
5.1 字节的缓存输入/输出:BufferedInputStream类和BufferedOutputStream类
BufferedInputStream类和BufferedOutputStream类可以对所有的InputStream类和OutputStream类进行带缓存区的包装以达到性能优化;
构造方法:
5.1.1 BufferedInputStream(InputStream in)
创建了一个带32个字节的缓存流;
5.1.2 BufferedInputStream(InputStream in, int size)
按指定大小来创建缓存区。
5.1.3 BufferedOutputStream(OutputStream out)
创建了一个带32个字节的缓存流;
5.1.4 BufferedOutputStream(OutputStream out, int size)
按指定大小来创建缓存区。
flush()方法只对使用缓存区的OutputStream类的子类有效,用于在缓存区没满的情况下,也将缓存区的内容强制写入到外设,当调用close()方法时,系统在关闭流之前,也会将缓存区中的信息刷新到磁盘文件中。
5.2 字符的缓存输入/输出:BufferedReader类和BufferedWriter类
BufferedReader类继承了Reader类,BufferedWriter类继承了Writer类,这两个类同样具有缓存机制,可以以行为单位进行输入/输出。
5.2.1 BufferedReader类常用方法
5.2.1.1 read()方法:
读取单个字符;
5.2.1.2 readLine()方法:
读取一个文本行,并将其返回为字符串。若无数据可读,返回null;
5.2.2 BufferedWriter类常用方法
5.2.2.1 write(String s, int off, int len)方法:
写入字符串的某一部分;
5.2.2.2 flush()方法:
刷新该流的缓存;
5.2.2.3 newLine()方法:
写入一个行分隔符;
在使用BufferedWriter类的write()方法时,数据并没有立即写入输出流,而是首先进入缓存区中,如果想立刻将缓存区中的数据写入输出流,一定要调用flush()方法。
package io;import java.io.*;public class Student {public static void main(String[] args) {String[] content = {"好久不见", "最近好吗?", "常联系~"};File file = new File("word.txt");try {FileWriter fw = new FileWriter(file); //创建FileWriter对象BufferedWriter bw = new BufferedWriter(fw); //创建BufferedWriter对象for (int i = 0; i < content.length; i++) {bw.write(content[i]); //将字符串数组中的元素写入到磁盘文件bw.newLine();}bw.close();fw.close();} catch (Exception e) {e.printStackTrace();}try {FileReader fr = new FileReader(file); //创建FileReader对象BufferedReader br = new BufferedReader(fr); //创建BufferedReader对象int i = 0;String s = null;while ((s = br.readLine()) != null) {i++;System.out.println("第" + i + "行的内容是:" + s);}br.close();fr.close();} catch (Exception e) {e.printStackTrace();}}
}输出:第1行的内容是:好久不见第2行的内容是:最近好吗?第3行的内容是:常联系~