Day20-IO(2)

总结

我是最棒的!基础不牢,地动山摇!

字节流

适合除了文本文件以外的其他文件,比如图片,视频等等,与byte[]密切联系

FileInputStream(文件字节输入流)

常用方法read

FileOutputStream(文件字节输出流)

常用方法write

使用以上两种流实现非文本相关文件的复制

package cn.itsource.stream;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;

public class CopyFile {

	public static void main(String[] args) {
		//创建对应的输入输出流
		FileInputStream fis = null;
		FileOutputStream fos = null;
		
		try {
            //指定流指向的文件
			fis = new FileInputStream("F:/03.jpg");
			fos = new FileOutputStream("F:/03copy.jpg");
			
			byte[] b = new byte[1024];
			int read = -1;
            //读到末尾
			while((read = fis.read(b)) != -1){
                //边读取边写出,实现复制
				fos.write(b, 0, read);
			}
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally {
            //自己实现一个工具类用来关流
			IOUtils.closeIO(fis, fos);
		}
	}

}

IOUtils

package cn.itsource.stream;

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.Reader;
import java.io.Writer;

public class IOUtils {
	/**
	 * 关流
	 * @param is
	 * @param os
	 */
	public static void closeIO(InputStream is,OutputStream os){
		try {
			if(os != null){
				os.close();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}finally {
			try {
				if(is != null){
					is.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	
	/**
	 * 关流
	 * @param is
	 * @param os
	 */
	public static void closeIO(Reader reader,Writer writer){
		try {
			if(writer != null){
				writer.close();
			}
		} catch (IOException e) {
			e.printStackTrace();
		}finally {
			try {
				if(reader != null){
					reader.close();
				}
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	
}

乱码问题

  1. 编码和解码字符集不统一
  2. 字节流读取文本相关的数据

解决乱码问题

  1. 使用统一字符集的字符流读取或写出文本数据
  2. 将所有环境包括工具,设置成统一字符集UTF-8
package cn.itsource.stream;

import java.io.UnsupportedEncodingException;

public class CharSetTest {

	public static void main(String[] args) throws UnsupportedEncodingException {
		//编码,使用GBK
		String str = "wdnmd,真就白给呗";
		byte[] bytes = str.getBytes("GBK");
		
		//解码,使用其他任何方式编码都会乱码
		String str2 = new String(bytes,"GBK");
		System.out.println(str2);
	}

}

字符流

适合处理文本相关的文件,与char[]密切联系

FileReader(文件字符输入流)

常用方法read

FileWriter(文件字符输出流)

常用方法write,append

创建FileWriter对象时可以声明append为true,这样就不是覆盖文本原来的内容,而是在文本的末尾追加内容

使用字符流复制文本相关文件

package cn.itsource.readerwriter;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

import cn.itsource.stream.IOUtils;
/**
 *	字符流,适用于对文本相关文件的操作 
 */
public class FileReaderTest {

	public static void main(String[] args) {
        //创建流对象
		FileReader fr = null;
		FileWriter fw = null;
		try {
            //指定文件
			fr = new FileReader("test.txt");
			fw = new FileWriter("copytest.txt");
			char[] ch = new char[1024];
			int read = -1;
            //复制操作
			while ((read = fr.read(ch)) != -1) {
				fw.write(ch, 0, read);
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally {
            //关流
			IOUtils.closeIO(fr, fw);
		}
	}

}

转换流

InputStreamReader(将字节流转换为字符流)

处理文本相关文件时,如果只有字节流,就可以使用转换流来解决

OutputStreamWriter(将字符流转换成字节流)

道理同上

使用转换流解决字节流复制文本相关文件

package cn.itsource.streamRW;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;

import cn.itsource.stream.IOUtils;

public class OutputStreamWriterTest {
    
	public static void main(String[] args) {
		FileInputStream fis = null;
		InputStreamReader isr = null;
		FileOutputStream fos = null;
		OutputStreamWriter osw = null;
		try {
			fis = new FileInputStream("test.txt");
			isr = new InputStreamReader(fis);
			fos = new FileOutputStream("test4.txt");
			osw = new OutputStreamWriter(fos);
			
			char[] ch = new char[1024];
			int read = -1;
			while ((read = isr.read(ch)) != -1) {
				osw.write(ch, 0, read);
			}
			System.out.println("复制成功");
			
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}finally {
			IOUtils.closeIO(isr, osw);
		}
	}

}

JDK7关流的新特性

可以直接在try()中写要创建的流对象,格式如下,就不用再finally中关流了

package cn.itsource.readerwriter;

import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

/**
 *	字符流,适用于对文本相关文件的操作 
 */
public class FileReaderTest {

	public static void main(String[] args) {
		try (FileReader fr = new FileReader("test.txt");
			FileWriter fw = new FileWriter("test1.txt")
            ){
			char[] ch = new char[1024];
			int read = -1;
			while ((read = fr.read(ch)) != -1) {
				fw.write(ch, 0, read);
			}
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

}

猜你喜欢

转载自blog.csdn.net/t384061961/article/details/100106635