IO基础一
一. IO流常用基类
1.字节流的抽象基类
InputStream,OutputStream
2.字符流的抽象基类
Reader,Writer
注:有这四个类派生出来的子类名称都是以其父类名作为子类名的后缀。
如:InputStream的子类FileInputStream。
如:Reader的子类FileReader。
字符流的特点:既然IO流是用于操作数据的,那么数据最常见体现形式是:文件。以文件来演示。
需求:(1)在硬盘上,创建一个文件并写入一些文字数据。代码如下:
package IODemo;
import java.io.FileWriter;
import java.io.IOException;
public class FileWriteDemo {
/**
* @param args
* @throws IOException
*/
public static void main(String[] args) {
FileWriter fw=null;
try {
//创建读写入字符流对象,如果该目录下有重名的文件将被覆盖
fw = new FileWriter("F:\\demo.txt");
//写入的内容
fw.write("asdfg");
//一定记得刷新
fw.flush();
} catch (IOException e) {
System.out.println(e.toString());
}finally{
try {
//必须要记住关闭文件
if(fw!=null)
fw.close();
} catch (IOException e) {
System.out.println(e.toString());
}
}
}
}
(2)写完文件续写示例:
package IODemo;
import java.io.FileWriter;
import java.io.IOException;
public class FileWriteDemo02 {
/**
* 文件的续写
* @param args
*/
public static void main(String[] args) {
FileWriter fw=null;
try {
//创建流对象,并表明为true,可以让文件续写
fw = new FileWriter("F:\\demo.txt",true);
//在widow里写需要加上\r表示换行
fw.write("\r\n一生一世");
//刷新数据存入到文件中
fw.flush();
} catch (IOException e) {
System.out.println(e.toString());
}finally{
try {
//关闭文件
if(fw!=null)
fw.close();
} catch (IOException e) {
System.out.println(e.toString());
}
}
}
}
(3)读取文件示例:
package IODemo;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class FileReaderDemo02{
/**
* 读文件方式一
* @param args
*/
public static void main(String[] args) {
FileReader fr=null;
try {
//建字符流,判断是否存在,用try catch处理异常
fr = new FileReader("F:\\demo.txt");
while (true) {
int ch=fr.read();
if (!(ch==-1)) {
System.out.println("ch="+(char)ch);
}
}
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
if (fr!=null) {
try {
fr.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}
(4)第二种读取文件方式,用数组:
package IODemo;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
public class FileReaderDemo03 {
/**
* 文件读第二种方式
* @param args
*/
public static void main(String[] args) {
FileReader fr=null;
//创建字符流读取文件
try {
fr = new FileReader("f:\\Demo.txt");
//创建数组存储读取的文件
char[] buf=new char[1024];
int num=0;
while ((num=fr.read(buf))!=-1) {
System.out.print("buf="+new String(buf,0,num));
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
//判断是否有文件
if (fr!=null) {
try {
//关闭文件
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
(5)将E盘文件复制到F盘
复制的原理:其实就是将E盘文件存储到F盘文件中
步骤
①在F盘中创建一个文件,用于存储E盘文件中的数据
②定义读取流与E盘文件发生关联
③通过不断的读取完成数据存储
④关闭资源
代码如下:
package IODemo;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class FileCopyDemo {
/**
* 复制文件
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
//copy_1();
copy_2();
}
//方法一:从E盘读取一个文件,复制到F盘
public static void copy_1(){
FileWriter fw=null;
FileReader fr=null;
try {
//创建写入的目的地
fw=new FileWriter("F:\\copy_1.txt");
//读文件字符流
fr=new FileReader("E:\\说.txt");
int num=0;
while (true) {
if ((num=fr.read())!=-1) {
fw.write(num);
}
}
} catch (IOException e) {
// TODO Auto-generated catch block
throw new RuntimeException("读写失败");
}finally{
if (fw!=null) {
try {
fw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (fr!=null) {
try {
fr.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
//方法二:从E盘读取一个文件,复制到F盘
public static void copy_2(){
FileWriter fw=null;
FileReader fr=null;
try {
//创建复制的目的地
fw=new FileWriter("F:\\copy_2.txt");
//创建读取字符流
fr=new FileReader("E:\\说.txt");
//创建存储读取文件的数组
char[] buf=new char[1024];
int num=0;
while ((num=fr.read(buf))!=-1) {
fw.write(buf, 0, num);
}
} catch (IOException e) {
// TODO Auto-generated catch block
throw new RuntimeException("读写失败");
}finally{
if (fw!=null) {
try {
fw.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
if (fr!=null) {
try {
fr.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
}
}