JavaSe——IO流_Part2

A.转换流

l  由于字节流操作中文不是特别方便,所以,java就提供了转换流。

l  字符流=字节流+编码表。

package com.core.io.demo;

import java.io.UnsupportedEncodingException;
import java.util.Arrays;

public class Test {

	public static void main(String[] args) throws UnsupportedEncodingException {
		//String---byte
		String s = "你好";
		byte[] bs1 = s.getBytes();
		byte[] bs2 = s.getBytes("GBK");
		byte[] bs3 = s.getBytes("utf-8");
		System.out.println(Arrays.toString(bs1));//[-60, -29, -70, -61]
		System.out.println(Arrays.toString(bs2));//[-60, -29, -70, -61]
		System.out.println(Arrays.toString(bs3));//[-28, -67, -96, -27, -91, -67]
		
		//bye----String
		byte[] bs4 = {-60, -29, -70, -61};
		System.out.println(new String(bs4));//你好
		System.out.println(new String(bs4,"GBK"));//你好
		byte[] bs5 = {-28, -67, -96, -27, -91, -67};
		System.out.println(new String(bs5,"utf-8"));//你好
		System.out.println(new String(bs5));//浣犲ソ
		System.out.println(new String(bs4,"utf-8"));//???
	}

}


B.转换流OutputStreamWriter

package com.core.io.demo;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;

public class Test2 {
	// 转换流,OutputStreamWriter的使用
	public static void main(String[] args) throws UnsupportedEncodingException,
			IOException {
		// OutputStreamWriter(OutputStream out)
		// 创建使用默认字符编码的 OutputStreamWriter。
		// OutputStreamWriter(OutputStream out, Charset cs)
		// 创建使用给定字符集的 OutputStreamWriter。
		// OutputStreamWriter(OutputStream out, CharsetEncoder enc)
		// 创建使用给定字符集编码器的 OutputStreamWriter。
		// OutputStreamWriter(OutputStream out, String charsetName)
		// 创建使用指定字符集的 OutputStreamWriter。

		// OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(
		// "osw.txt"));// 默认使用GBK
		// OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(
		// "osw.txt"),"GBK");// 指定使用GBK
		OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(
				"osw.txt"), "UTF-8");// 指定使用UTF-8

		osw.write("中国UTF-8");// 不需要getbytes了

		osw.close();
	}

}


C.转换流InputStreamWriter


package com.core.io.demo;

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

public class Test3 {
	// 转换流,InputStreamWriter的使用
	public static void main(String[] args) throws IOException {
		InputStreamReader isr = new InputStreamReader(new FileInputStream(
				"osw-gbk.txt"));
		// 使用指定编码(gbk),读取数据

		// 一次读取一个字符
		int ch = 0;
		while ((ch = isr.read()) != -1) {
			System.out.print((char) ch);// 中国gbk
		}

		isr.close();

		InputStreamReader isr2 = new InputStreamReader(new FileInputStream(
				"osw-utf.txt"), "utf-8");// 使用指定字符集读取数据
		int ch2 = 0;
		while ((ch2 = isr2.read()) != -1) {
			System.out.print((char) ch2);// 中国UTF-8
		}
		// 关资源
		isr2.close();
	}

}


D.字符流的5种写数据的方式

l  OutputStreamWriter写数据方法

•    public void write(int c)

•    public void write(char[] cbuf)

•    public void write(char[] cbuf,int off,int len)

•    public void write(String str)

•    public void write(String str,int off,int len)

l  字符流操作要注意的问题

•    flush()的作用

•    flush()和close()的区别


package com.core.io.demo;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;

public class Test4 {
	// D.字符流的5种写数据的方式
	// l OutputStreamWriter写数据方法
	// • public void write(int c)
	// • public void write(char[] cbuf)
	// • public void write(char[] cbuf,int off,int len)
	// • public void write(String str)
	// • public void write(String str,int off,int len)
	// l 字符流操作要注意的问题
	// • flush()的作用
	// • flush()和close()的区别

	public static void main(String[] args) throws IOException {
		OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("osw.txt"));
		//写一个字符
		osw.write(97);
		osw.write('a');
		
		//写一个字符数组
		char[] chs = {'b','c','d',102,103};
		osw.write(chs );
		
		//写一个换行
		osw.write("\n\r");
		//写一个字符数组的一部分
		osw.write(chs, 1, 2);
		
		//写一个字符串
		String str = "中国 China";
		osw.write(str);
		//写一个字符串的一部分
		osw.write(str,0,2);
		
		//刷新缓冲区
		osw.flush();
		osw.close();
		
//		aabcdfg
//
//		cd中国 China中国
	}

}


E.字符流的2种读数据的方式

1.一次读一个字符
2.一次读一个字符数组

package com.core.io.demo;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

public class Test5 {
	// 字符流读取数据的两种方式
	public static void main(String[] args) throws IOException {
		// A.一次读取一个字符
		InputStreamReader isr = new InputStreamReader(new FileInputStream(
				"file.java"));
		int ch = 0;
		while ((ch = isr.read()) != -1) {
			System.out.print((char) ch);
		}

		isr.close();
		// B.一次读取一个字符数组
		
		System.out.println("-----------------");
		InputStreamReader isr2 = new InputStreamReader(new FileInputStream(
				"file.java"));

		char[] chs = new char[1024];
		int len = 0;
		while((len = isr2.read(chs))!=-1){
			System.out.print(new String(chs,0,len));
		}
		
		isr2.close();
		
	}

}

F.字符流文件复制

package com.core.io.demo;

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

public class Test6 {
	// 字符流文件复制的两种方式
	public static void main(String[] args) throws IOException {
		// A.一次读取一个字符
		InputStreamReader isr = new InputStreamReader(new FileInputStream(
				"file.java"),"UTF-8");
		OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("fileA.java"),"UTF-8");
		int ch = 0;
		while ((ch = isr.read()) != -1) {
			osw.write(ch);
		}

		isr.close();
		osw.close();
		// B.一次读取一个字符数组
		
		System.out.println("-----------------");
		InputStreamReader isr2 = new InputStreamReader(new FileInputStream(
				"file.java"),"UTF-8");
		OutputStreamWriter osw2 = new OutputStreamWriter(new FileOutputStream("fileB.java"),"UTF-8");
		char[] chs = new char[1024];
		int len = 0;
		while((len = isr2.read(chs))!=-1){
			osw2.write(chs, 0, len);
		}
		
		isr2.close();
		osw2.close();
		
	}

}


G.转换流的简化书写,FileReader&FileWriter

转换流的名字比较长,而我们常见的操作都是按照本地默认编码实现的,所以,为了简化我们书写,转换流提供了对应的子类。
FileWriter
FileReader

package com.core.io.demo2;

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

public class Test {

	public static void main(String[] args) throws IOException {
		// FileReader & FileWriter
		FileReader fr = new FileReader("file.java");
		FileWriter fw = new FileWriter("fileA.java");
		// 方法1:一次读写一个字符
		int ch;
		while ((ch = fr.read()) != -1) {
			fw.write(ch);
		}

		fr.close();
		fw.close();
		
		// 方法2:一次读写一个字符数组
		FileReader fr2 = new FileReader("file.java");
		FileWriter fw2 = new FileWriter("fileB.java");
		int len =0;
		char[] chs = new char[1024];
		while((len = fr2.read(chs))!=-1){
			fw2.write(chs, 0, len);
		}

		fr2.close();
		fw2.close();
	}

}


H.字符缓冲输出流BufferedWriter & 字符缓冲输入流BufferedReader

特殊用法

BufferedWriter

-newLine()

BufferedReader

-readLine()

使用字符缓存流复制数据的3种方式

package com.core.io.demo2;

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

public class Test2 {
	// 使用字符缓存流复制数据3种方式
	public static void main(String[] args) throws IOException {
		method1();
		method2();
		method3();
	}

	// 使用字符缓存流的特殊方法读取数据
	private static void method3() throws IOException {
		BufferedReader br = new BufferedReader(new FileReader("file.java"));
		BufferedWriter bw = new BufferedWriter(new FileWriter("fileE.java"));

		String line = null;
		while((line = br.readLine())!=null){
			bw.write(line);
			bw.newLine();
			bw.flush();
		}
		
		// 关资源
		br.close();
		bw.close();
	}

	// 一次读写一个字符数组
	private static void method2() throws IOException {
		BufferedReader br = new BufferedReader(new FileReader("file.java"));
		BufferedWriter bw = new BufferedWriter(new FileWriter("fileD.java"));

		int len = 0;
		char[] chs = new char[1024];
		while ((len = br.read(chs)) != -1) {
			bw.write(chs, 0, len);
			bw.flush();
		}
		// 关资源
		br.close();
		bw.close();

	}

	// 一次读写一个字符
	private static void method1() throws IOException {
		BufferedReader br = new BufferedReader(new FileReader("file.java"));
		BufferedWriter bw = new BufferedWriter(new FileWriter("fileC.java"));

		int ch = 0;
		while ((ch = br.read()) != -1) {
			bw.write(ch);
		}
		// 关资源
		br.close();
		bw.close();
	}

}





I .复制文本文件的5种方式案例(字符流)

FileWriter & FileReader:  一次读一个字符、一个读一个字符数组

BufferedWriter & BufferedReader : 一次读一个字符、一个读一个字符数组、特殊的方法(newLine()、readLine())


J.复制图片的4种方式案例(字节流)

FileOutputStream & FileInputStream: 一次读一个字符、一个读一个字符数组

BufferedOutputStream & BufferedInputStream:一次读一个字符、一个读一个字符数组


K.文件和集合ArrayList

package com.core.io.demo2;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.util.ArrayList;

public class Test3 {
	// ArrayList存进文件
	// 文件取出来存到ArrayList
	public static void main(String[] args) throws IOException {
		ArrayList<String> list = new ArrayList<String>();
		list.add("hello");
		list.add("world");
		list.add("java");
		list.add("android");
		
		FileWriter fw = new FileWriter("list.txt");
		BufferedWriter bw = new BufferedWriter(fw);
		for (String str : list) {
			bw.write(str);
			bw.newLine();
			bw.flush();
		}
		bw.close();
		System.out.println("-----------");
		
		BufferedReader br = new BufferedReader(new FileReader("list.txt"));
		ArrayList<String> list2 = new ArrayList<String>();
		String line = null;
		while((line= br.readLine())!=null){
			list2.add(line);
		}
		br.close();
		for (String str : list2) {
			System.out.println(str);
		}
	}


}

L.复制单级文件夹案例

package com.core.io.demo2;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.Arrays;

public class Test4 {
	public static void main(String[] args) throws IOException {
		// 复制单机文件夹
		// E:\temp\a----》E:\temp\b
		// method1();
		// 复制单级目录指定后缀名并修改后缀名
		System.out.println("over...");
		method2();
	}

	private static void method2() throws IOException {
		File srcFile = new File("e:\\temp\\a");
		File desFile = new File("e:\\temp\\c");
		if (!desFile.exists()) {
			desFile.mkdir();
		}
		File[] listFiles = srcFile.listFiles(new FilenameFilter() {

			@Override
			public boolean accept(File dir, String name) {
				return new File(dir, name).isFile() && name.endsWith(".java");
			}
		});

		System.out.println(Arrays.toString(listFiles));
		for (File file : listFiles) {
			String name = file.getName();
			File newFile = new File(desFile, name);
			copyFile2(file, newFile);
			String newName = name.replace(".java", ".jad");
			File newNameFile = new File(desFile, newName);
			newFile.renameTo(newNameFile);
		}
	}

	private static void copyFile2(File file, File newFile) throws IOException {
		BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
				file));
		BufferedOutputStream bos = new BufferedOutputStream(
				new FileOutputStream(newFile));
		byte[] bys = new byte[1024];
		int len = 0;
		while ((len = bis.read(bys)) != -1) {
			bos.write(bys, 0, len);
		}
		bos.close();
		bis.close();
		
		
	}

	private static void method1() throws IOException {
		File srcFile = new File("e:\\temp\\a");
		File[] listFiles = srcFile.listFiles();

		File desFile = new File("e:\\temp\\b");
		if (!desFile.exists()) {
			desFile.mkdir();
		}

		for (File file : listFiles) {
			String name = file.getName();
			File newFile = new File(desFile, name);
			copyFile(file, newFile);
		}
	}

	private static void copyFile(File srcFile, File newFile) throws IOException {
		BufferedReader br = new BufferedReader(new FileReader(srcFile));
		BufferedWriter bw = new BufferedWriter(new FileWriter(newFile));

		if (!newFile.exists()) {
			newFile.createNewFile();
		}
		String line = null;
		while ((line = br.readLine()) != null) {
			bw.write(line);
			bw.newLine();
			bw.flush();
		}
		bw.close();
		br.close();
	}

}


M.复制多级文件夹案例

package com.core.io.demo2;

import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.FilenameFilter;
import java.io.IOException;
import java.util.Arrays;

public class Test5 {
	public static void main(String[] args) throws IOException {
		// 复制多级文件
		File srcFile = new File("e:\\temp\\a");
		File desFile = new File("e:\\temp\\b");
		if (!desFile.exists()) {
			desFile.mkdir();
		}
		copyFolder(srcFile, desFile);
		System.out.println("over...");

	}

	private static void copyFolder(File srcFile, File desFile)
			throws IOException {
		if (srcFile.isDirectory()) {
			File newFloder = new File(desFile, srcFile.getName());
			newFloder.mkdir();
			File[] listFiles = srcFile.listFiles();
			for (File file : listFiles) {
				copyFolder(file, newFloder);
			}

		} else {
			String name = srcFile.getName();
			System.out.println("复制文件:" + name);
			File newFile = new File(desFile, name);
			copyFile(srcFile, newFile);
		}
	}

	private static void copyFile(File srcFile, File desFile) throws IOException {
		BufferedInputStream bis = new BufferedInputStream(new FileInputStream(
				srcFile));
		BufferedOutputStream bos = new BufferedOutputStream(
				new FileOutputStream(desFile));
		byte[] bys = new byte[1024];
		int len = 0;
		while ((len = bis.read(bys)) != -1) {
			bos.write(bys, 0, len);
		}
		bos.close();
		bis.close();
	}

}

N.LineNumberReader

package com.core.io.demo3;

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

public class Test {

	public static void main(String[] args) throws IOException {
		//LineNumberReader
		//是bufferedReader的子类
		LineNumberReader lnr = new LineNumberReader(new FileReader("file.java"));
		String line = null;
		while((line = lnr.readLine())!=null){
			int lineNumber = lnr.getLineNumber();
			System.out.println(lineNumber+":"+line);
		}
		lnr.close();
	}

}


         IO流

                   |--字节流

                            |--字节输入流

                                     InputStream

                                               intread():一次读取一个字节

                                               intread(byte[] bys):一次读取一个字节数组

                                    

                                               |--FileInputStream

                                               |--BufferedInputStream

                            |--字节输出流

                                     OutputStream

                                               voidwrite(int by):一次写一个字节

                                               voidwrite(byte[] bys,int index,int len):一次写一个字节数组的一部分

                                              

                                               |--FileOutputStream

                                               |--BufferedOutputStream

                   |--字符流

                            |--字符输入流

                                     Reader

                                               intread():一次读取一个字符

                                               intread(char[] chs):一次读取一个字符数组

                                              

                                               |--InputStreamReader

                                                        |--FileReader

                                               |--BufferedReader

                                                        StringreadLine():一次读取一个字符串

                            |--字符输出流

                                     Writer

                                               voidwrite(int ch):一次写一个字符

                                               voidwrite(char[] chs,int index,int len):一次写一个字符数组的一部分

                                              

                                               |--OutputStreamWriter

                                                        |--FileWriter

                                               |--BufferedWriter

                                                        voidnewLine():写一个换行符

                                                       

                                                        voidwrite(String line):一次写一个字符串













评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值