IO(一)字符流,字节流

一 IO概述


I/O全称是Input/Output,Java的I/O就是Java的输入与输出操作。Java所有的I/O机制都是基于数据流进行输入输出,这些数据流表示了字符或者字节数据的流动序列。Java的I/O流提供了读写数据的标准方法。任何Java中表示数据源的对象都会提供以数据流的方式读写它的数据的方法。

流按目的方向可分为输入流(读),输出流(写)。 按类型分,字节流,字符流。

  • 字节流:流操作的最基本形式, 可以操作任何文件,包括文本,媒体等文件。根级父类InputStream,OutputStream
  • 字符流:为了处理文字数据方便而出现的对象,底层操作的仍是字节流,通过查询系统默认的编码将字节转字符, 只能操作文本文件。根级接口Reader , Writer。


       

二  字符流操作


字符流可以通过FileReader ,FileWriter对文件进行读写操作, BufferedWriter和BufferedReader能够提供缓冲区功能并封装了逐行读取等方法,用以提高效率和操作便捷性。
样例1   写入文件
import java.io.FileWriter;
import java.io.IOException;

public class FileWriterDemo {
	public static void main(String[] args) throws IOException {
		create_file();
	}

	private static void create_file() throws IOException {
		FileWriter fWriter= new FileWriter("G:\\FileWriterDemo.txt");
		fWriter.write("静夜思\r\n");
		fWriter.write("床前明月光,\r\n");
		fWriter.write("疑是地上霜。\r\n");
		fWriter.write("举头望明月,\r\n");
		fWriter.write("低头思故乡。\r\n");
		fWriter.flush();
		fWriter.close();
	}

}

运行成功, 在G盘创建一个FileWriterDemo.txt的文件, 并成功写入内容。
注: Writer 创建的文件编码格式为默认的系统编码格式,writer 在调用close()方法前会默认先调用flush() 方法。 


样例2   读取文件内容
</pre><pre name="code" class="java">import java.io.*;

public class FileReaderDemo {
	public static void main(String[] args) throws IOException{
		read_file();
	}

	private static void read_file() throws IOException {
		FileReader fReader = new FileReader("G:\\FileWriterDemo.txt");
		BufferedReader bufReader = new BufferedReader(fReader);
		String content = null;
		while((content=bufReader.readLine())!=null){
			System.out.println(content);
		}
	} 
}


运行结果:
静夜思
床前明月光,
疑是地上霜。
举头望明月,
低头思故乡。


三  字节流


计算机内部数据都是以字节形式存储,因此字节流可以处理媒体,图片,文本等文件, 顶级父类:InputStream,OutputStream。
dome3  复制文件
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

public class StreamDemo {
	public static void main(String[] args) throws IOException{
		copy_file();
	}

	private static void copy_file() throws IOException {
		FileOutputStream os = new FileOutputStream("G:\\1.iso");
		FileInputStream is = new FileInputStream("G:\\CentOS-7-x86_64-DVD-1503-01.iso");
		BufferedInputStream bufInput = new BufferedInputStream(is);
		BufferedOutputStream bufOutPut = new BufferedOutputStream(os);
		byte[] buf = new byte[1024*1024*4];//定义4M大小的缓冲区
		int len;
		while((len=bufInput.read(buf))!=-1){
			bufOutPut.write(buf,0,len);
			bufOutPut.flush();
		}
		bufInput.close();
		bufOutPut.close();
		System.out.println("copy成功!");
	}
}

 运行结果:  copy成功。
注: new FileOutputStream("G:\\1.iso"); 和 new FIleWriter("G:\\1.txt")时, 都会覆盖或创建原来的文件,并清空之前的数据。

4 字节流,字符流转化


InputStreamReader,OutputStreamWriter ,是FileReader,FileWriter的父类, 可以将字节流对象转字符流对象。 如果文本文件需要指定的编码格式读取,或存储,则需要借助 InputStreamReader,OutputStreamWriter 进行编码转换。

样例4  将gbk编码的文件 copy一份utf-8 编码。
package cjr.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 StreamCodeDemo {

	public static void main(String[] args) throws IOException {
		FileInputStream fileStream = new FileInputStream("G:\\20160307.txt");
		InputStreamReader reader = new InputStreamReader(fileStream, "gbk");
		BufferedReader bufReader = new BufferedReader(reader);
		
		FileOutputStream fileOutStream =new FileOutputStream("G:\\20160307_utf.txt");
		OutputStreamWriter writer = new OutputStreamWriter(fileOutStream,"utf-8");
		BufferedWriter bufWriter = new BufferedWriter(writer);
		String cont;
		while((cont=bufReader.readLine())!=null){
			bufWriter.write(cont+"\r\n");
		}
		bufReader.close();
		bufWriter.close();
	}

}


总结:如果操作文本文件使用的本地默认编码表完成编码。可以使用FileReader,或者FileWriter。因为这样写更简便。
如果对操作的文本文件需要使用指定编码表进行编解码操作,这时必须使用转换流来完成。 


附*:字节流,字符流方法

=============== Reader===================
Reader 
 read() 读取单个字符。
 read(char[] cbuf) 将字符读入数组。
 close() 关闭该流并释放与之关联的所有资源。
BufferedReader
 BufferedReader(Reader in) 创建一个使用默认大小输入缓冲区的缓冲字符输入流。
 readLine() 读取一个文本行。
LineNumberReader
 LineNumberReader(Reader in) 使用默认输入缓冲区的大小创建新的行编号 reader。
 getLineNumber() 获得当前行号。
 setLineNumber(int lineNumber) 设置当前行号。
InputStreamReader
 InputStreamReader(InputStream in)
 InputStreamReader(InputStream in, Charset cs)
 getEncoding() 返回此流使用的字符编码的名称。
FileReader
 FileReader(String fileName) 在给定从中读取数据的文件名的情况下创建一个新 FileReader。
 FileReader(File file) 在给定从中读取数据的 File 的情况下创建一个新 FileReader。

=============== Writer ===================
Writer
 write(char[] cbuf) 写入字符数组。
 write(String str) 写入字符串。
 flush() 刷新该流的缓冲。
 close() 关闭此流,但要先刷新它。
BufferedWriter
 BufferedWriter(Writer out)
 newLine() 写入一个行分隔符。
OutputStreamWriter
 OutputStreamWriter(OutputStream out)
 OutputStreamWriter(OutputStream out, Charset cs)
 getEncoding() 返回此流使用的字符编码的名称。
FileWriter
 FileWriter(String fileName) 根据给定的文件名构造一个 FileWriter 对象。
 FileWriter(String fileName, boolean append) 根据给定的文件名以及指示是否附加写入数据的 boolean 值来构造 FileWriter 对象。

===============InputStream===================
InputStream
 available() 返回此输入流下一个方法调用可以不受阻塞地从此输入流读取(或跳过)的估计字节数。(文件字节数)
 read() 从输入流中读取数据的下一个字节。
 read(byte[] b) 从输入流中读取一定数量的字节,并将其存储在缓冲区数组 b 中。
 close() 关闭此输入流并释放与该流关联的所有系统资源。
FileInputStream
 FileInputStream(File file)
 FileInputStream(String name)
BufferedInputStream
 BufferedInputStream(InputStream in)

=============== OutputStream ===================
OutputStream
 close() 关闭此输出流并释放与此流有关的所有系统资源。
 flush() 刷新此输出流并强制写出所有缓冲的输出字节。
 write(byte[] b) 将 b.length 个字节从指定的 byte 数组写入此输出流。
FileOutputStream
 FileOutputStream(String name)
 FileOutputStream(String name, boolean append)
 FileOutputStream(File file)
 FileOutputStream(File file, boolean append)
BufferedOutputStream
 BufferedOutputStream(OutputStream out) 




  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值