- 浏览: 22315 次
- 性别:
- 来自: 杭州
最新评论
Java处理的数据流主要分为字节流和字符流。字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,而字节流处理单元为1个字节,操作字节和字节数组。
字节流的抽象基类:InputStream,OutputStream。
字符流的抽象基类:Reader,Writer。都是存放在java.io包中
字符流:
Reader与Writer
1,FileReader:将一个文件按字符流的形式进行读取操作。方法只包含从Reader和InputStream中所申明的方法。
FileWriter:产生一个输出流,向文件输出数据。方法只包含从Writer和OutputStream中所申明的方法。
code:
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class Test{
public static void main(String[] args) {
FileReader fr = null;
FileWriter fw = null;
try {
fr = new FileReader("test.txt");
fw = new FileWriter("test1.txt");
//fw = new FileWriter("test1.txt", true);在文件末尾以添加的形式写字符
char buf[] = new char[1024];
int ch = 0;
while((ch = fr.read())!=-1){//最后一个返回-1
fw.write(ch);//读取一个字符
fw.flush();//刷新流的缓冲
}
while ((ch=fr.read(buf))!=-1) {//返回每次读取的长度,没读取到返回-1
fw.write(buf, 0, ch);//读取多个字符存入buf中
fw.flush();
}
} catch (FileNotFoundException e) {
throw new RuntimeException("文件不存在!");
} catch (IOException e) {
throw new RuntimeException("读写失败!");
}finally{
try {
if(fr!=null)//必须对流进行判断,否则,有可能产生空指针异常
fr.close();//关闭流前会刷新流的缓冲
} catch (IOException e) {
System.out.println("Reader流关闭失败");
}
try {
if(fw!=null)
fw.close();
} catch (IOException e) {
System.out.println("Writer流关闭失败");
}
}
}
}
2,BufferedReader:从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取.(可以设置缓冲区大小)其实是Reader的一个装饰类,构造函数的参数为所有Reader的子类。
BufferedWriter:将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入.(可以设置缓冲区大小)其实是Writer的一个装饰类,构造函数的参数为所有Writer的子类。
code:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class Test{
public static void main(String[] args) {
FileReader fr = null;
BufferedReader br = null;
FileWriter fw = null;
BufferedWriter bw = null;
try {
fr = new FileReader("test.txt");
br = new BufferedReader(fr);
fw = new FileWriter("test1.txt");
bw = new BufferedWriter(fw);
String s;
while ((s=br.readLine())!=null) {//bufferedReader提供一个读取一行的方法
bw.write(s);
bw.newLine();//bufferedwriter提供一个添加新行的方法
}
} catch (FileNotFoundException e) {//是io异常的一格子类
throw new RuntimeException("文件不存在!");
} catch (IOException e) {
throw new RuntimeException("读写失败!");
}finally{
try {
if(br!=null)
br.close();//关闭缓冲内会自动关闭流
} catch (IOException e) {
System.out.println("Reader流关闭失败");
}
try {
if(bw!=null)
bw.close();
} catch (IOException e) {
System.out.println("Writer流关闭失败");
}
}
}
}
BufferedReader的子类:LineNumberReader也是一个装饰类,额外提供了获取和设置行号的函数getLineNumber()和setLineNumber()。
code:
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.LineNumberReader;
public class Test{
public static void main(String[] args) {
FileReader fr = null;
LineNumberReader lnr = null;
FileWriter fw = null;
BufferedWriter bw = null;
try {
fr = new FileReader("test.txt");
lnr = new LineNumberReader(fr);
fw = new FileWriter("test1.txt");
bw = new BufferedWriter(fw);
String s;
lnr.setLineNumber(100);//设置起始行号
while ((s=lnr.readLine())!=null) {//bufferedReader提供一个读取一行的方法
s=lnr.getLineNumber()+":"+s;
bw.write(s);
bw.newLine();//bufferedwriter提供一个添加新行的方法
bw.flush();
}
} catch (FileNotFoundException e) {//是io异常的一格子类
throw new RuntimeException("文件不存在!");
} catch (IOException e) {
throw new RuntimeException("读写失败!");
}finally{
try {
if(lnr!=null)
lnr.close();//关闭缓冲内会自动关闭流
} catch (IOException e) {
System.out.println("Reader流关闭失败");
}
try {
if(bw!=null)
bw.close();
} catch (IOException e) {
System.out.println("Writer流关闭失败");
}
}
}
} 4,InputStreamReader 类是从字节流到字符流的桥梁:它读入字节,并根据指定的编码方式,将之转换为字符流。使用的编码方式可能由名称指定,或平台可接受的缺省编码方式。(可以设置编码方式UTF-8,GBK)
OutputStreamWriter 将多个字符写入到一个输出流,根据指定的字符编码将多个字符转换为字节。每个 OutputStreamWriter 合并它自己的 CharToByteConverter, 因而是从字符流到字节流的桥梁。
code:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class Test{
public static void main(String[] args) {
BufferedReader br = null;
InputStreamReader isr = null;
OutputStreamWriter osw = null;
BufferedWriter bw = null;
try {
isr = new InputStreamReader(System.in);//system.in返回的是字节流。将字节流转成字符流来使用reader中的特有方法
br = new BufferedReader(isr);
osw = new OutputStreamWriter(System.out);//system.out返回的也是字节流。将字节流转成字符流来使用Writer中的特有方法
bw = new BufferedWriter(osw);
String s;
while ((s=br.readLine())!=null) {//bufferedReader提供一个读取一行的方法
bw.write(s);
bw.newLine();//bufferedwriter提供一个添加新行的方法
bw.flush();
}
} catch (IOException e) {
throw new RuntimeException("读写失败!");
}finally{
try {
if(br!=null)
br.close();//关闭缓冲内会自动关闭流
} catch (IOException e) {
System.out.println("Reader流关闭失败");
}
try {
if(bw!=null)
bw.close();
} catch (IOException e) {
System.out.println("Writer流关闭失败");
}
}
}
}
5,PipedReader:实现了 pipe 的概念,主要在线程中使用。管道输入流是指一个通讯管道的接收端。一个线程通过管道输出流发送数据,而另一个线程通过管道输入流读取数据,这样可实现两个线程间的通讯。
PipedWriter:实现了 pipe 的概念,主要在线程中使用。管道输出流是指一个通讯管道的接收端。
code:
import java.io.IOException;
import java.io.PipedReader;
import java.io.PipedWriter;
class read implements Runnable{
private PipedReader pr;
public read(PipedReader pr) {
this.pr = pr;
}
public void run() {
try {
char []buf = new char[1024];
pr.read(buf);
System.out.println(buf);
} catch (IOException e) {
throw new RuntimeException("流读取失败!");
}finally{
try {
pr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
class write implements Runnable{
private PipedWriter pw;
public write(PipedWriter pw) {
this.pw = pw;
}
public void run() {
try {
pw.write("这是什么情况!");
} catch (IOException e) {
throw new RuntimeException("流读取失败!");
}finally{
try {
pw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public class Test{
public static void main(String[] args) {
PipedReader pr = new PipedReader();
PipedWriter pw = new PipedWriter();
try {
pr.connect(pw);
} catch (IOException e) {
throw new RuntimeException("连接失败!");
}
new Thread(new read(pr)).start();
new Thread(new write(pw)).start();
}
}
【结果】
这是什么情况!
6,CharArrayReader:实现一个可用作字符输入流的字符缓冲区。(可以不需要close关闭)
CharArrayWrite:实现一个可用作 Writer 的字符缓冲区。缓冲区会随向流中写入数据而自动增长。可使用 toCharArray() 和 toString() 获取数据。(用流的思想来操作数组)
StringReader:源为一个字符串的字符流。
StringWriter:一个字符流,可以用其回收在字符串缓冲区中的输出来构造字符串。
字节流:
InputStream与OutputStream
1,FileInputStream:把一个文件作为 InputStream ,实现对文件的读取操作
FileOutputStream:文件输出流是向 File 或 FileDescriptor 输出数据的一个输出流。
与FileReader、FileWriter对应。
2,BufferedInputStream:另一个输入流添加一些功能,即缓冲输入以及支持 mark 和 reset 方法的能力。在创建 BufferedInputStream 时,会创建一个内部缓冲区数组。
BufferedOutputStream :实现缓冲的输出流。通过设置这种输出流,应用程序就可以将各个字节写入底层输出流中,而不必针对每次字节写入调用底层系统。
与BufferedReader、BufferedWriter对应。
3, PipedInputStream:管道输入流应该连接到管道输出流;管道输入流提供要写入管道输出流的所有数据字节。
PipedOutputStream:将管道输出流连接到管道输入流来创建通信管道。管道输出流是管道的发送端。
与PipedReader、PipedWriter对应
字节流的抽象基类:InputStream,OutputStream。
字符流的抽象基类:Reader,Writer。都是存放在java.io包中
字符流:
Reader与Writer
1,FileReader:将一个文件按字符流的形式进行读取操作。方法只包含从Reader和InputStream中所申明的方法。
FileWriter:产生一个输出流,向文件输出数据。方法只包含从Writer和OutputStream中所申明的方法。
code:
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class Test{
public static void main(String[] args) {
FileReader fr = null;
FileWriter fw = null;
try {
fr = new FileReader("test.txt");
fw = new FileWriter("test1.txt");
//fw = new FileWriter("test1.txt", true);在文件末尾以添加的形式写字符
char buf[] = new char[1024];
int ch = 0;
while((ch = fr.read())!=-1){//最后一个返回-1
fw.write(ch);//读取一个字符
fw.flush();//刷新流的缓冲
}
while ((ch=fr.read(buf))!=-1) {//返回每次读取的长度,没读取到返回-1
fw.write(buf, 0, ch);//读取多个字符存入buf中
fw.flush();
}
} catch (FileNotFoundException e) {
throw new RuntimeException("文件不存在!");
} catch (IOException e) {
throw new RuntimeException("读写失败!");
}finally{
try {
if(fr!=null)//必须对流进行判断,否则,有可能产生空指针异常
fr.close();//关闭流前会刷新流的缓冲
} catch (IOException e) {
System.out.println("Reader流关闭失败");
}
try {
if(fw!=null)
fw.close();
} catch (IOException e) {
System.out.println("Writer流关闭失败");
}
}
}
}
2,BufferedReader:从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取.(可以设置缓冲区大小)其实是Reader的一个装饰类,构造函数的参数为所有Reader的子类。
BufferedWriter:将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写入.(可以设置缓冲区大小)其实是Writer的一个装饰类,构造函数的参数为所有Writer的子类。
code:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class Test{
public static void main(String[] args) {
FileReader fr = null;
BufferedReader br = null;
FileWriter fw = null;
BufferedWriter bw = null;
try {
fr = new FileReader("test.txt");
br = new BufferedReader(fr);
fw = new FileWriter("test1.txt");
bw = new BufferedWriter(fw);
String s;
while ((s=br.readLine())!=null) {//bufferedReader提供一个读取一行的方法
bw.write(s);
bw.newLine();//bufferedwriter提供一个添加新行的方法
}
} catch (FileNotFoundException e) {//是io异常的一格子类
throw new RuntimeException("文件不存在!");
} catch (IOException e) {
throw new RuntimeException("读写失败!");
}finally{
try {
if(br!=null)
br.close();//关闭缓冲内会自动关闭流
} catch (IOException e) {
System.out.println("Reader流关闭失败");
}
try {
if(bw!=null)
bw.close();
} catch (IOException e) {
System.out.println("Writer流关闭失败");
}
}
}
}
BufferedReader的子类:LineNumberReader也是一个装饰类,额外提供了获取和设置行号的函数getLineNumber()和setLineNumber()。
code:
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.LineNumberReader;
public class Test{
public static void main(String[] args) {
FileReader fr = null;
LineNumberReader lnr = null;
FileWriter fw = null;
BufferedWriter bw = null;
try {
fr = new FileReader("test.txt");
lnr = new LineNumberReader(fr);
fw = new FileWriter("test1.txt");
bw = new BufferedWriter(fw);
String s;
lnr.setLineNumber(100);//设置起始行号
while ((s=lnr.readLine())!=null) {//bufferedReader提供一个读取一行的方法
s=lnr.getLineNumber()+":"+s;
bw.write(s);
bw.newLine();//bufferedwriter提供一个添加新行的方法
bw.flush();
}
} catch (FileNotFoundException e) {//是io异常的一格子类
throw new RuntimeException("文件不存在!");
} catch (IOException e) {
throw new RuntimeException("读写失败!");
}finally{
try {
if(lnr!=null)
lnr.close();//关闭缓冲内会自动关闭流
} catch (IOException e) {
System.out.println("Reader流关闭失败");
}
try {
if(bw!=null)
bw.close();
} catch (IOException e) {
System.out.println("Writer流关闭失败");
}
}
}
} 4,InputStreamReader 类是从字节流到字符流的桥梁:它读入字节,并根据指定的编码方式,将之转换为字符流。使用的编码方式可能由名称指定,或平台可接受的缺省编码方式。(可以设置编码方式UTF-8,GBK)
OutputStreamWriter 将多个字符写入到一个输出流,根据指定的字符编码将多个字符转换为字节。每个 OutputStreamWriter 合并它自己的 CharToByteConverter, 因而是从字符流到字节流的桥梁。
code:
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
public class Test{
public static void main(String[] args) {
BufferedReader br = null;
InputStreamReader isr = null;
OutputStreamWriter osw = null;
BufferedWriter bw = null;
try {
isr = new InputStreamReader(System.in);//system.in返回的是字节流。将字节流转成字符流来使用reader中的特有方法
br = new BufferedReader(isr);
osw = new OutputStreamWriter(System.out);//system.out返回的也是字节流。将字节流转成字符流来使用Writer中的特有方法
bw = new BufferedWriter(osw);
String s;
while ((s=br.readLine())!=null) {//bufferedReader提供一个读取一行的方法
bw.write(s);
bw.newLine();//bufferedwriter提供一个添加新行的方法
bw.flush();
}
} catch (IOException e) {
throw new RuntimeException("读写失败!");
}finally{
try {
if(br!=null)
br.close();//关闭缓冲内会自动关闭流
} catch (IOException e) {
System.out.println("Reader流关闭失败");
}
try {
if(bw!=null)
bw.close();
} catch (IOException e) {
System.out.println("Writer流关闭失败");
}
}
}
}
5,PipedReader:实现了 pipe 的概念,主要在线程中使用。管道输入流是指一个通讯管道的接收端。一个线程通过管道输出流发送数据,而另一个线程通过管道输入流读取数据,这样可实现两个线程间的通讯。
PipedWriter:实现了 pipe 的概念,主要在线程中使用。管道输出流是指一个通讯管道的接收端。
code:
import java.io.IOException;
import java.io.PipedReader;
import java.io.PipedWriter;
class read implements Runnable{
private PipedReader pr;
public read(PipedReader pr) {
this.pr = pr;
}
public void run() {
try {
char []buf = new char[1024];
pr.read(buf);
System.out.println(buf);
} catch (IOException e) {
throw new RuntimeException("流读取失败!");
}finally{
try {
pr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
class write implements Runnable{
private PipedWriter pw;
public write(PipedWriter pw) {
this.pw = pw;
}
public void run() {
try {
pw.write("这是什么情况!");
} catch (IOException e) {
throw new RuntimeException("流读取失败!");
}finally{
try {
pw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
public class Test{
public static void main(String[] args) {
PipedReader pr = new PipedReader();
PipedWriter pw = new PipedWriter();
try {
pr.connect(pw);
} catch (IOException e) {
throw new RuntimeException("连接失败!");
}
new Thread(new read(pr)).start();
new Thread(new write(pw)).start();
}
}
【结果】
这是什么情况!
6,CharArrayReader:实现一个可用作字符输入流的字符缓冲区。(可以不需要close关闭)
CharArrayWrite:实现一个可用作 Writer 的字符缓冲区。缓冲区会随向流中写入数据而自动增长。可使用 toCharArray() 和 toString() 获取数据。(用流的思想来操作数组)
StringReader:源为一个字符串的字符流。
StringWriter:一个字符流,可以用其回收在字符串缓冲区中的输出来构造字符串。
字节流:
InputStream与OutputStream
1,FileInputStream:把一个文件作为 InputStream ,实现对文件的读取操作
FileOutputStream:文件输出流是向 File 或 FileDescriptor 输出数据的一个输出流。
与FileReader、FileWriter对应。
2,BufferedInputStream:另一个输入流添加一些功能,即缓冲输入以及支持 mark 和 reset 方法的能力。在创建 BufferedInputStream 时,会创建一个内部缓冲区数组。
BufferedOutputStream :实现缓冲的输出流。通过设置这种输出流,应用程序就可以将各个字节写入底层输出流中,而不必针对每次字节写入调用底层系统。
与BufferedReader、BufferedWriter对应。
3, PipedInputStream:管道输入流应该连接到管道输出流;管道输入流提供要写入管道输出流的所有数据字节。
PipedOutputStream:将管道输出流连接到管道输入流来创建通信管道。管道输出流是管道的发送端。
与PipedReader、PipedWriter对应
发表评论
-
java-HashMap
2014-04-09 01:17 0HashMap继承AbstractMap并实现Map接口。类图 ... -
Java中多线程与多线程同步
2014-04-07 21:25 0多线程的目的: 多线程实现了程序的并发执行。 Java 中线程 ... -
Java多线程通信
2014-04-07 21:21 459上一篇介绍Java提供synchr ... -
Java集合类(Set和List)
2014-04-07 21:15 593java提供两种存储对象的方式:数组和集合类。 两者的主要区别 ... -
Java中两个集合工具类:Collections和Arrays
2014-04-07 21:08 1136为了方便的对Array对象、Collection对象进行操作, ... -
SQL小结
2014-04-07 16:29 568<转>[size=medium][/size] 结 ... -
hibernate缓存
2014-03-18 18:52 416hibernate缓存深入详解 -
SSH总结
2014-03-17 18:39 550struts hibernate spring -
sql order by 排序控制
2013-10-17 16:49 558SELECT * FROM table ta order ... -
在线代码格式化
2013-08-26 16:42 619http://www.ostools.net/ -
判断java中string型变量是否为空
2013-08-12 19:02 554<s:if test='actionItem.deleg ... -
多浏览器兼容问题 IE Firefox Chrome
2013-08-12 18:39 1423[size=x-large]在测试与各个浏览器兼容性的 ... -
Cron4j Scheduler
2012-07-06 18:15 3494Cron4j is a scheduler for the ... -
Integrating Jasypt with Hibernate
2012-06-25 18:29 2022[size=medium]Integrating Jasypt ...
相关推荐
### Java学习IO流小结——字符流 #### 知识点概述 在Java中,处理文件和数据流是一项基本而重要的任务。IO流是Java语言中处理输入/输出的重要工具,它包括字节流和字符流两大类。本文将重点讨论字符流的相关概念...
JAVA IO流小结 JAVA IO流是指Java语言中用来实现输入/输出操作的机制。IO流是指任何有能力产出数据的数据源对象或者有能力接收数据的数据源对象。他屏蔽了实际的I/O设备处理数据的细节。 一、流的定义和分类 流是...
主要描述了常用字节流的用法,附上一些代码!
#### 九、小结 Java I/O系统是Java编程的重要组成部分,通过掌握不同的流类及其使用方法,可以有效地处理文件读写、网络通信等常见的输入输出操作。了解I/O流的基本概念、分类以及常用的类和接口,可以帮助开发者更...
简洁分类 代码直接使用 InputStream OutputStream Reader Writer FileInputStream FileOutputStream FileReader FileWriter InputStreamReader OutputStreamWriter BufferedReader BufferedWriter ...
### Java基础知识小结 #### 1.1 `getPath()`、`getAbsolutePath()`、`getCanonicalPath()`的区别 在Java中,处理文件路径时经常会用到`getPath()`、`getAbsolutePath()`以及`getCanonicalPath()`这三个方法。它们...
`BufferedReader`是`java.io`包中的类,它用于高效地读取字符流。使用`BufferedReader`之前,需要引入`Reader`类: ```java import java.io.Reader; ``` 然后创建`BufferedReader`对象,通常通过`...
- **小结** - Java 的 I/O 包提供了丰富的类来处理文件和流,包括基本的字节流、字符流、文件流、缓冲流等。 **1.4 Java中的一些常用词汇** - **术语解释** - 如继承、封装、多态等。 **1.5 J2SE学习中的30个...
它需要`java.io.BufferedReader`和`java.io.InputStreamReader`两个包。以下是使用`BufferedReader`的例子: ```java import java.io.BufferedReader; import java.io.IOException; import java.io....
Java 中IO流字符流详解及实例 ...6. 小结 Java 中的 IO 流字符流是处理文本文件和字符串的基本接口。通过使用字符流,可以实现高效的文本处理和文件读写操作。同时,字符流的过滤器也提供了更多的功能和灵活性。
`BufferedReader` 类属于 `java.io` 包,它提供了一种更高效的输入方式,因为它可以一次性读取一行数据,而不是单个字符。使用前同样需要导入相关包: ```java import java.io.BufferedReader; import java.io....
- 文件流:面向对象的语言如C++和Java提供了文件流的概念,允许以对象的方式进行IO操作,如`ifstream`和`ofstream`。 - 并发访问:在多线程环境中,需要同步对文件的访问,以防止数据冲突。 - 文件权限:操作系统...
Java中IO流详解 Java中IO流详解是指Java语言中负责输入输出操作的类库,主要...小结:Java中IO流详解是一个复杂的知识点,包括字节流、字符流和转换流等几个方面。了解Java中IO流的工作原理和使用方法是非常重要的。
- **1.4 本章小结** - 对求职过程进行了总结,并强调了成功应聘的关键因素。 #### 二、Java试题篇 - **2.1 Java概述和开发环境** - **理解Java**:介绍Java的历史背景、特点及其应用场景。 - **构建Java开发...
为了全面理解Java基础知识,本小结将按照给定的文件名,逐一解析关键知识点。 1. **Java基础知识** 这一部分通常包括Java语言的基础语法,如变量、数据类型、运算符、流程控制(if语句、switch、for、while循环等...
#### 小结 本文详细介绍了如何使用Java的`File`类进行文件的基本操作,并深入探讨了Java中的流(Streams)概念以及它们在文件读写中的具体应用。通过这些知识,开发者可以更有效地处理文件系统的各种需求,无论是...