由于字节流操作中文不是特别方便,所以,java就提供了字符流。
public byte[] getBytes();使用平台的默认字符集将此 String编码为 byte 序列,并将结果存储到一个新的 byte 数组中。
public byte[] getBytes(String charsetName) 使用指定的字符集将此 String 编码为 byte 序列,并将结果存储到一个新的 byte 数组中。
public String(byte[] bytes): 通过使用平台的默认字符集解码指定的 byte 数组,构造一个新的 String。
public String(byte[] bytes, String charsetName) 通过使用指定的 charset 解码指定的 byte 数组,构造一个新的 String。
OutputStreamWriter(OutputStream out):根据默认编码(GBK)把字节流的数据转换为字符流
OutputStreamWriter(OutputStream out,String charsetName):根据指定编码把字节流数据转换为字符流
InputStreamReader(InputStream is):用默认的编码(GBK)读取数据
InputStreamReader(InputStream is,String charsetName):用指定的编码读取数据
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) 写一个字符串的一部分
public int read() 一次读取一个字符,如果没有读到 返回-1
public int read(char[] cbuf) 一次读取一个字符数组 如果没有读到 返回-1
package com.wetstmo.demo.demo2;
import java.io.*;
public class MyDemo1 {
public static void main(String[] args) throws IOException {
OutputStreamWriter out = new OutputStreamWriter(new FileOutputStream("a.txt"));
out.write('你');//一次写入一个字符
out.write("\r\n");//写入换行符;
out.flush();//写入后必须进行刷新
out.write("武汉加油!");//写入一个字符串
out.write("武汉加油!!!!",0,3);//写入字符串的一部分
char[] chars={'1','q','好','!'};
out.write(chars);//写入字符数组
out.write(chars,0,2);//写入字符数组的一部分
out.close();//关闭并刷新
//创建使用指定字符集的OutputStreamWriter
OutputStreamWriter out1 = new OutputStreamWriter(new FileOutputStream("b.txt"), "utf-8");
out1.write("武汉加油!");
out1.flush();
out1.close();
}
}
转换流的名字比较长,而我们常见的操作都是按照本地默认编码实现的,所以,为了简化我们的书写,转换流提供了对应的子类。
//复制文本文件
package com.wetstmo.demo.demo2;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
public class MyDemo2 {
public static void main(String[] args) throws IOException {
FileReader in = new FileReader("SortArray.java");
FileWriter out = new FileWriter("E:\\123\\SortArray.java");
int len=0;
long start = System.currentTimeMillis();
char[] chars = new char[1000];
while ((len = in.read(chars)) != -1) {
out.write(chars,0,len);
out.flush();
}
in.close();
out.close();
long end = System.currentTimeMillis();
System.out.println("耗费时间"+(end-start));//25 6.23KB
}
}
高效的字符流
package com.wetstmo.demo.demo2;
import java.io.*;
public class MyDemo2 {
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new FileReader("SortArray.java"));
BufferedWriter out = new BufferedWriter(new FileWriter("E:\\123\\SortArray.java"));
int len=0;
long start = System.currentTimeMillis();
while ((len = in.read()) != -1) {
out.write(len);
out.flush();
}
in.close();
out.close();
long end = System.currentTimeMillis();
System.out.println("耗费时间"+(end-start));//111 6.23KB
}
}
BufferedWriter: public void newLine():根据系统来决定换行符 具有系统兼容性的换行符
BufferedReader: public String readLine():一次读取一行数据 是以换行符为标记的 读到换行符就换行 没读到数据返回null
案例演示复制文件
package com.wetstmo.demo.demo2;
import java.io.*;
public class MyDemo2 {
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new FileReader("SortArray.java"));
BufferedWriter out = new BufferedWriter(new FileWriter("E:\\123\\SortArray.java"));
long start = System.currentTimeMillis();
String str=null;
while ((str=in.readLine())!=null) {
out.write(str);
out.newLine();//写入换行符,
out.flush();
}
in.close();
out.close();
long end = System.currentTimeMillis();
System.out.println("耗费时间"+(end-start));
}
}
我有一个文本文件,每一行是一个学生的名字,请写一个程序,每次允许随机获取一个学生名称
package com.wetstmo.demo.demo2;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Random;
public class MyDemo3 {
public static void main(String[] args) throws IOException {
BufferedReader out = new BufferedReader(new FileReader("c.txt"));
ArrayList arrayList = new ArrayList();
String str=null;
while ((str = out.readLine()) != null) {
arrayList.add(str);
}
int i = new Random().nextInt(arrayList.size());
String s = arrayList.get(i);
System.out.println("抽到的是"+s);
}
}
复制D:\\demo目录下所有以.java结尾的文件到E:\\demo .并且将其后缀名更改文为jad
package com.wetstmo.demo.demo1;
import java.io.*;
public class MyDemo6 {
public static void main(String[] args) throws IOException {
File file = new File("D:\\123");
File file1 = new File("E:\\123");
if (!file.exists()) {
file.mkdirs();
}
copy(file1,file);
}
private static void copy(File file1, File file) throws IOException {
File[] files = file1.listFiles();
for (File file2 : files) {
if (file2.isFile()) {
BufferedReader in = new BufferedReader(new FileReader(file2));
String name = file2.getName();
if (file2.getName().endsWith(".java")) {
name = file2.getName().replace(".java", ".jpd");
}
File file3 = new File(file, name);
BufferedWriter out = new BufferedWriter(new FileWriter(file3));
Show(in, out);
}else{
String name = file2.getName();
File file4 = new File(file, name);
if(!file4.exists()) {
file4.mkdirs();
}
copy(file2,file4);
}
}
}
private static void Show(BufferedReader in, BufferedWriter out) throws IOException {
String str=null;
while ((str = in.readLine()) != null) {
out.write(str);
out.newLine();
out.flush();
}
in.close();
out.close();
}
}