Java.io 包,该包介绍:通过数据流、序列化和文件系统提供系统输入和输出
下面了解下什么是IO流 ?
- IO流是用来处理设备之间的数据传输。
- JAVA对数据的操作是通过流的方式
- 流分为输入流和输出流
- 流按操作数据分为字节流和字符流
-------------------------------------------------------------------------------------------------------------------------------------
下面介绍字符流类, 已知字符流的基类是 Reader , Writer
已知子类:
BufferedReader -------- 缓冲流 -------- BufferedWriter-------------------------------------------------------------------------------------------------------------------------------------CharArrayReader -------- 字符数组流 -------- CharArrayWriter
FilterReader -------- 过滤器流 -------- FileterWriter
InputStreamReader -------- 转换流 -------- InpuStreamWriter
PipedReader -------- 管道流 -------- PipedWriter
StringReader -------- 字符串流 -------- StringWriter
FileReader -------- 文件流 -------- FileWriter
下面通过 FileReader 文件流进行文件的读取演示:
import java.io.*;
class ReaderWriter
{
/* 已知当前文件下,有一个test文本文件,通过FileWriter 文件字符流进行写入 */
public static void main(String[] args) throws IOException {
/*
1. 使用 IO 流 会引发一个JAVA异常体系中的,比较常见的异常IOException需要进行捕获 (这里先不处理,抛出去)
2. 在创建FileReader 对象, 需要绑定一个文件对象,该文件不存在则会引发 java.io.FileNotFoundException (系统找不到指定的文件。)
*/
FileReader fr = new FileReader("11.txt");
char[] buf = new char[1024]; //定义一个字符缓冲区,
int len = 0; //用于记录文件长度
while((len = fr.read(buf))!=-1) //通过 read 读取数据,将读取到的数据存入到字符缓冲区,
{ //读取完后的read会返回剩余的文件长度,用len记录著,用于判断文件是否读取完毕。
System.out.println(new String(buf, 0, len)); //打印每一次存储到的数据。
}
fr.close(); //因为FileReader底层是调用window资源,所以需要通过close方法,释放资源。因为资源是有限的,
}
}
下面通过 FileWriter 文件流进行文件的写入演示:
import java.io.*;
class ReaderWriter
{
/* 已知当前文件下,有一个test文本文件,通过FileWriter 文件字符流进行写入 */
public static void main(String[] args) throws IOException {
/*
1. 使用 IO 流 会引发一个JAVA异常体系中的,比较常见的异常IOException,需要进行捕获(这里先不处理,抛出去)
2. 在创建FileWriter 对象,需要绑定一个文件对象,该文件不存在则会当前文件路径下,创建文件对象,如何存在,则会覆盖当前文件对象,
3. 可以通过创建FileWriter,告诉它不用覆盖,你要续写文件 例: new FileWriter("test", true);
*/
FileWriter fw = new FileWriter("test.txt");
for(int i = 1; i<6; i++)
{
fw.write("第"+i+"写入数据\r\n"); //通过 write 方法写入数据,需要注意的是:他写入的数据是在缓冲区里,并不是目的文件内。
fw.flush(); //需要通过 flush 方法进行刷新缓冲区,这样数据才百分百的写入到目的文件内。
}
/*
这里需要注意是close方法底层也在调用flush方法,这让人产生错意,反正close最后都会调用flush方法,
所以干脆不用我写 flush方法了。 这点是错误的。因为flush是即时刷新,可以保证数据的有效性,要是
在写入的过程中,停电了,该程序没有执行到close方法就断电了,之前的写入的数据就会没有了。
所以这里建议,写一次,刷新一次。
*/
fw.close(); //因为FileWriter底层是调用window资源,所以需要通过close方法,释放资源。因为资源是有限的,
}
}
使用 IO 流 会引发一个JAVA异常体系中的,比较常见的异常 IOException
下面演示常见的 IO流 异常处理方式:
import java.io.*;
class ReaderWriter
{
/*
对于IO流的捕获处理,我们需要对他们分开进行try...catch处理。
每一种的异常都方式都是不一样的。
1. 对文件对象的处理
2. 对读写数据的处理
3. 对文件对象关闭资源处理。
*/
public static void main(String[] args) {
write();
read();
}
public static void read()
{
/* 下面演示读取字符流的捕获异常处理 */
FileReader fr = null;
try
{
fr = new FileReader("test.txt");
}
catch(FileNotFoundException e) { throw new RuntimeException("文件不存在!"); }
char[] buf = new char[1024];
int len = 0;
try
{
while((len = fr.read(buf))!=-1)
{
System.out.println(new String(buf, 0, len));
}
}
catch(IOException e) { throw new RuntimeException("文件读取错误!"); }
finally
{
try
{
if(fr!=null)
fr.close();
}
catch(IOException e) { throw new RuntimeException("文件读取流关闭失败!"); }
}
}
public static void write()
{
/* 下面演示写入字符流的捕获异常处理 */
FileWriter fw = null;
try
{
fw = new FileWriter("test.txt", true);
}
catch(IOException e) { throw new RuntimeException("路径错误!"); }
try
{
fw.write("写入数据");
fw.flush();
}
catch(IOException e) { throw new RuntimeException("数据写入错误!"); }
finally
{
try
{
if(fw!=null)
fw.close();
}
catch(IOException e) { throw new RuntimeException("文件写入流关闭失败!"); }
}
}
}