文件流对象
file
File f = new File();
字节输出流
FileOutputStream fos = new FileOutputStream(file);
文件输入流
FileInputStream fos = new FileInputStream(file);
// 文件fos.txt必须存在
FileInputStream is = new FileInputStream("fos.txt");
int len ;
byte[] b = new byte[2];
while ((len = is.read(b))!=-1){
System.out.println(new String(b,0,len));
}
is.close();
字符输入流
FileReader fr = new FileReader("fos.txt");
// 定义变量,保存数据
int b;
char[] ch= new char[1024];
// 循环读取
while ((b = fr.read(ch))!=-1) {
System.out.println(ch);
}
// 关闭资源
fr.close();
字符输出流
// 使用文件名称创建流对象
FileWriter fw = new FileWriter("fos.txt");
// 写出数据
fw.write(97);
fw.write('b');
fw.write('C');
fw.write(30000);
/*
【注意】关闭资源时,与FileOutputStream不同。
如果不关闭,数据只是保存到缓冲区数组,并未保存到文件。
*/
fw.close();
文件拷贝
//一次读写一个字符的拷贝
FileReader fr = new FileReader("fos.txt");
//没有文件创建,输出流内置数组
FileWriter fw = new FileWriter("foi.txt");
int ch;
char[] arr = new char[2];
while ((ch=fr.read(arr))!=-1) {
System.out.print((char)ch);//你好你好啊
fw.write(arr,0,ch);
}
fr.close();
fw.close();//关闭,刷新,数组,文件
缓冲流
- 字节缓冲流:
BufferedInputStream
,BufferedOutputStream
- 字符缓冲流:
BufferedReader
,BufferedWriter
// 记录开始时间
long start = System.currentTimeMillis();
// 创建流对象
try (
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("jdk-6u45-windows-x64.exe"));
BufferedOutputStream bos = new BufferedOutputStream(new FileOutputStream("cope.exe"));){
// 读写数据
int b;
while ((b = bis.read()) != -1) {
bos.write(b);
}
} catch (IOException e) {
e.printStackTrace();
}
// 记录结束时间
long end = System.currentTimeMillis();
System.out.println("缓冲流复制时间:"+(end - start)+" 毫秒");
字符缓冲流
public BufferedReader(Reader in)
:创建一个 新的缓冲输入流。public BufferedWriter(Writer out)
: 创建一个新的缓冲输出流。
// 创建map集合,保存文本数据,键为序号,值为文字
HashMap<String, String> lineMap = new HashMap<>();
// 创建流对象
BufferedReader br = new BufferedReader(new FileReader("in.txt"));
BufferedWriter bw = new BufferedWriter(new FileWriter("out.txt"));
// 读取数据
String line = null;
while ((line = br.readLine())!=null) {
// 解析文本
String[] split = line.split("\\.");//注意切割的是正则表达式,表示点要用\\.而不是任意字符.
// 保存到集合
lineMap.put(split[0],split[1]);
}
// 释放资源
br.close();
// 遍历map集合,用普通for循环!!!,这里巧妙利用的文本的行号1,2等,从而不用对集合的键进行排序
for (int i = 1; i <= lineMap.size(); i++) {//i,对应的是行号,即排好序的键
String key = String.valueOf(i);//把数字变成字符串,如1变成"1",看不惯你用+号拼接也可
// 获取map中文本
String value = lineMap.get(key);
// 写出拼接文本
bw.write(key+"."+value);
// 写出换行
bw.newLine();
}
// 释放资源
bw.close();
转换流
字节输入流
InputStreamReader(InputStream in)
: 创建一个使用默认字符集的字符输入流。 字节流到字符流的桥梁InputStreamReader(InputStream in, String charsetName)
: 创建一个指定字符集的字符输入流。- 字节输出流
OutputStreamWriter(OutputStream in)
: 创建一个使用默认字符集的字符输出流。 ,字符流到字节流的桥梁OutputStreamWriter(OutputStream in, String charsetName)
: 创建一个指定字符集的字符输出流。
// 必须要知道其文件的编码形式
InputStreamReader is = new InputStreamReader(new FileInputStream("new-charset.txt"),"GBK");
OutputStreamWriter os = new OutputStreamWriter(new FileOutputStream("charset.txt"));
int b;
while ((b = is.read()) != -1) {
System.out.println((char)b);
os.write(b);
}
os.flush();
os.close();