1. IO流概述
IO流用来在设备之间传输数据,Java对数据的传输就是通过IO流的方式,用于操作IO流的类封装在io包中。
IO流根据所操作的数据分为两种:字节流和字符流。
IO流根据数据传输的方向分为两种:输入流和输出流。
字节流的抽象基类:InputStream、OutputStream。
字符流的抽象基类:Reader、Writer。
由这四类派生的子类名称,都是以父类名作为后缀。
先以字符流为例,了解下IO流。
既然IO流是用于操作数据的,那么数据最常见的体现形式是:文件。
那么先以操作文件为主来演示。
需求:在硬盘上,创建一个文本文件,并写入一些数据。
思路:使用一个专门用于操作文件的Writer子类对象——FileWriter,三个方法:write、close、flush。
代码示例:
import java.io.*;
class FileWriterDemo{
public static void main(String[] args) throws IOException {
/* 创建一个FileWriter对象,该对象一被初始化就必须要明确被操作的文件。
而且该文件会被创建到指定目下。如果该目录下已有同名文件,将被覆盖。该文件不存在则创建。
其实该步骤就是在明确数据要存放的目的地。 */
FileWriter fw = new FileWriter("Demo.txt"); //默认Path目录下,E:\java
//调用write()方法,将字符串写入到流中。
fw.write("abcde");
/* 刷新流对象中的缓冲中的数据。
将数据刷到目的地中。 */
fw.flush();
/* 关闭流资源,但是关闭之前会刷新一次内部的缓冲中的数据。
将数据刷到目的地中。
和flush()方法的区别:flush刷新后,流可以继续使用;close刷新后,会将流关闭。 */
fw.close();
//fw.write("haha");
}
}2. IO异常的处理
上一个例子中,FileWriter的构造方法、write、flush、close方法都会抛出IO异常IOException,上一个例子中只是简单的throws抛出处理。
这里学习内部的IO异常处理方法。
代码示例:
import java.io.*;
class FileWriterDemo2 {
public static void main(String[] args){
FileWriter fw = null; //finally块中需调用fw,所以fw全局定义,但在try块中初始化。
try{
fw = new FileWriter("k:\\Demo.txt"); //路径不存在抛出IO异常,初始化失败。
fw.write("cbcdaf"); //把数据写入流中。
}
catch(IOException e){
System.out.println("异常:"+e.toString());
}
finally{
try{
if(fw!=null) //必须判断fw是不是为空。fw初始化失败则为空。
fw.close(); //close关闭资源要写在finally中。
}
catch(IOException e){
System.out.println(e.toString());
}
}
}
}3. 文件的续写
对已有的文件,在文件的末尾进行数据续写。
代码示例:
import java.io.*;
class FileWriterDemo3 {
public static void main(String[] args){
FileWriter fw = null;
try{
//传递一个true参数,代表不覆盖已有的文件,并在已有文件的末尾处进行数据续写。
fw = new FileWriter("Demo.txt",true);
fw.write("append");
}
catch(IOException e){
System.out.println(e.toString());
}
finally{
try{
if (fw!=null)
fw.close();
}
catch(IOException e){
System.out.println(e.toString());
}
}
}
}4. IO流文件读取:逐个字符读取
FileReader调用read()方法,一次读取一个字符,逐个读取。
代码示例:
import java.io.*;
class FileReaderDemo{
public static void main(String[] args) throws IOException{
//创建一个文件用来读取流对象,和指定名称的文件相关联。
//要保证指定文件是已经存在的,如果不存在,会发生FileNotFoundException
FileReader fr = new FileReader("Demo.txt");
//调用read方法,读取流对象。
//read方法:一次读一个字符,而且会自动往下读,返回字符的十进制形式。
int ch = fr.read();
System.out.println("ch="+(char)ch);
while(true){
int ch = fr.read();
if(ch==-1)
break;
System.out.println((char)ch);
}
/* 上面的while循环的优化。
int ch = 0;
while((ch=fr.read())!=-1){
System.out.println((char)ch);
} */
fr.close();
}
}5. IO流文件读取:通过字符数组读取
代码示例:
import java.io.*;
class FileReaderDemo2{
public static void main(String[] args) throws IOException{
FileReader fr = new FileReader("Demo.txt");
//定义一个字符数组,用于存储读到字符。
//该read(char[])返回的是读到字符个数。
char[] buf = new char[1024]; //此处数组长度一般为1024整数倍。
int num = 0;
while((num=fr.read(buf))!=-1){ //读取文件中字符,逐个存入buf数组,返回读取的字符数。
System.out.println(new String(buf,0,num));
}
fr.close();
}
}6. FileReader练习
读取一个.java源文件,并打印在控制台上。
代码示例:
import java.io.*;
class FileReaderTest{
public static void main(String[] args){
FileReader fr = null;
try{
fr = new FileReader("DateDemo.java");
char[] buf = new char[1024];
int num = 0;
while((num=fr.read(buf))!=-1){
//这里是print,不带换行,不然超过1024时,没打印完就换行。
System.out.print(new String(buf,0,num));
}
}
catch(IOException e){
System.out.println(e.toString());
}
finally{
try{
if(fr!=null)
fr.close();
}
catch(IOException e){
System.out.println(e.toString());
}
}
}
}7. 拷贝文本文件
将C盘一个文件复制到D盘。
步骤:
1,在D盘创建一个文件,用于存储C盘文件中的数据。
2,定义一个读取流,并和C盘文件关联。
3,定义一个写入流,并创建一个D盘的文件。
3,通过不断的读写,完成数据的存储。
4,关闭资源。
代码示例:
import java.io.*;
class CopyTextDemo {
public static void main(String[] args) {
//copy_1();
copy_2();
}
//从C盘读一个字符,就往D盘写一个字符。
public static void copy_1(){
FileReader fr = null;
FileWriter fw = null;
try{
//创建目的地。创建写入流,和写入的文件。
fw = new FileWriter("D:\\RuntimeDemo_copy.txt");
//与已有文件关联。创建读取流,和要读取的文件。
fr = new FileReader("C:\\RuntimeDemo.java");
int ch = 0;
//read方法返回的int类型,是字符的ASCII码值。
while((ch=fr.read())!=-1){
fw.write(ch); //此处的read和write是逐个字符的读写,效率低。
}
}
catch(IOException e){
System.out.println(e.toString());
}
finally{
try{
fw.close();
fr.close();
}
catch(IOException e){
System.out.println(e.toString());
}
}
}
//第二种实现方式。
public static void copy_2() {
FileReader fr = null;
FileWriter fw = null;
try{
fw = new FileWriter("D:\\RuntimeDemo_copy.txt");
fr = new FileReader("C:\\RuntimeDemo.java");
char[] buf = new char[1024];
int size = 0;
//此处的read和write按字符数组读取和写入。
while((size=fr.read(buf))!=-1){
fw.write(buf,0,size); //只把数组不为空的部分写入,避免浪费空间。
}
}
catch(IOException e){
System.out.println(e.toString());
}
finally{
if(fw!=null)
try{
fw.close();
}
catch(IOException e){
System.out.println(e.toString());
}
if(fr!=null)
try{
fr.close();
}
catch(IOException e){
System.out.println(e.toString());
}
}
}
}
本文详细介绍了Java中的IO流,包括流的概述、异常处理、文件续写、字符流读取方式(逐个字符和字符数组)以及文件拷贝的实际操作。通过对FileWriter和FileReader的使用,展示了如何进行文件的读写和数据传输。

1142

被折叠的 条评论
为什么被折叠?



