按操作数据分为字节流和字符流;
按流向分为输入流和输出流;
字符流基类:
字符输入流(Reader):读取数据
int read(); 读取一个字符
int read(char[] buffer) 读取字符数组
字节输出流(Writer):写出数据
void write(int ch) 写入一个字符
void write(char[] buffer) 写入一个字符数组
void write(char[] buffer, int startIndex, int len) 写入字符数组的一部分
void write(String str) 写入一个字符串
void write(String str, int startIndex, int len) 写入字符串的一部分
字节流基类:
字节输入流(InputStream):读取数据
int read() 读取一个字节
int read(byte[] buffer) 读取字节数组
字节输出流(OutputStream):写出数据
void write(int ch) 写入一个字节
void write(byte[] buffer) 写入一个字节数组
void write(byte[] buffer, int startIndex, int len) 写入字节数组的一部分
字符输出流演示:
需求:把文字存入硬盘中
import java.io.*;
class FileWriterDemo
{
public static void main(String[] args) throws IOException
{
//创建一个FileWriter对象,该对象一初始化就必须明确被操作的文件
//而且该文件会创建在指定目录下,如果该目录中有同名的文件,则文件会被覆盖
//该步就是明确数据需要存放的目的地
FileWriter fw = new FileWriter("12358.txt");
//调用write方法,把字符串存入流中,而非直接存入目的地
fw.write("你好!!");
//刷新流对象中缓存的数据,将数据刷到目的地中
fw.flush();
//关闭流,先刷新一次
fw.close();
//关闭后无法向流中继续存入数据会报出流关闭异常
//fw.write("asdd");
}
}
IO异常的处理方式,为防止代码异常导致流无法关闭,所以必须使用finally关闭流。
FileWriter文件的续写:
示例:
import java.io.*;
class FileWriterDemo2
{
public static void main(String[] args)
{
//演示对已有文件的续写
FileWriter fw = null;
try
{
fw= new FileWriter("demo1.txt",true);//后面加true表示对文件续写
fw.write("ssssss\r\nnihao");
}
catch(IOException e)
{
System.out.println(e);
}
finally//关闭流
{
try//可能会遇到异常
{
if(fw!=null)
fw.close();
}
catch(IOException e)
{
System.out.println(e);
}
}
}
}
字符读取流演示:
需求:把硬盘中的文字读到控制台,
可以用字符数组来提高效率,使用read(char[])方法,
如果使用read()方法读取单个字符效率低
演示:read(char[])
import java.io.*;
class FileReaderTest
{
public static void main(String[] args)
{
FileReader fr = null;//定义一个空的读取类
try
{
fr = new FileReader("12358.java");//初始化读取类
char[] arr = new char[1024];//定义一个数组
int num = 0;
while((num=fr.read(arr))!=-1)//把文件读到字符数组中,判断文件中是否还有字符
{
System.out.println(new String(arr,0,num));//返回字符串
}
}
catch (IOException e)
{
System.out.println(e);
}
finally//关闭流
{
try//可能会遇到异常,所以继续try
{
if(fr!=null)
fr.close();
}
catch (IOException e)
{
System.out.println(e);
}
}
}
}
演示:read()
import java.io.*;
class FileReaderTest
{
public static void main(String[] args)
{
FileReader fr = null;//定义一个空的读取类
try
{
fr = new FileReader("12358.java");//初始化读取类
int ch = 0;
while((ch=fr.read())!=-1)//判断文件中是否还有字符
{
System.out.println((char)ch);//返回字符串
}
}
catch (IOException e)
{
System.out.println(e);
}
finally//关闭流
{
try//可能会遇到异常,所以继续try
{
if(fr!=null)
fr.close();
}
catch (IOException e)
{
System.out.println(e);
}
}
}
}
字符流缓冲区 目的:缓冲区是为了提高流的读取效率,所以没有空参数的构造函数。而且创建缓冲区前必须要先有流对象。
原理:使用了读取缓冲区的read方法,将读取到的字符进行缓冲并判断换行标记,将标记前的缓冲数据变成字符串返回。
写入换行使用BufferedWriter类中的newLine()方法。
读取一行数据使用BufferedReader类中的readLine()方法。
br.read():这个read方法是从缓冲区中读取字符数据,所以覆盖了父类中的read方法。
br.readLine():另外开辟了一个缓冲区,存储的是原缓冲区一行的数据,不包含换行符。
BufferedReader,BufferedWriter提高文本操作效率,添加缓冲区
BufferedReader:
String readLine()读一行的方法
BufferedWriter:
void newLine()写入一个行分隔符