当前位置: 代码迷 >> 综合 >> Java---IO---简单IO
  详细解决方案

Java---IO---简单IO

热度:70   发布时间:2023-10-21 17:39:39.0

字节流:

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;import org.junit.Test;
/*** 2018年5月3日 上午10:02:16* @author <a href="mailto:447441478@qq.com">宋进宇</a>*	演示 字节 流*/
public class IOStreamDemo {//认识系统的 in 和 out@Test public void t1() throws IOException {//获得系统的输入流:InputStreamInputStream in = System.in;//获得系统的输出流:PrintStreamPrintStream out = System.out;//只有输入ctrl+z 才退出循环while(in.available() != -1){//因为系统输入输出是字节流 所以定义一个字节数据来接收输入byte[] buf = new byte[16];//记录每次读入的字节个数int len = in.read( buf );//输出从0到len 的内容out.write( buf, 0, len );}//关流应该在catch块后面的finally里面关 ,//这里为了流程看起来不乱 就省略了。。。in.close();out.close();}//从控制台输入内容,输出到文件中@Testpublic void t2() throws IOException {//获得控制台输入流InputStream in = System.in;//创建一个文件File outFile = new File( "testIO_Files/fileIn.txt" );//判断文件存不存在if ( !outFile.exists() ) {//获取所需父文件夹File dir = outFile.getParentFile();//预防空指针if ( dir != null ) {//如果文件不存在先把需要的父文件夹全部创建dir.mkdirs();}//再创建一个文件outFile.createNewFile();}//创建一个 文件输出流FileOutputStream fOut = new FileOutputStream( outFile );//定义一个缓冲数组byte[] buf = new byte[32];int len = -1;while( ( len = in.read( buf ) ) != -1 ){//把每次输入的内容输出到文件中fOut.write( buf, 0, len );}//关流应该在catch块后面的finally里面关 ,//这里为了流程看起来不乱 就省略了。。。in.close();fOut.close();}//把文件中的内容输出到控制台显示@Testpublic void t3() throws IOException {//获得打印流PrintStream out = System.out;//使用上面测试的文件File inFile = new File( "testIO_Files/fileIn.txt" );//判断文件存不存在if ( !inFile.exists() ) {//获取所需父文件夹File dir = inFile.getParentFile();//预防空指针if ( dir != null ) {//如果文件不存在先把需要的父文件夹全部创建dir.mkdirs();}//再创建一个文件inFile.createNewFile();}//创建一个文件输入流FileInputStream fIn = new FileInputStream( inFile );byte[] buf = new byte[8];int len = -1;while ( ( len = fIn.read( buf ) ) != -1 ) {//打印到控制台out.write(buf, 0, len);}//关流应该在catch块后面的finally里面关 ,//这里为了流程看起来不乱 就省略了。。。fIn.close();out.close();}//测试 文件拷贝 @Testpublic void t4() throws IOException {//使用上面测试的文件File inFile = new File( "testIO_Files/fileIn.txt" );File outFile = new File( "testIO_Files/fileOut.txt" );//判断文件存不存在if ( !inFile.exists() ) {//获取所需父文件夹File dir = inFile.getParentFile();File dir2 = outFile.getParentFile();//预防空指针if ( dir != null ) {//如果文件不存在先把需要的父文件夹全部创建dir.mkdirs();}if ( dir2 != null ) {dir2.mkdirs();}//再创建一个文件inFile.createNewFile();outFile.createNewFile();}//创建一个文件输出流FileInputStream fis = new FileInputStream(inFile);//创建一个文件输出流FileOutputStream fos = new FileOutputStream(outFile);byte[] buf = new byte[16];int len = -1;while ( ( len = fis.read( buf ) ) != -1 ) {fos.write( buf, 0, len );}//先关fisfis.close();//再关fosfos.close();//简单说 就是 从数据输出的源头开始关,逐步关直到目标}
}

字符流:

import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;import org.junit.Test;/*** 2018年5月3日 上午10:58:31* @author <a href="mailto:447441478@qq.com">宋进宇</a>*	演示 字符流*/
public class ReadWriteDemo {//通过控制台输入 输出到文件中/* 通过观察文件内容可以发现 汉字 出现乱码问题了* 原因:MyEclipse我设置的是UTF-8编码,一个汉字的是3个字节*     而我定义的buf是8个字节,这时在第3个汉字时只取了2个字节*     进行转换成字符串,于是就出现了乱码。* 解决方法有两个:一是把buf定义足够大,但是不现实。不可取* 			       另一个是采用转换流 具体看 转换流 演示*/@Test public void t1() throws IOException {//获得输入流InputStream in = System.in;//获得文件字符输出流FileWriter fw = new FileWriter( "testIO_Files/fileWrite.txt" );byte[] buf = new byte[8];int len = -1;while( ( len = in.read( buf ) ) != -1 ){//这里不能像字节流那样直接写进文件,需要转换String str = new String( buf, 0, len);fw.write(str);}//关流in.close();fw.close();}//通过单纯的字符流实现 文件拷贝 //只能拷贝跟运行环境编码相同的文件,如果编码不同就会出现 乱码@Testpublic void t3() throws IOException {//被拷贝的文件直接采用 演示字节流中产生的文件File inFile = new File( "testIO_Files/fileIn.txt" );//创建一个文件字符输入流FileReader fr = new FileReader( inFile );//创建一个文件字符输出流FileWriter fw = new FileWriter( "testIO_Files/fileWrite.txt" );char[] cbuf = new char[16];int len = -1;while ( ( len = fr.read( cbuf ) ) != -1 ) {fw.write( cbuf, 0, len );}//关流fr.close();fw.close();}}

缓冲流:

1)有buffer比没有更快;

2)buffer放在中间层包装比放在外层更快;

3)按行或按块操作 比 按字节或字符操作更快(用Object流操作的速度 比 字节字符方式 更快)

4)缓冲区要结合流才可以使用,在流的基础上对流的功能进行了增强。

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedWriter;
import java.io.DataInputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.FileWriter;
import java.io.IOException;
import java.util.Scanner;import org.junit.Test;/*** 2018年5月3日 上午11:24:03* @author <a href="mailto:447441478@qq.com">宋进宇</a>*	演示 缓冲流*	    缓冲流其实就是一种装饰设计模式,对各种输入输出流进行功能强化*/
public class BufferedDemo {//给字节流 加缓冲@Testpublic void t1() throws IOException {//创建一个字节缓冲输入流BufferedInputStream bis = new BufferedInputStream( System.in );//创建一个字节缓冲输出流BufferedOutputStream bos = new BufferedOutputStream( System.out );while ( bis.available() != -1 ) {byte[] buf = new byte[8];int len = -1;len = bis.read(buf);bos.write( buf, 0, len );}bis.close();bos.close();}//给字符流 加缓冲@Test public void t2() throws IOException {//获取输入流Scanner sc = new Scanner(System.in);//给文件字符流加缓冲BufferedWriter bw = new BufferedWriter( new FileWriter( "testIO_Files/fileBuffered.txt" ) );while( sc.hasNext() ) {String str = sc.nextLine();bw.write( str );bw.newLine();}sc.close();bw.close();}//测试缓冲是否真的有加强普通流的能力//首先顺便搞1M字节内容写到文件中//再测试有没有加缓冲的读取速度/** 测试结果:加缓冲比不加缓冲速度快!* 		     缓冲加在离数据源越近越快!*/@Testpublic void t3() throws IOException{FileOutputStream fos = new FileOutputStream( "testIO_Files/testBuff.txt" );int i = 0;while(i<1024){byte[] buf = new byte[1024];for (int j = 0; j < buf.length; j++) {buf[j] = (byte) j;}fos.write(buf);i++;}fos.close();没有加缓冲/long t1 = System.currentTimeMillis();DataInputStream df = new DataInputStream( new FileInputStream( "testIO_Files/testBuff.txt" ) );byte[] buf = new byte[1024];int len = -1;while( ( len = df.read( buf ) ) != -1 ){System.out.println( new String( buf, 0, len ) );} long t2 = System.currentTimeMillis();df.close();//没有加缓冲/在最外层加缓冲//long t3 = System.currentTimeMillis();BufferedInputStream bdf = new BufferedInputStream( new DataInputStream( new FileInputStream( "testIO_Files/testBuff.txt" ) ) );buf = new byte[1024];len = -1;while( ( len = bdf.read( buf ) ) != -1 ){System.out.println( new String( buf ) );} long t4 = System.currentTimeMillis();bdf.close();在最外层加缓冲//在中间加缓冲//long t5 = System.currentTimeMillis();DataInputStream dbf = new DataInputStream( new BufferedInputStream( new FileInputStream( "testIO_Files/testBuff.txt" ) ) );buf = new byte[1024];len = -1;while( ( len = dbf.read( buf ) ) != -1 ){System.out.println( new String( buf ) );} long t6 = System.currentTimeMillis();dbf.close();在最外层加缓冲//System.out.println( "不加缓冲:" + ( t2 - t1 ) );System.out.println( "加在外层:" + ( t4 - t3 ) );System.out.println( "加在中间:" + ( t6 - t5 ) );}//测试字符缓冲流@Testpublic void t4() throws IOException{long t1 = System.currentTimeMillis();BufferedReader br = new BufferedReader(new BufferedReader( new InputStreamReader( new FileInputStream( "testIO_Files/test.txt" ) ) ) );String str = null;while ( ( str = br.readLine() ) != null ) {System.out.println( str );}long t2 = System.currentTimeMillis();br.close();/四层嵌套///long t3 = System.currentTimeMillis();BufferedReader br2 = new BufferedReader(new InputStreamReader( new BufferedInputStream( new FileInputStream( "testIO_Files/test.txt" ) ) ) );str = null;while ( ( str = br2.readLine() ) != null ) {System.out.println( str );}long t4 = System.currentTimeMillis();br2.close();System.out.println(t2-t1);System.out.println(t4-t3);} }