java IO字符流与字节流简单使用示例

1.Reader && Writer
Reader

 java.lang.Object   
    |-- java.io.Reader//常用方法
                |-- int read()  //读取单个字符
                |--  int read(char[] cbuf)  //将字符读入数组中
                |-- abstract  int read(char[] cbuf, int off, int len)  //将字符读入数组中的某一部分。
                |--abstract  void close()  //关流
         |-- java.io.BufferedReader//其方法大致和Reader相同不在列举,注意BufferedReader有ReadLine()方法
             |-- java.io.LineNumberReader //以下为其常用方法
                |-- LineNumberReader(Reader in) //构造方法
                |-- int getLineNumber() //获取当前行号
                |--  int read()  //读取单个字符
                |--  int read(char[] cbuf, int off, int len)  //将字符读入数组中的某一部分。
                |--  String readLine() //读取文本行。
                |--  void close()  //关流
 
         |-- java.io.InputStreamReader//继承自Reader,常用方法与Reader基本相同,注意构造方法参数,此类将字节流转换为字符流,是字节流通向字符流的桥梁
                |-- InputStreamReader(InputStream in) //构造方法
                |-- InputStreamReader(InputStream in, Charset cs)//构造方法,创建使用给定字符集的 InputStreamReader。
            |-- java.io.FileReader//常用方法
                |-- FileReader(File file)//构造方法
                |-- FileReader(String fileName) //构造方法
         |-- java.io.CharArrayReader//此类实现一个可用作字符输入流的字符缓冲区。 
                |-- CharArrayReader(char[] buf) //构造方法,根据指定的 char 数组创建一个 CharArrayReader。
                |-- CharArrayReader(char[] buf, int offset, int length) //构造方法,根据指定的 char 数组创建一个 CharArrayReader。
         |-- java.io.PipedReader//传送的字符输入流。
                |-- PipedReader() //构造方法,创建尚未连接的 PipedReader。
                |-- PipedReader(int pipeSize) //创建一个尚未连接的 PipedReader,并对管道缓冲区使用指定的管道大小。
                |-- PipedReader(PipedWriter src) //创建连接到传送 writer src 的 PipedReader。
                |-- PipedReader(PipedWriter src, int pipeSize) // 创建一个 PipedReader,使其连接到管道 writer src,并对管道缓冲区使用指定的管道大小。
                |-- void connect(PipedWriter src)  //使此传送 reader 连接到传送 writer src。
         |-- java.io.FilterReader
                |-- protected  FilterReader(Reader in)  //创建一个新的 filtered reader,其余方法和Reader相似
         |-- java.io.StringReader //其源为一个字符串的字符流。与CharArrayReader相似
                |-- StringReader(String s) //创建一个新字符串 reader。

$$ 此例为复制文件:通过File创建一个空文件,并把之前已存在的文件进行读取,将内容复制到空文件中,实现复制文件,

package com.IO;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class BufferedReaderTest02 {

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub

		File file = new File("E:\\Blog\\test.txt");
		BufferedReader br = new BufferedReader(new FileReader("E:\\Blog\\Copy01.txt"));
		BufferedWriter bw = new BufferedWriter(new FileWriter(file));//使用 FileReader(String fileName) 构造方法
		String line = null;
		while((line = br.readLine()) != null) {
			bw.write(line);
			bw.newLine();
			bw.flush();
		}
		bw.close();
		br.close();
	}
}

$$ 此例仍以复制文件为例:InputStreamReader 和 OutputStreamWriter方法的具体演示,注释掉的是另一种实现方法,并不是错误,得到的结果都是相同的,都会复制到指定文件中,注意:一旦操作文本涉及到具体的指定编码表时,必须使用转换流 。
本例解析:读取一个文件,将其转换为字符流进行操作,可以进行整行读取比较方便

package com.IO;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

public class InputStreamReaderTest01 {

	@SuppressWarnings("unused")
	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub

//		InputStreamReader in = new InputStreamReader(new FileInputStream("E:\\Blog\\Copy01.txt"));
//		OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream("E:\\Blog\\Copy04.txt"));
		BufferedReader in = new BufferedReader(new 
				InputStreamReader(new FileInputStream("E:\\Blog\\Copy01.txt")));
		BufferedWriter out = new BufferedWriter(new 
				OutputStreamWriter(new FileOutputStream("E:\\Blog\\Copy06.txt")));
//		int len;
//		char[] ch = new char[1024];
//		
//		while((len = in.read(ch)) != -1) {
//			out.write(ch,0,len);
//			out.flush();
//		}
		
		String line = null;
		while((line = in.readLine()) != null) {
			out.write(line);
			out.newLine();
			out.flush();
		}
		out.close();
		in.close();
	}

}

$$ 此例为CharArrayReader 的基本操作,此类用的相对较少对应字节流中的 ByteArrayInputStream

package com.IO;

import java.io.CharArrayReader;
import java.io.IOException;

public class CharArrayReaderTest01 {

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub

		char[] ch = {'a','c','e','r','v','t','s','q','p','b'};
		CharArrayReader cr = new CharArrayReader(ch);
		System.out.println((char)cr.read());
		cr.skip(1);//跳过下标为 1 之前的元素
		char[] ch1 = new char[5];
		cr.read(ch1, 0, 4);//相当于复制0~4的元素ch1中
		System.out.println(new String(ch1));
	}

}
/**结果为
*  a
*  ervt
*/

Writer
与Reader相似,二者大多数都是对应存在的,相当于有输入必有输出

java.lang.Object
  |-- java.io.Writer //常用方法
              |-- Writer append(char c)  //将指定字符添加到此 writer。
              |-- abstract  void flush()  //刷新该流的缓冲。
              |-- void write(char[] cbuf)  //写入字符数组。
              |-- abstract  void write(char[] cbuf, int off, int len)  //写入字符数组的某一部分
              |-- void write(int c)  //写入单个字符。
              |--  void write(String str) //写入字符串。
              |-- void write(String str, int off, int len)  // 写入字符串的某一部分。
      |-- java.io.BufferedWriter //缓冲流,提高效率,方法看父类,注意构造函数要传进来一个 Writer out,存在 newLine方法写入一个行分隔符
      |-- java.io.OutputStreamWriter //字符流通向字节流的桥梁,将输出的字符流变为字节流
                  |-- OutputStreamWriter(OutputStream out) //构造函数
                  |-- String getEncoding() //返回此流使用的字符编码的名称。其余方法参看父类
      |-- java.io.CharArrayWriter//使用较少,不再列举其具体方法
      |-- java.io.StringWriter//不做实例,不列举方法
      |-- java.io.FilterWriter
                  |-- protected  FilterWriter(Writer out)// 创建一个新的 filtered writer,其余方法参看父类
      |-- java.io.PipedWriter 传送的字符输出流。 
                  |-- PipedWriter() //创建一个尚未连接到传送 reader 的传送 writer。
                  |-- PipedWriter(PipedReader snk) //创建传送 writer,使其连接到指定的传送 reader。
                  |-- void connect(PipedReader snk)  //将此传送 writer 连接到接收方。
      |-- java.io.PrintWriter//向文本输出流打印对象的格式化表示形式
                  |-- PrintWriter(File file) //使用指定文件创建不具有自动行刷新的新 PrintWriter。
                  |-- PrintWriter(OutputStream out)// 根据现有的 OutputStream 创建不带自动行刷新的新 PrintWriter。
                  |-- PrintWriter(OutputStream out, boolean autoFlush)// 通过现有的 OutputStream 创建新的 PrintWriter。
                  |-- PrintWriter(String fileName)//创建具有指定文件名称且不带自动行刷新的新 PrintWriter
                  |-- PrintWriter(Writer out) //创建不带自动行刷新的新 PrintWriter。
                  |-- PrintWriter(Writer out, boolean autoFlush)// 创建新 PrintWriter。
                  |--  void println(int x) // 打印整数,然后终止该行。
                  |-- void print(int i)  //打印整数。

$$ CharArrayWriter 简单示例

package com.IO;

import java.io.CharArrayWriter;

public class CharArrayWriterTest01 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		char[] ch = {'a','c','e','r','v','t','s','q','p','b'};
		CharArrayWriter cw = new CharArrayWriter();
		cw.write(ch, 0, 6);
		System.out.println(cw.size());
		System.out.println(cw.toString());
		char[] ch1 = cw.toCharArray();
		for(char c : ch1)
			System.out.print(c + " ");
	}
}
/**
 * 
 * 结果为
 * 6
 * acervt
 * a c e r v t
 * 
 * */

$$PrintWriter 示例

package com.IO;

import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.PrintWriter;

public class PrintWriterTest01 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		char[] ch = {'a','c','e','r','v','t','s','q','p','b'};
		PrintWriter po;
		String s = "abe";
		String ss = "kl阿斯顿发";
		try {
			po = new PrintWriter(new FileOutputStream("E:\\Blog\\test02.txt"));
			po.write(ch);
			po.println(s);//打印到E:\\Blog\\test02.txt中
			po.print(ss);
			po.flush();
			po.close();
		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

2.InputStream与OutputStream
InputStream
这里只介绍几种比较常用的类

java.lang.Object
        |-- java.io.InputStream
                    |-- int available() // 返回此输入流下一个方法调用可以不受阻塞地从此输入流读取(或跳过)的估计字节数。
                    |--  void close() //关流
                    |--  abstract  int read() //从输入流中读取数据的下一个字节。
                    |-- int read(byte[] b) //从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中
                    |--  int read(byte[] b, int off, int len)  //将输入流中最多 len 个数据字节读入 byte 数组。
             |-- java.io.FileInputStream
                    |-- FileInputStream(File file) 
                    |-- FileInputStream(String name) 
                    |-- protected  void finalize()  //确保在不再引用文件输入流时调用其 close 方法。
             |-- java.io.ByteArrayInputStream //与CharArrayReader相似
                    |-- ByteArrayInputStream(byte[] buf)
                    |-- ByteArrayInputStream(byte[] buf, int offset, int length) 
             |-- java.io.FilterInputStream
                 |-- java.io.BufferedInputStream//缓冲区,提高效率
                    |-- BufferedInputStream(InputStream in) //构造函数
                 |-- java.io.DataInputStream
                    |-- DataInputStream(InputStream in) 
             |-- java.io.ObjectInputStream
                    |-- Object readObject()  //从 ObjectInputStream 读取对象。
             |-- java.io.PipedInputStream //管道输入流应该连接到管道输出流;管道输入流提供要写入管道输出流的所有数据字节
                    |-- PipedInputStream() //创建尚未连接的 PipedInputStream。
                    |-- PipedInputStream(int pipeSize) //创建一个尚未连接的 PipedInputStream,并对管道缓冲区使用指定的管道大小。
                    |-- PipedInputStream(PipedOutputStream src) //创建 PipedInputStream,使其连接到管道输出流 src。
                    |-- PipedInputStream(PipedOutputStream src, int pipeSize) //创建一个 PipedInputStream,使其连接到管道输出流 src,并对管道缓冲区使用指定的管道大小。
                    |-- void connect(PipedOutputStream src)  //使此管道输入流连接到管道输出流 src。

$$ ObjectInputStream与ObjectOutputStream用法简单示例,注意:ObjectInputStream writerObject对象的时候,不能直接添加,需要将此类实现序列化serializable。

package com.IO;

import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.Serializable;
import java.util.HashSet;
import java.util.Set;


public class ObjectStreamTest01 {

	public static void main(String[] args) throws IOException, ClassNotFoundException {
		// TODO Auto-generated method stub

		Set<Worker> list = new HashSet<Worker>();
		list.add(new Worker("lisi01",10000));
		list.add(new Worker("lisi02",10000));
		list.add(new Worker("lisi02",15000));
		list.add(new Worker("lisi01",10000));
		ObjectOutputStream out = new ObjectOutputStream(new FileOutputStream("E:\\Blog\\test03.txt"));
		out.writeObject(list);
		ObjectInputStream in = new ObjectInputStream(new FileInputStream("E:\\Blog\\test03.txt"));
		@SuppressWarnings("unchecked")
		Set<Worker> ww = (Set<Worker>)in.readObject();
		for(Worker w : ww) 
			System.out.println(w.getId() + " :: " + w.getSalary());
		out.close();
		in.close();
	}

}

class Worker implements Serializable{

	String id;
	int salary;
	public Worker(String id, int salary) {
		this.id = id;
		this.salary = salary;
	}
	public String getId() {
		return id;
	}
	public void setId(String id) {
		this.id = id;
	}
	public int getSalary() {
		return salary;
	}
	public void setSalary(int salary) {
		this.salary = salary;
	}
	
	public int hashCode() {
		return this.id.hashCode() + salary*37;
	}
	
	public boolean equals(Object obj) {
		if(obj instanceof Worker) {
			Worker w = (Worker)obj;
			return this.id.equals(w.id) && this.salary == w.salary;
		}
		return false;
	}
	
}

OutputStream

java.lang.Object
        |--  java.io.OutputStream
                     |-- void write(byte[] b)  // 将 b.length 个字节从指定的 byte 数组写入此输出流
                     |--  void write(byte[] b, int off, int len)  //将指定 byte 数组中从偏移量 off 开始的 len 个字节写入此输出流。
                     |-- abstract  void write(int b)  //将指定的字节写入此输出流。
             |-- java.io.ByteArrayOutputStream //此类实现了一个输出流,其中的数据被写入一个 byte 数组,和CharArrayWriter 相似
             |-- java.io.FileOutputStream
                     |-- FileOutputStream(File file) 
                     |-- FileOutputStream(String name) 
                     |-- FileOutputStream(String name, boolean append) 
                     |-- FileOutputStream(File file, boolean append) 
             |-- java.io.FilterOutputStream
                     |-- FilterOutputStream(OutputStream out) //构造方法
                  |-- java.io.BufferedOutputStream
                     |-- BufferedOutputStream(OutputStream out) //构造方法
                  |-- java.io.DataOutputStream//数据输出流允许应用程序以适当方式将基本 Java 数据类型写入输出流中。然后,应用程序可以使用数据输入流将数据读入。 
                     |-- DataOutputStream(OutputStream out) //构造方法
                  |-- java.io.PrintStream
                     |-- PrintStream(File file) //创建具有指定文件且不带自动行刷新的新打印流。
                     |-- PrintStream(File file, String csn) //创建具有指定文件名称和字符集且不带自动行刷新的新打印流。
                     |-- PrintStream(OutputStream out) //创建新的打印流。
                     |-- PrintStream(OutputStream out, boolean autoFlush, String encoding) 
                     |-- PrintStream(String fileName) // 创建具有指定文件名称且不带自动行刷新的新打印流。
                     |-- PrintStream(String fileName, String csn) //创建具有指定文件名称和字符集且不带自动行刷新的新打印流
             |-- java.io.ObjectOutputStream
                     |-- ObjectOutputStream() //构造方法
                     |-- ObjectOutputStream(OutputStream out) //构造方法
                     |-- void writeObject(Object obj)  //将指定的对象写入 ObjectOutputStream。
             |-- java.io.PipedOutputStream //可以将管道输出流连接到管道输入流来创建通信管道。管道输出流是管道的发送端
                    |-- void connect(PipedInputStream snk)  //将此管道输出流连接到接收者。

$$ 最后实现图片的复制

扫描二维码关注公众号,回复: 3951766 查看本文章
package com.IO;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class PicCopyTest01 {

	public static void main(String[] args) throws IOException {
		// TODO Auto-generated method stub

		BufferedInputStream in = new BufferedInputStream(new FileInputStream("G:\\图片\\bg.jpg"));
		BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream("E:\\Blog\\Pic02.jpg"));
		@SuppressWarnings("unused")
		int len = 0;
		byte[] bt = new byte[1024];
		while((len = in.read(bt)) !=- 1) {
			out.write(bt);
			out.flush();
		}
		in.close();
		out.close();
	}

}

**PS:**PipedInputStream、PipedOutputStream、PipedReader、PipedWriter、ObjectInputStream、ObjectOutputStream先不做解释

猜你喜欢

转载自blog.csdn.net/qq_43060759/article/details/83546410