IO(Input Output)流
1.IO流用来处理设备之间的数据传输
2.Java对数据的操作是通过流的方式
3.Java用于操作流的对象都在IO包中
4.流按操作数据分为两种:字节流与字符流。
5.流按流向分为:输入流,输出流。
思考:
为什么会有字符流?
为了解决由不同的编码表读写出现乱码的问题,java在字节流基础上产生了字符流,字符流可以在内部融合编码表,由你来指定编码表。
字节流与字符流
1.字节流:用来处理数据,通用
2.字符流:专门用来编码文字
IO流常用基类
1.字节流的抽象基类:
InputStream ,OutputStream。
2.字符流的抽象基类:
Reader , Writer。
注:由这四个类派生出来的子类名称都是以其父类名作为子类名的后缀。
如:InputStream的子类FileInputStream。
如:Reader的子类FileReader。
IO程序的书写
1.导入IO包中的类
2.进行IO异常处理
3.在finally中对流进行关闭
思考:
1.有了垃圾回收机制为什么还要调用close方法进行关闭。
2.为什么IO异常一定要处理。
字符流——创建文件
1.创建流对象,建立数据存放文件
FileWriter fw = new FileWriter(“Test.txt”);
2.调用流对象的写入方法,将数据写入流
fw.write(“text”);
3.关闭流资源,并将流中的数据清空到文件中。
fw.close();
创建文件并写入数据实例:
IO异常的处理方式
思考:
如果想在原有文件上继续加入新的数据呢?
使用FileWriter(File file, boolean append)构造函数,如果第二个参数为 true,则将字节写入文件末尾处,而不是写入文件开始处。
对已有文件的数据续写实例:
字符流——读取文件
1.建立一个流对象,将已存在的一个文件加载进流。
FileReader fr = new FileReader(“Test.txt”);
2.创建一个临时存放数据的数组。
char[] ch = new char[1024];
3.调用流对象的读取方法将流中的数据读入到数组中。
fr.read(ch);
读取文件方式:
1.通过字符进行读取。
2.通过字符数组进行读取。
读取文件实例(通过字符进行读取):
读取文件实例(通过字符数组进行读取):
思考:
1.在加载文件时候是否是将文件全部加载进流?
数据是先加载在内存区,然后又被马上被读取出去。
2.为什么定义数组,要定义多大呢?
更好的存储数据,一般定义为1024的倍数。
注意:
1.定义文件路径时,可以用“/”或者“\\”。
2.在创建一个文件时,如果目录下有同名文件将被覆盖。
3.在读取文件时,必须保证该文件已存在,否则出异常。
文本文件复制
复制的原理:其实就是将一个盘下的文件数据存储到另外一个盘的一个文件中。
文件复制实例:
1.IO流用来处理设备之间的数据传输
2.Java对数据的操作是通过流的方式
3.Java用于操作流的对象都在IO包中
4.流按操作数据分为两种:字节流与字符流。
5.流按流向分为:输入流,输出流。
思考:
为什么会有字符流?
为了解决由不同的编码表读写出现乱码的问题,java在字节流基础上产生了字符流,字符流可以在内部融合编码表,由你来指定编码表。
字节流与字符流
1.字节流:用来处理数据,通用
2.字符流:专门用来编码文字
IO流常用基类
1.字节流的抽象基类:
InputStream ,OutputStream。
2.字符流的抽象基类:
Reader , Writer。
注:由这四个类派生出来的子类名称都是以其父类名作为子类名的后缀。
如:InputStream的子类FileInputStream。
如:Reader的子类FileReader。
IO程序的书写
1.导入IO包中的类
2.进行IO异常处理
3.在finally中对流进行关闭
思考:
1.有了垃圾回收机制为什么还要调用close方法进行关闭。
2.为什么IO异常一定要处理。
字符流——创建文件
1.创建流对象,建立数据存放文件
FileWriter fw = new FileWriter(“Test.txt”);
2.调用流对象的写入方法,将数据写入流
fw.write(“text”);
3.关闭流资源,并将流中的数据清空到文件中。
fw.close();
创建文件并写入数据实例:
import java.io.FileWriter;
import java.io.IOException;
public class FileWriterDemo {
public static void main(String[] args) throws IOException{
//创建一个FileWriter对象。该对象一被初始化就必须要明确被操作的文件。
//而且该文件会被创建到指定目录下。如果该目录下已有同名文件,将被覆盖。
//其实该步就是在明确数据要存放的目的地。
FileWriter fw = new FileWriter("HelloWorld.txt");
//调用write方法,将字符串写入到流中。
fw.write("Hello World");
//刷新流对象中的缓冲中的数据。
//将数据刷到目的地中。
//fw.flush();
//关闭流资源,但是关闭之前会刷新一次内部的缓冲中的数据。
//将数据刷到目的地中。
//和flush区别:flush刷新后,流可以继续使用,close刷新后,会将流关闭。
fw.close();
}
}
IO异常的处理方式
import java.io.FileWriter;
import java.io.IOException;
/*
* IO异常的处理方式
*/
public class FileWriterDemo2 {
public static void main(String[] args) {
FileWriter fw = null;
try {
fw = new FileWriter("HelloWorld.txt");
fw.write("Hello World");
} catch (IOException e) {
System.out.println(e.getMessage());
} finally{
try {
if(fw!=null){
fw.close();
}
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
}
思考:
如果想在原有文件上继续加入新的数据呢?
使用FileWriter(File file, boolean append)构造函数,如果第二个参数为 true,则将字节写入文件末尾处,而不是写入文件开始处。
对已有文件的数据续写实例:
import java.io.FileWriter;
import java.io.IOException;
/*
* 演示对已有文件的数据续写。
*/
public class FileWriterDemo3 {
public static void main(String[] args) {
FileWriter fw = null;
try {
//传递一个true参数,代表不覆盖已有的文件。并在已有文件的末尾处进行数据续写。
fw = new FileWriter("HelloWorld.txt",true);
fw.write(",Java");
} catch (IOException e) {
System.out.println(e.getMessage());
} finally{
try {
if(fw!=null){
fw.close();
}
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
}
字符流——读取文件
1.建立一个流对象,将已存在的一个文件加载进流。
FileReader fr = new FileReader(“Test.txt”);
2.创建一个临时存放数据的数组。
char[] ch = new char[1024];
3.调用流对象的读取方法将流中的数据读入到数组中。
fr.read(ch);
读取文件方式:
1.通过字符进行读取。
2.通过字符数组进行读取。
读取文件实例(通过字符进行读取):
import java.io.FileReader;
import java.io.IOException;
public class FileReaderDemo {
public static void main(String[] args) {
FileReader fr = null;
try {
//创建一个文件读取流对象,和指定名称的文件相关联。
//要保证该文件是已经存在的,如果不存在,会发生异常FileNotFoundException
fr = new FileReader("HelloWorld.txt");
//调用读取流对象的read方法。
//read():一次读一个字符。而且会自动往下读。
int ch = 0;
while((ch = fr.read())!= -1){
System.out.print((char)ch);
}
} catch (IOException e) {
System.out.println(e.getMessage());
} finally{
if(fr!=null){
try {
fr.close();
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
}
}
}
读取文件实例(通过字符数组进行读取):
import java.io.FileReader;
import java.io.IOException;
public class FileReaderDemo {
public static void main(String[] args) {
FileReader fr = null;
try {
//创建一个文件读取流对象,和指定名称的文件相关联。
//要保证该文件是已经存在的,如果不存在,会发生异常FileNotFoundException
fr = new FileReader("HelloWorld.txt");
//调用读取流对象的read方法。
//read():一次读一个字符。而且会自动往下读。
int ch = 0;
while((ch = fr.read())!= -1){
System.out.print((char)ch);
}
} catch (IOException e) {
System.out.println(e.getMessage());
} finally{
if(fr!=null){
try {
fr.close();
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
}
}
}
思考:
1.在加载文件时候是否是将文件全部加载进流?
数据是先加载在内存区,然后又被马上被读取出去。
2.为什么定义数组,要定义多大呢?
更好的存储数据,一般定义为1024的倍数。
注意:
1.定义文件路径时,可以用“/”或者“\\”。
2.在创建一个文件时,如果目录下有同名文件将被覆盖。
3.在读取文件时,必须保证该文件已存在,否则出异常。
文本文件复制
复制的原理:其实就是将一个盘下的文件数据存储到另外一个盘的一个文件中。
文件复制实例:
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
/*
需求:将C盘一个文本文件复制到D盘。
复制的原理:
其实就是将C盘下的文件数据存储到D盘的一个文件中。
步骤:
1,在D盘创建一个文件。用于存储C盘文件中的数据。
2,定义读取流和C盘文件关联。
3,通过不断的读写完成数据存储。
4,关闭资源。
*/
public class CopyText {
public static void main(String[] args) {
copy();
}
//文件复制
public static void copy(){
FileReader fr = null;
FileWriter fw = null;
try {
fr = new FileReader("HelloWorld.txt");
fw = new FileWriter("HelloWorld_copy.txt");
//从C盘读一个字符,就往D盘写一个字符。
//int num;
// while ((num =fr.read())!=-1) {
// fw.write(num);
// }
//一次写多个字符
char ch[] = new char[1024];
int len;
while ((len =fr.read(ch))!=-1) {
fw.write(ch,0,len);
}
} catch (IOException e) {
throw new RuntimeException("复制失败");
} finally{
if(fr != null){
try {
fr.close();
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
if(fw != null){
try {
fw.close();
} catch (IOException e) {
System.out.println(e.getMessage());
}
}
}
}
}