【转载】J2SE知识点归纳笔记(七)---Java IO Part 4:基本字符流
2015-06-01 19:39
826 查看
接着上节字节流继续讲下
,IO流这块的内容挺重要,文件存储
注:本文转载自coder-pig
原文连接:http://blog.csdn.net/coder_pig/article/details/45333613
本节引言:
上一节中,我们对于Java IO流中的一些基本字节流进行了学习,他们都是InputStream与
OutputStream的子类;本节学习的字符流则是Reader与Writer的子类,好了,话不多说,
开始本节内容!
本节正文:
PS:
~小猪比较懒,所以就不一个个敲方法与解析了,直接截API的图吧,大家可自行翻阅API文档:
1)二进制文件与文本文件的区别:
答:如果一个文件专用于存储文本字符,而又没有包含文本之外的字符,
就可称之为文本文件。除此之外的文件就是二进制文件!
2)InputStream,OutputStream和Reader,Writer的区别:
答:前者是处理字节流,后者是处理字符流;
前者主要用于操作二进制数据的内容,后者则用于操作文本数据的内容;
前者直接操作byte数组,后者在操作时还会进行Decode和Encode~
构造方法:
代码示例:
这里演示的代码是:读取文件里的内容,以及完成简单的文件复制
接下来就来写代码了,大家自己写的时候记得进行异常捕获哦~
FileWriter fileWriter = new FileWriter("D:/one.txt");
fileWriter.write("我是萌萌的Coder-pig~");
fileWriter.close();
//读取文件中的内容:
FileReader fileReader = new FileReader("D:/one.txt");
//用户缓冲的字符数组
char[] cbuf = new char[1024];
int len = fileReader.read(cbuf);
System.out.println(new String(cbuf,0,len));
fileReader.close();
fileWriter.close();
运行截图:
这里有两种,随你选
方法1:
FileReader fileReader = new FileReader("D:/one.txt");
FileWriter fileWriter = new FileWriter("E:/one.txt");
//复制文件的最简单写法
char [] cbuf=new char[1024]; //字符数组
int len=fileReader.read(cbuf);
fileWriter.write(cbuf);
fileReader.close();
fileWriter.close();
方法2:
FileReader fileReader = new FileReader("D:/one.txt");
FileWriter fileWriter = new FileWriter("E:/one.txt");
char []buf = new char[1024];
int len = 0;
//读一个数组大小,写一个数组大小方法。
while((len = fileReader.read(buf)) != -1){
fileWriter.write(buf, 0, len);
}
fileReader.close();
fileWriter.close();
使用FileWriter的时候要注意:
FileReader与FileWriter读写文件采取的是平台默认编码(视操作系统而定),比如中文的win为gbk,
英文的win为iso,当要写入的文本文件编码和平台默认编码不一致时,就会出现中文乱码的情况。
这时可用OutputStreamWriter来读取。这个下面会讲,莫急~
前面我们学过了CharArrayInputStream与CharArrayOutputStream类,其实是类似的,只不过这个
是字符,前面两个是字节的而已,同样他有个toCharArray( )的方法!其实也没什么好讲的,用的并不多,
而且还要借助其他流..
这里给大家写个简单的写数据到文件的例子吧:
CharArrayWriter f = new CharArrayWriter();
String str = "才几点,睡你麻痹,起来嗨~";
char []buf1 = new char[str.length()];
str.getChars(0, str.length(), buf1, 0);
//写入缓冲区
f.write(buf1);
char c[] = f.toCharArray();
FileWriter f2 = new FileWriter("D:/test.txt");
f.writeTo(f2);
f2.close();
}
运行后就能看到D盘生成一个test.txt文件了,感觉还不如直接用FileWriter
这个和前面学的PipedInputStream与PipedWriter也是类似的,唯一的不同只是
byte[]变成了char[]而已!代码相比之前只是改了一点点而已~
import java.io.IOException;
import java.io.PipedOutputStream;
import java.io.PipedWriter;
public class SendThread extends Thread{
private PipedWriter out = new PipedWriter();
public PipedWriter getOutputStream(){
return out;
}
public void run(){
String message = "我是PipedWriter写入的东西" ;
try {
out.write(message.toCharArray());
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedReader;
public class ReceiverThread extends Thread {
private PipedReader in = new PipedReader();
public PipedReader getInputStream() {
return in;
}
public void run() {
char[] buf = new char[1024];
try {
int len = in.read(buf);
//打印另外一个线程输入的流
System.out.println(new String(buf, 0, len));
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
import java.io.PipedReader;
import java.io.PipedWriter;
public class Test5 {
public static void main(String[] args) {
ReceiverThread rThread = new ReceiverThread();
SendThread sThread = new SendThread();
// 获取对应流:
PipedWriter out = sThread.getOutputStream();
PipedReader in = rThread.getInputStream();
try {
// 管道链接
out.connect(in);
sThread.start();
rThread.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行截图:
这两个流是字节流与字符流进行转换的流,但是有一点要注意,这两个玩意竟然是:
FileReader与FileWriter的父类;
前者是Reader的子类,输入字节流向字符流的桥梁;
后者是Writer的子类,输出字符流向字节流的桥梁!
所以不管我们的操作如何,最后都是以字节的形式保存在文件中!!!
至于设置编码,可以直接在构造方法中定义:
比如:
new InputStreamReader(new FileInputStream("d:\\books.txt"),"UTF-8");
好吧,写个简单例子:
public static void main(String[] args) throws Exception {
String filename1 = "D:/file.txt";
String filename2 = "D:/副本-file.txt";
InputStreamReader isr = new InputStreamReader(new FileInputStream(filename1),"GBK");
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(filename2),"GBK");
int ch = 0;
while((ch = isr.read()) != -1)
{
System.out.print((char)ch);
osw.write(ch);
}
System.out.println("\n文件复制完毕");
isr.close();
osw.close();
}
最后说两句:
好的,关于Java IO中的字节流就说到这里,下一节我们要学习的是缓冲流,
最后回顾下本节内容:
①Reader类与Writer类的相关方法:
②2.FileReader与FileWriter类的使用:文件读写,但是他们是⑤的子类哦!
③CharArrayReader与CharArrayWriter类:字符数组类,用于缓冲的是字符数组;
④PipedReader与PipedWriter类:管道字符类,传递的是字符咯~
⑤InputStreamReader与InputStreamWriter:字符与字节的转换流,是②的父类,所有文件都是以字节
流的形式存储的哦,不管你是用FileInputStream,或者②⑤,结果都一样~
ps:其实本节和Part 3的内容差不多,只是字节改成字符而已~
,IO流这块的内容挺重要,文件存储
注:本文转载自coder-pig
原文连接:http://blog.csdn.net/coder_pig/article/details/45333613
本节引言:
上一节中,我们对于Java IO流中的一些基本字节流进行了学习,他们都是InputStream与
OutputStream的子类;本节学习的字符流则是Reader与Writer的子类,好了,话不多说,
开始本节内容!
本节正文:
1.Reader类与Writer类的相关方法:
PS:~小猪比较懒,所以就不一个个敲方法与解析了,直接截API的图吧,大家可自行翻阅API文档:
①Reader类的相关方法:
②Writer类的相关方法:
一些要搞清楚的东西:
1)二进制文件与文本文件的区别:答:如果一个文件专用于存储文本字符,而又没有包含文本之外的字符,
就可称之为文本文件。除此之外的文件就是二进制文件!
2)InputStream,OutputStream和Reader,Writer的区别:
答:前者是处理字节流,后者是处理字符流;
前者主要用于操作二进制数据的内容,后者则用于操作文本数据的内容;
前者直接操作byte数组,后者在操作时还会进行Decode和Encode~
2.FileReader与FileWriter类的使用:
构造方法:代码示例:
这里演示的代码是:读取文件里的内容,以及完成简单的文件复制
接下来就来写代码了,大家自己写的时候记得进行异常捕获哦~
①往文件写入数据,读取数据显示:
FileWriter fileWriter = new FileWriter("D:/one.txt"); fileWriter.write("我是萌萌的Coder-pig~");
fileWriter.close();
//读取文件中的内容:
FileReader fileReader = new FileReader("D:/one.txt");
//用户缓冲的字符数组
char[] cbuf = new char[1024];
int len = fileReader.read(cbuf);
System.out.println(new String(cbuf,0,len));
fileReader.close();
fileWriter.close();
运行截图:
②文件复制的实现:
这里有两种,随你选方法1:
FileReader fileReader = new FileReader("D:/one.txt");
FileWriter fileWriter = new FileWriter("E:/one.txt");
//复制文件的最简单写法
char [] cbuf=new char[1024]; //字符数组
int len=fileReader.read(cbuf);
fileWriter.write(cbuf);
fileReader.close();
fileWriter.close();
方法2:
FileReader fileReader = new FileReader("D:/one.txt");
FileWriter fileWriter = new FileWriter("E:/one.txt");
char []buf = new char[1024];
int len = 0;
//读一个数组大小,写一个数组大小方法。
while((len = fileReader.read(buf)) != -1){
fileWriter.write(buf, 0, len);
}
fileReader.close();
fileWriter.close();
③要注意的地方:
使用FileWriter的时候要注意:FileReader与FileWriter读写文件采取的是平台默认编码(视操作系统而定),比如中文的win为gbk,
英文的win为iso,当要写入的文本文件编码和平台默认编码不一致时,就会出现中文乱码的情况。
这时可用OutputStreamWriter来读取。这个下面会讲,莫急~
3.CharArrayReader与CharArrayWriter类:
前面我们学过了CharArrayInputStream与CharArrayOutputStream类,其实是类似的,只不过这个是字符,前面两个是字节的而已,同样他有个toCharArray( )的方法!其实也没什么好讲的,用的并不多,
而且还要借助其他流..
这里给大家写个简单的写数据到文件的例子吧:
CharArrayWriter f = new CharArrayWriter();
String str = "才几点,睡你麻痹,起来嗨~";
char []buf1 = new char[str.length()];
str.getChars(0, str.length(), buf1, 0);
//写入缓冲区
f.write(buf1);
char c[] = f.toCharArray();
FileWriter f2 = new FileWriter("D:/test.txt");
f.writeTo(f2);
f2.close();
}
运行后就能看到D盘生成一个test.txt文件了,感觉还不如直接用FileWriter
4.PipedReader与PipedWriter
这个和前面学的PipedInputStream与PipedWriter也是类似的,唯一的不同只是byte[]变成了char[]而已!代码相比之前只是改了一点点而已~
import java.io.IOException;
import java.io.PipedOutputStream;
import java.io.PipedWriter;
public class SendThread extends Thread{
private PipedWriter out = new PipedWriter();
public PipedWriter getOutputStream(){
return out;
}
public void run(){
String message = "我是PipedWriter写入的东西" ;
try {
out.write(message.toCharArray());
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedReader;
public class ReceiverThread extends Thread {
private PipedReader in = new PipedReader();
public PipedReader getInputStream() {
return in;
}
public void run() {
char[] buf = new char[1024];
try {
int len = in.read(buf);
//打印另外一个线程输入的流
System.out.println(new String(buf, 0, len));
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
import java.io.IOException;
import java.io.PipedInputStream;
import java.io.PipedOutputStream;
import java.io.PipedReader;
import java.io.PipedWriter;
public class Test5 {
public static void main(String[] args) {
ReceiverThread rThread = new ReceiverThread();
SendThread sThread = new SendThread();
// 获取对应流:
PipedWriter out = sThread.getOutputStream();
PipedReader in = rThread.getInputStream();
try {
// 管道链接
out.connect(in);
sThread.start();
rThread.start();
} catch (IOException e) {
e.printStackTrace();
}
}
}
运行截图:
5.InputStreamReader与InputStreamWriter
这两个流是字节流与字符流进行转换的流,但是有一点要注意,这两个玩意竟然是:FileReader与FileWriter的父类;
前者是Reader的子类,输入字节流向字符流的桥梁;
后者是Writer的子类,输出字符流向字节流的桥梁!
所以不管我们的操作如何,最后都是以字节的形式保存在文件中!!!
至于设置编码,可以直接在构造方法中定义:
比如:
new InputStreamReader(new FileInputStream("d:\\books.txt"),"UTF-8");
好吧,写个简单例子:
public static void main(String[] args) throws Exception {
String filename1 = "D:/file.txt";
String filename2 = "D:/副本-file.txt";
InputStreamReader isr = new InputStreamReader(new FileInputStream(filename1),"GBK");
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(filename2),"GBK");
int ch = 0;
while((ch = isr.read()) != -1)
{
System.out.print((char)ch);
osw.write(ch);
}
System.out.println("\n文件复制完毕");
isr.close();
osw.close();
}
最后说两句:
好的,关于Java IO中的字节流就说到这里,下一节我们要学习的是缓冲流,
最后回顾下本节内容:
①Reader类与Writer类的相关方法:
②2.FileReader与FileWriter类的使用:文件读写,但是他们是⑤的子类哦!
③CharArrayReader与CharArrayWriter类:字符数组类,用于缓冲的是字符数组;
④PipedReader与PipedWriter类:管道字符类,传递的是字符咯~
⑤InputStreamReader与InputStreamWriter:字符与字节的转换流,是②的父类,所有文件都是以字节
流的形式存储的哦,不管你是用FileInputStream,或者②⑤,结果都一样~
ps:其实本节和Part 3的内容差不多,只是字节改成字符而已~
相关文章推荐
- Java正则表达式
- java中long和Long的区别
- AOP jdk动态代理
- Java学习之Iterator(迭代器)的一般用法和详解
- java实现各种排序算法
- 观察者模式及Java实现例子
- java判断字符串编码
- Spring(AbstractRoutingDataSource)实现动态数据源切换
- spring的一些注解
- Struts2中 Result类型配置详解
- Java的static
- java Map及Map.Entry详解及用途
- java对象引用在方法中传递
- java个人学习笔记:面向对象的思想
- Spring Aop实例
- java并发之原子性与可见性
- spring在web容器启动时执行初始化方法
- Spring组件扫描<context:component-scan/>使用详解
- java中long和double类型操作的非原子性探究
- SpringMVC返回类型