IO流用来处理设备间的数据传送
Java对数据的操作是通过流的方式进行的
Java用于操作流的对象都在io包中
数据按照操作数据的方式分为两种:字节流和字符流
流按照流向分为:输入流和输出流
硬盘存储的数据时间长,断电后仍然存在
内存存数的数据时间短,断电后不存在。
硬盘读写数据慢,内存读取数据快
Java中IO的输入和输出是相对于内存的
从硬盘向内存中写数据,称为输入
从内存向硬盘中写数据,称为输出
外围设备包括 打印机,硬盘,U盘等
在计算机中,所有的数据都是按照二进制的形式存储的。
用于处理字节数据的数据流对象,称为字节流。----处理美国标准编码
用于处理字符数据的数据流对象,称为字符流。----为了统一编码而出现
一个文字在不同的编码表中,编码后的结果可能存在不一致的问题
用于读取字节流的数据流对象和编码方式相结合在一起,用来解决编码问题。
字符流的由来:其实就是字节流读取文字字节数据后,不直接操作而是先查编码表
获取对应的文字,再对文字进行操作处理
字符流 = 字节流 + 编码表
字节流的抽象基类:
InputStream输入流对象
OutputStream输出流对象
字符流的抽象基类
Reader输入流对象
Writer输出流对象
注:由这四个类派生出来的子类名称都是以其父类名作为子类名的后缀的。
四个类派生出来的子类的前缀名都是这个子类的功能。
要操作什么类型的文件,就找以该类型功能开头的文件操作类。
如 InputStream的子类 FileInputStream
Reader的子类FileReader
如果要操作文字数据,优先考虑字符流,而且要将数据从内存中写道硬盘上,
要使用字符流中的输出流 Writer
数据在硬盘中的基本体现是文件
import java.io.FileWriter;
import java.io.IOException;
class FileWriterDemo
{
public static void main(String[] args) throws IOException
{
//创建一个可以往文件中写入数据的字符输出流对象
/**既然是往文件中写入文字数据,那么在创建对象时,要操作的文件即必须是明确的。
如果文件不存在,则创建该文件;如果文件存在,则会创建并覆盖文件
*/
FileWriter fw = new FileWriter("test.txt");
//向文件中写入数据。调用的是Writer对象中的write(String)方法
fw.write("adfsfwerfwefsd");
//写完的数据存在缓冲区中。需要刷新缓冲区,才能把数据写入到文件中。
//写完一次数据就需要刷新一次缓冲区即flush()可以调用多次
fw.flush();
/**闭关输出流,输出前会刷新一次缓冲区。
流关闭时,最先打开的最后关闭,最后打开的最先关闭,即按照与打开顺序相反的顺序关闭。关闭流以后,不能再写入数据和刷新缓冲区
*/
fw.close();
}
}
Linux下换行是 \n
Windows下的换行是\r\n
获取系统中的换行标志
private static final String LINE_SEPARATOR = System.getProperty(“line.separator”);
向文件中追加数据
import java.io.FileWriter;
import java.io.IOException;
class FileWriterDemo
{
public static void main(String[] args) throws IOException
{
//创建一个可以往文件中写入数据的字符输出流对象
/**既然是往文件中写入文字数据,那么在创建对象时,要操作的文件即必须是明确的。
如果文件不存在,则创建该文件;如果文件存在,则会创建并覆盖文件
如果在构造函数中加入true,可以对文件进行续写
*/
FileWriter fw = new FileWriter("test.txt",true);
//向文件中写入数据。调用的是Writer对象中的write(String)方法
fw.write("adfsfwerfwefsd");
//写完的数据存在缓冲区中。需要刷新缓冲区,才能把数据写入到文件中。
//写完一次数据就需要刷新一次缓冲区
fw.flush();
//闭关输出流,输出前会刷新一次缓冲区。
fw.close();
}
}
自定义的类不要和Java.lang中提供的类重名,否则会导致Java.lang中提供的类在自定义类中无法使用
在文件操作中,只要进行文件的读写,就有肯能出现IOException
IO异常的简单处理
import java.io.FileWriter;
import java.io.IOException;
/**
IO异常的处理
对于每个部分的异常,都必须单独处理
关闭资源的语句写在finally语句中,资源在关闭时,必须判断是否为空。
如果不为空,则关闭资源,否则不用关闭资源。
在try语句中声明的变量,只在try语句中有效。
可以在try语句外声明变量,在 try语句中进行处理
流对象的处理方式:
在try语句外声明变量,在 try语句中进行处理
*/
class IOExceptionDemo
{
public static void main(String[] args)
{
FileWriter fw = null;
try{
fw = new FileWriter("test.txt",true);
}catch(IOException){
e.printStackTrace();
}finally{
if(fw != null)
try{
fw.close();
}catch(IOException){
e.printStackTrace();
}
}
}
}
字符读取流
需求:读取一个文件,将其中的字符打印到控制台
import java.io.FileReader;
import java.io.IOException;
class FileReaderDemo
{
public static void main(String[] args) throws IOException
{
//创建读取字符数据的流对象
/**在创建读取流时,必须要明确被读取的文件。
必须确保读取的文件是存在的
相当于用读取流关联一个已经存在的文件
*/
FileReader fr = new FileReader("test.txt");
/**用Reader中的read()方法读取数据
read()方法读取的是单个字符,读取一次,就返回一次
在字符可用、发生IO异常或者到达流的末尾前,此方法一直阻塞
返回
作为整数读取的字符,范围在0-65535之间,如果达到流的末尾
则返回-1
调用一次read就读取一次数据
读取完一次以后,下次在读取时,会从上次读取完的地方继续读取
*/
//int ch = fr.read();
//System.out.println((char)ch);
int ch;
while((ch = fr.read()) != -1){
System.out.print((char)ch);
}
/**
使用read(char[]buf)方法读取字符流,
如果流没有到达末尾,返回读取的字符数
如果流到达末尾,返回-1,并返回读取到字符数,并停止读取。
char[] buf = new char[1024];
int num = fr.read(buf);
while(num != -1){
System.out.print(new String(buf,0,num));
}
*/
fr.close();
}
}