字符流(Java IO的Reader和Writer)功能与InputStream和OutputStream非常类似,InputStream和OutputStream基于字节处理,而字符流(Reader和Writer)是基于字符处理。主要用于读写文本。
字符输入流—Reader类—抽象类—不能new—子类
1.字符流相关的操作类
字符输出流—Writer类—抽象类—不能new—子类
1.FileWriter类
FileWriter类的构造方法
FileWriter(File file) 给一个File对象构造一个FileWriter对象。
FileWriter(File file, boolean append) 给一个File对象构造一个是否允许追加FileWriter对象。
FileWriter(String fileName) 给一个String对象构造一个FileWriter对象。
FileWriter(String fileName, boolean append)给一个String对象构造一个是否允许追加FileWriter对象。
例如:
package com.wangxing.zyb1;
import java.io.File;
import java.io.FileWriter;
import java.io.Writer;
public class FileWriterTest1 {
public static void main(String[] args)throws Exception {
//FileWriter(File file) 给一个File对象构造一个FileWriter对象。
File file1=new File("D:"+File.separator+"Java学习"+File.separator+"JAVA文件"+File.separator+"Test.txt");
FileWriter out1=new FileWriter(file1);
Writer out11=new FileWriter(file1);
//FileWriter(File file, boolean append) 给一个File对象构造一个是否允许追加FileWriter对象。
FileWriter out2=new FileWriter(file1,true);
FileWriter out22=new FileWriter(file1,true);
//FileWriter(String fileName) 给一个String对象构造一个FileWriter对象。
String filepath="D:"+File.separator+"Java学习"+File.separator+"JAVA文件"+File.separator+"Test.txt";
FileWriter out3=new FileWriter(filepath,true);
Writer out33=new FileWriter(filepath,true);
//FileWriter(String fileName, boolean append)给一个String对象构造一个是否允许追加FileWriter对象
FileWriter out4=new FileWriter(filepath,true);
Writer out44=new FileWriter(filepath,true);
}
}
FileWriter类的实例方法
void write(char[] cbuf) 写入一个字符数组。
void write(char[] cbuf, int off, int len) 写入字符数组的一部分。
void write(int c) 写一个字符
void write(String str) 写一个字符串
void write(String str, int off, int len) 写一个字符串的一部分。
void close() 关闭流,先刷新。
void flush() 刷新流。
package com.wangxing.zyb1;
import java.io.File;
import java.io.FileWriter;
import java.io.Writer;
public class FileWriterTest2 {
public static void main(String[] args)throws Exception {
File file1=new File("D:"+File.separator+"Java学习"+File.separator+"JAVA文件"+File.separator+"Test.txt");
FileWriter out=new FileWriter(file1,true);
String info="hello,world";
//void write(char[] cbuf) 写入一个字符数组。
//char[] cbuf=info.toCharArray();
//out.write(cbuf);
//out.flush();
//out.close();
//void write(char[] cbuf, int off, int len) 写入字符数组的一部分。
//char[] cbuf---被写出的字符数组
//int off ---被写出的字符数组的起始位置
//int len----被写出的字符个数
//char cbuf[]=info.toCharArray();
//out.write(cbuf, 6, 5);
//out.flush();
//out.close();
//void write(String str) 写一个字符串
//out.write(info);
//out.flush();
//out.close();
//void write(String str, int off, int len) 写一个字符串的一部分。
//String str----被写出的字符串
//int off---被写出的字符串中具体字符元素的起始位置
//int len---字符个数
//out.write(info, 6, 5);
//out.flush();
//out.close();
//void write(int c) 写一个字符
//out.write(97);
//out.write('A');
char[] cbuf=info.toCharArray();
for(char val:cbuf) {
out.write(val);
}
out.flush();
out.close();
}
}
例如:
2.BufferedWriter类
BufferedWriter类的构造方法
BufferedWriter(Writer out)通过字符输出流的对象创建BufferedWriter
BufferedWriter类的实例方法
void newline() 写一行行分隔符。
void write(char[] cbuf, int off, int len) 写入字符数组的一部分。
void write(int c) 写一个字符
void write(String s, int off, int len) 写一个字符串的一部分。
void close() 关闭流,先刷新。
void flush() 刷新流。
例如:
package com.wangxing.zyb2;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.Writer;
public class BufferedWriterTest1 {
public static void main(String[] args)throws Exception {
//BufferedWriter类的构造方法
//BufferedWriter(Writer out)通过字符输出流的对象创建BufferedWriter[高级输出流]
File file=new File("D:"+File.separator+"Java学习"+File.separator+"JAVA文件"+File.separator+"Test.txt");
FileWriter out=new FileWriter(file,true);
BufferedWriter writer1=new BufferedWriter(out);
//BufferedWriter类的实例方法
//void newline() 写一行行分隔符。
String info1="hello,world";
writer1.write(info1);
writer1.newline();
String info2="hello,wangxing";
writer1.write(info2);
writer1.flush();
writer1.close();
out.close();
//void write(char[] cbuf, int off, int len) 写入字符数组的一部分
//void write(int c) 写一个字符
//void write(String s) 写一个字符串
//void write(String s, int off, int len) 写一个字符串的一部分
//void close() 关闭流,先刷新
//void flush() 刷新流
}
}
3.OutputStreamWriter类
OutputStreamWriter类构造方法
OutputStreamWriter(OutputStream out)将字节输出流转换成字符输出流
例如:
package com.wangxing.zyb3;
import java.io.File;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.OutputStreamWriter;
public class OutputStreamWriterTest {
public static void main(String[] args)throws Exception {
//现在我们需要向文件写出一个字符串数据,如果使用字节输出流,需要将字符串数据转换成字节数组
//File file=new File("D:"+File.separator+"Java学习"+File.separator+"JAVA文件"+File.separator+"Test.txt");
//FileOutputStream out1=new FileOutputStream(file);
//String info="hello.lisi";
//out1.write(info.getBytes());
//out1.close();
//将字节输出流抓换成字符输出流,好一次性直接写出字符串
File file=new File("D:"+File.separator+"Java学习"+File.separator+"JAVA文件"+File.separator+"Test.txt");
FileOutputStream out1=new FileOutputStream(file);
OutputStreamWriter out=new OutputStreamWriter(out1);
String info="hello,zhaosi";
out.write(info);
out.close();
out1.close();
}
}
字符输入流—Reader类—抽象类—不能new—子类
1.FileReader类
FileReader类的构造方法
FileReader(File file) 给一个File对象构造一个FileReader对象。
FileReader(String fileName) 给一个String对象构造一个FileReader对象。
FileReader类的实例方法
int read() 读一个字符。返回值是读取的真实字符数据的整数值,如果已经达到流的末尾,则为-1
int read(char[] cbuf) 将字符读入数组。返回总字符数,如果到达文件末尾返回-1
void close() 关闭流并释放与之相关联的任何系统资源。
例如:
package com.wangxing.zyb1;
import java.io.File;
import java.io.FileReader;
import java.io.Reader;
public class FileReaderTest1 {
public static void main(String[] args)throws Exception{
//FileReader类的构造方法
//FileReader(File file) 给一个File对象构造一个FileReader对象
File file1=new File("D:"+File.separator+"Java学习"+File.separator+"JAVA文件"+File.separator+"Test.txt");
FileReader in1=new FileReader(file1);
Reader in11=new FileReader(file1);
//FileReader(String fileName) 给一个String对象构造一个FileReader对象
String filepath="D:"+File.separator+"Java学习"+File.separator+"JAVA文件"+File.separator+"Test.txt";
FileReader in2=new FileReader(filepath);
Reader in22=new FileReader(filepath);
//FileReader类的实例方法
//int read() 读一个字符。返回值是读取的真实字符数据的整数值,如果已经达到流的末尾,则为-1
//int temp=in1.read();
//System.out.println("temp=="+temp);
//System.out.println("temp=="+((char)temp));
//in1.close();
//定义保存数据的数组
//char[] chararray=new char[(int)file1.length()];
//定义数组下标
//int index=0;
//定义保存每一个读取来的数据的整数变量
//int temp=0;
//while((temp=in1.read())!=-1) {
// chararray[index]=(char)temp;
// index++;
//}
//String info=new String(chararray,0,index);
//System.out.println(info);
//in1.close();
//int read(char[] cbuf) 将字符读入数组。返回总字符数,如果到达文件末尾返回-1
//定义保存数据的数组
char[] chararray=new char[(int)file1.length()];
int len=in1.read(chararray);
String info=new String(chararray,0,len);
System.out.println(info);
in1.close();
//void close() 关闭流并释放与之相关联的任何系统资源。
}
}
2.BufferedReader类
BufferedReader类构造方法
BufferedReader(Reader in)通过字符输入流对象创建一个BufferedReader
BufferedReader类实例方法
int read() 读一个字符。返回值是读取的真实字符数据的整数值,如果已经达到流的末尾,则为-1。int int read(char[] cbuf) 将字符读入数组。返回总字符数,如果到达文件末尾返回-1
void close() 关闭流并释放与之相关联的任何系统资源。
String readLine() 读一行文字。
例如:
package com.wangxing.zyb2;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
public class BufferedReadertest2 {
public static void main(String[] args)throws Exception {
//BufferedReader类构造方法
//BufferedReader(Reader in)通过字符输入流对象创建一个BufferedReader
File file=new File("D:"+File.separator+"Java学习"+File.separator+"JAVA文件"+File.separator+"Test.txt");
FileReader in=new FileReader(file);
BufferedReader reader=new BufferedReader(in);
//BufferedReader类实例方法
//int read() 读一个字符。返回值是读取的真实字符数据的整数值,如果已经达到流的末尾,则为-1。int
//int read(char[] cbuf) 将字符读入数组。返回总字符数,如果到达文件末尾返回-1
//void close() 关闭流并释放与之相关联的任何系统资源。
//String readLine() 读一行文字。
//String info=reader.readLine();
//System.out.println(info);
//reader.close();
//in.close();
//定义保存读取来的每一行的数据
String info=null;
while((info=reader.readLine())!=null) {
System.out.println(info);
}
reader.close();
in.close();
}
}
BufferedReader和Scanner
readLine()从文件中读取 nextLine()从键盘输入中读取
我们能不能通过BufferedReader读取键盘输入的数据?????
Scanner的nextLine()方法为什么可以读取键盘输入????
因为Scanner对象在创建的时候使用了System.in,System.in默认就是键盘输入。
只要在创建BufferedReader对象的时候,使用System.in就可以完成键盘输入。
BufferedReader(Reader in)参数是Reader字符输入流
System.in----InputStream类型字节输入流
解决问题的关键就是将InputStream类型字节输入流转换成Reader字符输入流。
3.InputStreamReader类【字节输入流转成字符输入流】
InputStreamReader类构造方法
InputStreamReader(InputStream in)字节输入流转成字符输入流
例如:
package com.wangxing.zyb3;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class InputStreamReaderTest {
public static void main(String[] args)throws Exception {
InputStreamReader rea=new InputStreamReader(System.in);
BufferedReader reader=new BufferedReader(rea);
System.out.println("请输入姓名:");
String name=reader.readLine();
System.out.println("name=="+name);
reader.close();
rea.close();
}
}
3.反序列化—将2进制流数据转换成java对象的过程
需要ObjectInputStream类的Object readObject()方法读取对象。
ObjectInputStream类的构造方法
ObjectInputStream(InputStream in)
ObjectInputStream类的实例方法
Object readObject() 从ObjectInputStream读取一个对象。
例如:
package com.wangxing.zyb4;
import java.io.Serializable;
public class Student implements Serializable{
public void getStudent() {
System.out.println("Student类的实例方法");
}
}
package com.wangxing.zyb4;
import java.io.File;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
public class ObjectOutputStreamTest {
public static void main(String[] args)throws Exception {
//ObjectOutputStream的构造方法
//ObjectOutputStream(OutputStream out) 创建一个写入指定的OutputStream的ObjectOutputStream。
File file=new File("D:"+File.separator+"Java学习"+File.separator+"JAVA文件"+File.separator+"Test.txt");
OutputStream out=new FileOutputStream(file);
ObjectOutputStream out1=new ObjectOutputStream(out);
//实例方法
//void writeObject(Object obj) 将指定的对象写入ObjectOutputStream
Student student=new Student();
out1.writeObject(student);
out1.close();
out.close();
}
}
package com.wangxing.zyb4;
import java.io.File;
import java.io.FileOutputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
public class ObjectOutputStreamTest {
public static void main(String[] args)throws Exception {
//ObjectOutputStream的构造方法
//ObjectOutputStream(OutputStream out) 创建一个写入指定的OutputStream的ObjectOutputStream。
File file=new File("D:"+File.separator+"Java学习"+File.separator+"JAVA文件"+File.separator+"Test.txt");
OutputStream out=new FileOutputStream(file);
ObjectOutputStream out1=new ObjectOutputStream(out);
//实例方法
//void writeObject(Object obj) 将指定的对象写入ObjectOutputStream
Student student=new Student();
out1.writeObject(student);
out1.close();
out.close();
}
}



