Java IO的个人学习笔记(3)

来源:互联网 发布:java if else语句 编辑:程序博客网 时间:2024/05/16 15:44

一.转换流

在IO包中,还存在一组字节流和字符流转换类。OutputStreamWriter和InputStreamReader
(1).OutputStreamWriter是Writer的子类,将一个字符流的输出对象变成字节流输出对象。
(2).InputStreamReader是Reader的子类,将一个字节流的输入对象变成字符流输出对象。
在操作文件的时候,需要OutputStreamWriter将字符流变成字节流保存在文件中,读取的时候需要InputStreamReader将字节流变成字符流读取。
将字符流变成字节流写进文件,代码如下
import java.io.File;import java.io.FileOutputStream;import java.io.OutputStreamWriter;import java.io.Writer;public class OutputStreamWriterDemo {public static void main(String[] args)throws Exception{// TODO Auto-generated method stubFile f=new File("d:"+File.separator+"test4.txt");Writer writer=new OutputStreamWriter(new FileOutputStream(f));writer.write("java OutputStreamWriter test");writer.close();}}
将字节流变成字节流读取文件,代码如下:
import java.io.File;import java.io.FileInputStream;import java.io.InputStreamReader;import java.io.Reader;public class InputStreamReaderDemo {public static void main(String[] args)throws Exception {// TODO Auto-generated method stubFile f=new File("d:"+File.separator+"test4.txt");Reader reader=new InputStreamReader(new FileInputStream(f)); char[] c=new char[1024];int len=reader.read(c);reader.close();System.out.println("内容为:"+new String(c,0,len));}}

二.内存操作流

上面讲的都是输入输出都是从文件来的,当然也可以把输入输出的位置放在内存里,java里有ByteArrayInputStream主要完成将内容写进内存,ByteArrayOutputStream主要完成将内存的内存读出。
使用内存操作流将大写字符串换成小写字符串:
import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;public class ByteArrayInputStreamDemo {public static void main(String[] args)throws Exception {// TODO Auto-generated method stubString str="HELLO WORLD";ByteArrayInputStream bis=new ByteArrayInputStream(str.getBytes());ByteArrayOutputStream bos=new ByteArrayOutputStream();int temp=0;while((temp=bis.read())!=-1) {char c=(char)temp;bos.write(Character.toLowerCase(c));}String newstr=bos.toString();try {bis.close();bos.close();}catch(Exception e) {e.printStackTrace();}System.out.println(newstr);}}
这些操作全是在内存中完成的。这个内存操作流一般在生成一些临时信息的时候使用,放在文件里的话,待会程序结束还得删除这个临时文件,比较麻烦.。

三.管道流 

管道流主要用于线程之间的通信,分为管道输入流PipedOutputStream和管道输出流PipedInputStream。如果要进行管道输出,必须把输出流连在输入流上。
验证代码如下:
import java.io.PipedInputStream;import java.io.PipedOutputStream;class Send implements Runnable{private PipedOutputStream pos=null;public Send() {pos=new PipedOutputStream();}public PipedOutputStream getPos() {return pos;}public void setPos(PipedOutputStream pos) {this.pos = pos;}@Overridepublic void run() {// TODO Auto-generated method stubString str="java io test";try {this.pos.write(str.getBytes());}catch(Exception e) {e.printStackTrace();}try {pos.close();}catch(Exception e) {e.printStackTrace();}}}class Receive implements Runnable{private PipedInputStream pis=null;public Receive() {pis=new PipedInputStream();}public PipedInputStream getPis() {return pis;}public void setPis(PipedInputStream pis) {this.pis = pis;}@Overridepublic void run() {// TODO Auto-generated method stubbyte[] b=new byte[1024];int len=0;try {len=this.pis.read(b);}catch(Exception e) {e.printStackTrace();}try {pis.close();}catch(Exception e) {e.printStackTrace();}System.out.println(new String(b,0,len));}}public class PipedDemo {public static void main(String[] args) {// TODO Auto-generated method stubSend s=new Send();Receive r=new Receive();try {s.getPos().connect(r.getPis());}catch(Exception e) {e.printStackTrace();}new Thread(s).start();new Thread(r).start();}}
测试代码有点长,但是很简单,使用PipedOutStream类中提供的connect()方法连接两个管道流。线程启动后自动进行管道的输入输出操作。

四.打印流 

打印流是整个IO包中输出信息最方便的类,有字节打印流(PrintStream)和字符打印流(PrintWrter)。打印流可以打印任何数据类型,我们主要介绍字节打印流。
printStream常用方法如下:

1、public PrintStream(File file) throws FileNotFoundException 构造方法 通过一个File对象实例化PrintStream类

2、public PrintStream(OutputStream  out)  构造方法 接收OutputStream对象,实例化PrintStream类

3、public PrintStream printf(Locale l, String format, Object ...arg) 普通方法 根据指定的Locale进行格式化输出

4、public PrintStream printf(String format,Object ... arg) 普通方法 根据本地环境进行格式化输出

5、public void print(boolean b) 普通方法 此方法被重载很多次,输出任意数据

6、public void println(boolean b) 普通方法 此方法被重载很多次,输出任意数据后换行

第二个构造方法可以直接接收一个OutputStream对象,这个是因为PrintStream比OutputStream输出更方便,好比把OutputStream包装一下,使之输出更方便。就是打印流把输出流包装了一下,这种设计叫做装饰设计模式。

import java.io.File;import java.io.FileOutputStream;import java.io.PrintStream;public class PrintStreamDemo {public static void main(String[] args) throws Exception {// TODO Auto-generated method stubFile f=new File("d:"+File.separator+"word.txt");PrintStream ps=new  PrintStream(new FileOutputStream(f));ps.println("java io test");ps.println(2+2);ps.close();}}

是不是发现方便很多,PrintStream还可以格式化输出,%s->变成字符串;%d->变成整数;%f->变成小数;%c->变成字符,使用printf()完成操作

import java.io.File;import java.io.FileOutputStream;import java.io.PrintStream;public class PrintStreamDemo2 {public static void main(String[] args) throws Exception {// TODO Auto-generated method stubFile f=new File("d:"+File.separator+"word.txt");PrintStream ps=new  PrintStream(new FileOutputStream(f));String name="阿里巴巴";int age=20;float grade=88.364f;char sex='男';ps.printf("%s;%d;%f;%c",name,age,grade,sex);ps.close();}}

四.System对IO的支持

(1).System.out:是PrintStream对象,此对象是向显示器上输出
(2).System.in是键盘的输入流,是InputStream的子类,从键盘上读取数据
(3).System.err:表示错误信息输出
输出重定向:输出重定向就是改变输出位置,比如用eclipse编程,System.out是输出在控制台的,我可以用输出重定向把信息写入文件之类的;
System类提供的重定位方法
setErr(PrintStream err) 重新分配“标准”错误输出流。
setIn(InputStream in) 重新分配“标准”输入流。

setOut(PrintStream out) 重新分配“标准”输出流

为System.out输出重定向:

import java.io.File;import java.io.FileOutputStream;import java.io.PrintStream;public class SystemDemo {public static void main(String[] args)throws Exception {// TODO Auto-generated method stubFile f=new File("d:"+File.separator+"word1.txt");FileOutputStream fileops=new  FileOutputStream(f);PrintStream ps=new PrintStream(fileops);System.setOut(ps);System.out.println("java io test");}}
其他两个操作都大同小异,我就不一一介绍了。

未完待续.....