字符流与字节流
一、常用字符流:
写:
FileWriter:用于新建一个写入字符的文件
BufferedWriter:将文本写入字符输出流
例:BufferedWriter s=new BufferedWriter(new FileWriter(“abc.txt”));
读:
FileReader:用于新建一个读取字符的文件
BufferedReader:将输入流中读取文本
例:BufferedReader s=new BufferedReader(new FileReader(“abc.txt”));
二、常用字节流:
写:
FileOutputStream:用于创建文件输出流,用于将数据写入
BufferedOutputStream:该类实现缓冲的输出流。
读:
FileInputStream:从文件系统中的某个文件中获得输入字节
BufferedInputStream:该类实现缓冲的输入流。
例:
BufferedInputStream s=newBufferedInputStream(new FileInputStream(“abc.txt”));
三、转换流:
OutputStreamWriter:是字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编码成字节。它使用的字符集可以由名称指定或显式给定,否则将接受平台默认的字符集。
InputStreamReader:是字节流通向字符流的桥梁:它使用指定的 charset 读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。
键盘录入:
BufferedReader bufr = new BufferedReader(newInputStreamReader(System.in));
输出到控制台:
BufferedWriter bufw = new BufferedWriter(newOutputStreamWriter(System.out));String line = null;
//通过while的循环,不断将数据通过键盘录入,将转换成大写字母输出到控制台上,当
录入为over时,将结束循环。
while((line=bufr.readLine())!=null){
if("over".equals(line))
break;
bufw.write(line.toUpperCase());//将输入的字符转成大写字符输出
bufw.newLine();
bufw.flush();
}
bufw.close();
bufr.close();
转换流 = 字节流+编码表。
转换流的子类File = 字节流 + 默认编码表。
FileReader fr = newFileReader("a.txt");
InputStreamReader isr = newInputStreamReader(new FileInputStream("a.txt"),"gbk");
四、其他流:
ByteArrayInputStream :在构造的时候,需要接收数据源,。而且数据源是一个字节数组。
ByteArrayOutputStream: 在构造的时候,不用定义数据目的,因为该对象中已经内部封装了可变长度的字节数组。
因为这两个流对象都操作的数组,并没有使用系统资源。
所以,不用进行close关闭。
例:
import java.io.*;
class ByteArrayStream
{
public
static void main(String[] args)
{
//数据源。
ByteArrayInputStream bis = newByteArrayInputStream("哈哈是计算机".getBytes());
//数据目的
ByteArrayOutputStream bos = new ByteArrayOutputStream();
int len = 0;
//从bis读取到的数据写到bos里面
while((len=bis.read())!=-1)
{
bos.write(len);
}
System.out.println(bos.size());
System.out.println(bos.toString());
}
}
管道流:java管道流的读写操作用于两个线程之间
PipedOutputStream、PipedInputStream 连接起来就是一个管道
管道输出流可以向管道写入数据,管道输入流可以从管道读取数据,
这种Decorator装饰 的设计模式 大大增强了java流的功能
可以在构造流的时候连接 管道输入输出流 也可以通过connect函数连接
PipedOutputStream
PipedInputStream
例:
package IO21;
import java.io.*;
class Read
implements Runnable
{
private PipedInputStream
in;
Read(PipedInputStream in)
{
this.in = in;
}
public
void run()
{
try
{
byte[] buf =
new byte[1024];
System.out.println("读取前。。没有数据阻塞");
int len =
in.read(buf);
System.out.println("读到数据。。阻塞结束");
String s= new String(buf,0,len);
System.out.println(s);
in.close();
}
catch (IOException e)
{
throw
new RuntimeException("管道读取流失败");
}
}
}
//实现Runnable接口
class Write
implements Runnable
{
//覆盖构造方法,传管道输出流对象
private PipedOutputStream
out;
Write(PipedOutputStream out)
{
this.out = out;
}
//复写run方法
public
void run()
{
try
{
System.out.println("开始写入数据,等待6秒后。");
Thread.sleep(6000);
out.write("piped laila".getBytes());
out.close();
}
catch (Exception e)
{
throw
new RuntimeException("管道输出流失败");
}
}
}
class PipedStreamDemo
{
public
static void main(String[] args)
throws IOException
{
//创建管道输出流对象,用于数据的写入
PipedInputStream in = new PipedInputStream();
//创建管道输入流对象,用于读取文本数据
PipedOutputStream out = new PipedOutputStream();
in.connect(out);//将管道输出流与输入流的连接,实现数据读写
//创建对象,开启线程
Read r = new Read(in);
Write w = new Write(out);
new Thread(r).start();
new Thread(w).start();
}
}
打印流:该流提供了打印的方法,可以将各种数据类型的数据都原样打印。
a:提供了更多的功能,比如打印方法。可以直接打印任意类型的数据。
b:它有一个自动刷新机制,创建该对象,指定参数,对于指定方法可以自动刷新。
c:它使用的本机默认的字符编码.
d:该流的print方法不抛出IOException。
字节打印流(PrintStream):
A、file对象:File
B、字符串路径:String
C、字节输出流:OutputStream
字符打印流(PrintWriter):
A、file对象:File
B、字符串路径:String
C、字节输出流:OutputStream
D、字符输出流:Writer
例:
package I020;
/*
打印流:
该流提供了打印方法,可以将各种数据类型的数据都原样打印。
字节打印流:
PrintStream
构造函数可以接收的参数类型:
1,file对象。File
2,字符串路径。String
3,字节输出流。OutputStream
字符打印流:
PrintWriter
构造函数可以接收的参数类型:
1,file对象。File
2,字符串路径。String
3,字节输出流。OutputStream
4,字符输出流,Writer。
*/
import java.io.*;
class PrintStreamDemo
{
public
static void main(String[] args)
throws IOException
{
//键盘录入
BufferedReader bufr =
new BufferedReader(new InputStreamReader(System.in));
//将数据处理到a.txt文件中,并刷新
PrintWriter out = new PrintWriter(new FileWriter("a.txt"),true);
String line = null;
//将键盘录入的数据转化成大写,并实时写入a.txt文件中,遇到over时,结束键盘录入
while((line=bufr.readLine())!=null)
{
if("over".equals(line))
break;
out.println(line.toUpperCase());
}
out.close();
bufr.close();
}
}