IO流的体系以及内容

 

FileReader(文件字符输入流)

作用:以内存为基准,可以把文件中的数据以字符的形式读到内存中去。

构造器

说明

   public FileReader​(File file)

创建字符输入流管道与源文件接通

   public FileReader​(String pathname)

创建字符输入流管道与源文件接通

方法名称

说明

   public int read()

每次读取一个字符返回,如果发现没有数据可读会返回-1.

   public int read(char[] buffer)

每次用一个字符数组去读取数据,返回字符数组读取了多少个字符,如果发现没有数据可读会返回-1.

public class FileInputStreamDemo1 {
public static void main(String[] args) throws Exception {
//文件字节输入流每次读取一个字节的形式
//创建文件字节输入流管道与源文件接通

// InputStream is = new FileInputStream(new File("day05-file-io\src\com\zxy\d2_file\dlei04.txt"));//简化写法
InputStream is = new FileInputStream("day05-file-io\\src\\com\\zxy\\d2_file\\dlei04.txt");//简化写法

//2、开始读取字节
// public int read()://每次读取一个字节返回,如果没有字节可读,返回-1
int b1 = is.read();
System.out.println((char)b1);

int b2 = is.read();
System.out.println((char)b2);

int b3 = is.read();
System.out.println(b3);


//3、使用循环改进
int b;//记住每个读取的一个字节
while ((b = is.read()) != -1){
System.out.println((char) b);
}

//拓展:
//一个一个字节的读数据,性能极差,禁止使用
//一个一个字节的读取汉字的字节并输出,是无法避免乱码的。

}
}

FileWriter(文件字符)

作用:以内存为基准,把内存中的数据以字符的形式写出到文件中去。

public class FileWriteDemo3 {
public static void main(String[] args) {
try(
// 目标:掌握文件字符输出流的使用。
// 1、创建一个文件字符输出流管道与目标文件接通
// Writer fw = new FileWriter("day06-io-thread/src/dlei02-out.txt"); // 覆盖管道
Writer fw = new FileWriter("day06-io\\src\\com\\zxy\\file\\dlei02-out.txt",true);

){
// 2、写字符数据出去。
// a.写一个字符出去 : public void write(int c)
fw.write(97);
fw.write(22859);
fw.write('z');


// b.写一个字符串出去:public void write(String s)
fw.write("ewq");
fw.write("云云");
fw.write("\r\n");//换行

// c、写字符串的一部分出去 : public void write(String s, int pos ,int len)
fw.write("我爱中国,月薪过万",0,5);
fw.write("\r\n");

// d.写一个字符数组出去:public void write(char[] chars)
char[] chars = "我爱云云abc".toCharArray();
fw.write(chars);
fw.write("\r\n");

// e、写一个字符数组的一部分出去:public void write(char[] chars, int pos ,int len)
fw.write(chars,3,2);
fw.write("\r\n");

// fw.flush();//刷新数据到文件,流可以继续使用
// fw.close(); //包含了刷新数据,但是流不能再继续使用了

}catch (Exception e){
e.printStackTrace();
}
}
}

 

1. 缓冲流有几种?
l 字节缓冲输入流: BufferedInputStream
l 字节缓冲输出流: BufferedOutputStream
l 字符缓冲输入流: BufferedReader
l 字符缓冲输出流: BufferedWriter
2. 字节缓冲流为什么提高了字节流读写数据的性能?
l 字节缓冲流自带 8KB 缓冲区
l 可以提高原始字节流、字符流读写数据的性能
3. 字节缓冲流如何使用?
l public BufferedOutputStream ​( OutputStream os )
l public BufferedInputStream ​( InputStream is )
l 功能上并无很大变化,性能提升了。

package com.zxy.file.d2_buffer_stream;

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.Reader;

public class BufferedReaderDemo2 {
public static void main(String[] args) {
// 目标:字符缓冲输入流的使用:提升原始字符输入流的读字符性能,多了按照行读取的能力。

try(
//1、创建一个文件字符输入流与源文件接通
Reader fr = new FileReader("day06-io\\src\\com\\zxy\\file\\dlei03.txt");
//把低级的字符输入流包装成高级的缓冲字符输入流
BufferedReader bw = new BufferedReader(fr);

) {
// // 2、public int read(char[] buffer):
// // 每次读取字符数组这么多字符,返回每次读取了多少个字符。如果没有字符可读返回-1.
// char[] buffer = new char[1024];
// int len;//记录每次读取的字符个数
// while ((len = bw.read()) != -1){
// String rs = new String(buffer,0,len);
// System.out.println(rs);
// }
//
//
// System.out.println(bw.readLine());
// System.out.println(bw.readLine());
// System.out.println(bw.readLine());
// System.out.println(bw.readLine());
// System.out.println(bw.readLine());
// System.out.println(bw.readLine());

//3、使用循环改进
String line;//记住读取的一行数据
while ((line = bw.readLine()) !=null){
System.out.println(line);
}


} catch (Exception e) {
e.printStackTrace();
}

}
}

 

 

package com.zxy.file.d2_buffer_stream;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.Writer;

public class BufferedWriterDemo3 {
public static void main(String[] args) {
try(
// 目标:掌握文件字符输出流的使用。
// 1、创建一个文件字符输出流管道与目标文件接通
// Writer fw = new FileWriter("day06-io-thread/src/dlei02-out.txt"); // 覆盖管道
Writer fw = new FileWriter("day06-io\\src\\com\\zxy\\file\\dlei04-out.txt",true);
// 把低级的字符输出流包装成高级的缓冲字符输出流
BufferedWriter bw = new BufferedWriter(fw);
){
// 2、写字符数据出去。
// a.写一个字符出去 : public void write(int c)
bw.write(97);
bw.write(22859);
bw.newLine(); // 换行


// b.写一个字符串出去:public void write(String s)
bw.write("ewq");
bw.write("云云");
bw.newLine(); // 换行

// c、写字符串的一部分出去 : public void write(String s, int pos ,int len)
bw.write("我爱中国,月薪过万",0,5);
bw.newLine(); // 换行

// d.写一个字符数组出去:public void write(char[] chars)
char[] chars = "我爱云云abc".toCharArray();
bw.write(chars);
bw.newLine(); // 换行

// e、写一个字符数组的一部分出去:public void write(char[] chars, int pos ,int len)
bw.write(chars,3,2);
bw.newLine(); // 换行

// fw.flush();//刷新数据到文件,流可以继续使用
// fw.close(); //包含了刷新数据,但是流不能再继续使用了

}catch (Exception e){
e.printStackTrace();
}
}
}

InputStreamReader(字符输入转换流)

l 解决不同编码时,字符流读取文本内容乱码的问题。
l 解决思路:先获取文件的原始字节流,再将其按真实的字符集编码转成字符输入流,这样字符输入流中的字符就不乱码了。

package com.zxy.file.d3_transfer_stream;

import java.io.*;

public class InputStreamReaderDemo2 {
public static void main(String[] args) {
// 目标:字符输入转换流。
try (
// 1、提取文件的原始字节输入流。 o [oo]
InputStream is = new FileInputStream("day06-io-thread\\src\\gbk.txt");
// 2、使用字符输入转换流按按照指定的编码将其转换成字符输入流。
Reader isr = new InputStreamReader(is, "GBK");
// 3、包装成高级的缓冲字符输入流
BufferedReader br = new BufferedReader(isr);
){
String line;
while ((line = br.readLine()) != null){
System.out.println(line);
}

}catch (Exception e){
e.printStackTrace();
}
}
}

OutputStreamWriter字符输出转换流

l 作用:可以控制写出去的字符使用什么字符集编码。
l 解决思路:获取字节输出流,再 按照指定 的字符集编码将其 转换成字符输 ,以后写出去的字符就会用该字符集编码了。
l

package com.zxy.file.d3_transfer_stream;

import java.io.*;

public class OutputStreamWriterDemo3 {
public static void main(String[] args) {
// 目标:掌握字符输出转换流可以指定写出去的字符编码
try (
// 1、先定义一个字节输出流管道通向目标文件
OutputStream os = new FileOutputStream("day06-io-thread/src/dlei05-out.txt");
// 2、按照指定字符集编码把这个字节输出流转换成字符输出流
Writer osw = new OutputStreamWriter(os, "GBK");
// 3、把低级的字符输出流包装成高级的缓冲字符输出流管道
BufferedWriter bw = new BufferedWriter(osw);
){
// 4、写数据出去
bw.write("我是字符输出转换流,我写出去的内容是GBK的!!!");
bw.newLine(); // 换行
bw.write("我是字符输出转换流,我写出去的内容是GBK的!!!");

} catch (Exception e) {
throw new RuntimeException(e);
}

}
}

PrintStream/PrintWriter(打印流)

l 作用:打印流可以实现更方便、更高效的打印数据出去,能实现打印啥出去就是啥出去。

package com.zxy.file.d4_printstream;


import java.io.FileOutputStream;
import java.io.PrintStream;

public class PrintStreamDemo1 {
public static void main(String[] args) {
try (
// 1、创建打印流管道
// PrintStream ps = new PrintStream("day06-io-thread/src/ps.txt"); // 覆盖管道
PrintStream ps = new PrintStream(new FileOutputStream("day06-io-thread/src/ps.txt", true)); // 追加管道
// PrintWriter ps = new PrintWriter("day06-io-thread/src/ps.txt"); // 覆盖管道
){
// 2、打印数据出去
ps.println(97); // 自带换行
ps.println(98.5);
ps.println("我爱你中国");
ps.println('a');
ps.println(true);

}catch (Exception e){
e.printStackTrace();
}
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值