1.字节流,读取过程用byte[]接收
byte[] buffer = new byte[1024];
int len; // 记录每次读取的字节数。
while ((len = bis.read(buffer)) != -1){
bos.write(buffer, 0 , len);
}
2.字符流,读取过程用char[]接收
char[] buffer = new char[1024]; // 1K字符
int len;
while ((len = fr.read(buffer)) != -1) {
String rs = new String(buffer, 0, len);
System.out.print(rs);
}
3.缓冲字节流,缓冲字符流读取速度快(定义时对字符流或者字节流包装就行)
Reader reader = new FileReader("F:\\test.txt");
BufferedReader bufReader = new BufferedReader(reader);
Writer writer = new FileWriter("F:\\test1.txt");
BufferedWriter bufWriter = new BufferedWriter(writer);
4.String的indexOf() 和substring 函数
使用过程注意库里的很多函数的名字一样,入口参数数量和类型都可能有区别。
Collections.sort(data, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return StandarSort.indexOf(o1.substring(0, o1.indexOf(".")))
- StandarSort.indexOf(o2.substring(0, o2.indexOf(".")));
}
});
文档里搜的:
indexOf(),反正返回的是集合里的索引,代码这里就是用的o1和o2返回的索引来实现升序。
substring()我找的String这个类里面,入口参数是两个int类型参数的这个
代码里:o2.substring(0, o2.indexOf(".")) 就是从0到"."的索引(int)处的部分,我的代码里就是"."前面的汉字数字;
5.遇到的问题:
写出的程序能将读取到的内容打印出来,却无法写入制定的新文件
其实就是没搞懂Java的try-with-source
注意它的作用是: 保证每个资源都被关闭
把获取对象的语句放在try后面的括号里,就不用在使用完该资源后再去关闭它,这样就可以减少代码量。
实例:如果我直接这么写
package com.itheima.MyClass;
import java.io.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class SortFile2 {
public static void main(String[] args) throws Exception {
//先定义字符输入输出两个流
//定义了流再包装,即定义缓冲流
Reader reader = new FileReader("F:\\test.txt");
BufferedReader bufReader = new BufferedReader(reader);
Writer writer = new FileWriter("F:\\test1.txt");
BufferedWriter bufWriter = new BufferedWriter(writer);
String LineString;
List<String> data = new ArrayList<>();
long StartTime = System.currentTimeMillis();
while ((LineString = bufReader.readLine()) != null) {
//把读入的文件先存下,存到集合里
data.add(LineString);
}
System.out.println("全部加入集合List中");
//对文件排序
List<String> StandarSort = new ArrayList<>();
Collections.addAll(StandarSort, "一", "二", "三", "四", "五", "陆", "柒", "八", "九", "十", "十一");
Collections.sort(data, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return StandarSort.indexOf(o1.substring(0, o1.indexOf(".")))
- StandarSort.indexOf(o2.substring(0, o2.indexOf(".")));
}
});
//排序后用输出流输出
System.out.println("排序完毕,开始输出");
for (String EachString : data) {
bufWriter.write(EachString);
bufWriter.newLine();
}
long endTime = System.currentTimeMillis();
System.out.println("输出完毕,共花费时间(ms):"+(endTime-StartTime));
}
}
并不能写入制定的文件,原因就是输入流和输出流,在使用完后没有关闭。
所以我需要在代码的最后加上(可以抛出异常,也可以用try-catch):
bufReader.close();
bufWriter.close();
然后我用try-with-source就不用自己再去关闭输入流和输出流:
package com.itheima.MyClass;
import java.io.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
public class SortFile2 {
public static void main(String[] args) throws Exception {
//先定义字符输入输出两个流
//定义了流再包装,即定义缓冲流
try (
Reader reader = new FileReader("F:\\test.txt");
BufferedReader bufReader = new BufferedReader(reader);
Writer writer = new FileWriter("F:\\test1.txt");
BufferedWriter bufWriter = new BufferedWriter(writer);
)
{
String LineString;
List<String> data = new ArrayList<>();
long StartTime = System.currentTimeMillis();
while ((LineString = bufReader.readLine()) != null) {
//把读入的文件先存下,存到集合里
data.add(LineString);
}
System.out.println("全部加入集合List中");
//对文件排序
List<String> StandarSort = new ArrayList<>();
Collections.addAll(StandarSort, "一", "二", "三", "四", "五", "陆", "柒", "八", "九", "十", "十一");
Collections.sort(data, new Comparator<String>() {
@Override
public int compare(String o1, String o2) {
return StandarSort.indexOf(o1.substring(0, o1.indexOf(".")))
- StandarSort.indexOf(o2.substring(0, o2.indexOf(".")));
}
});
//排序后用输出流输出
System.out.println("排序完毕,开始输出");
for (String EachString : data) {
bufWriter.write(EachString);
bufWriter.newLine();
}
long endTime = System.currentTimeMillis();
System.out.println("输出完毕,共花费时间(ms):"+(endTime-StartTime));
}catch (Exception e){
}
}
}