IO流之字符流

3 篇文章 0 订阅

3 字符流

3.1 为什么会出现字符流

由于字节流操作中文不是特别方便所以Java就提供字符流

字符流=字节流+编码表

3.2 字符串中的编码解码问题

编码:

  • byte[] getBytes():使用平台的默认字符集将该String编码为一系列字节,将结果存储到新的字节数组中
  • byte[] getBytes(String charsetName): 使用指定的字符集将该String编码为一系列字节,将结果存储到新的字节数组中

解码:

  • String (byte[] bytes):通过使用平台的默认字符集解码指定的字节数组来构造新的String
  • String (byte[] bytes,String charsetName): 通过指定的字符集解码指定的字节数组来构造新的String
public static void main(String[] args) throws Exception {
	String s="中国";
	
	//使用平台默认方式编码
	byte[] bys=s.getBytes();
	System.out.println(Arrays.toString(bys));
	
	//使用自定义编码方式
	byte[] bytes = s.getBytes("GBK");
	System.out.println(Arrays.toString(bytes));
	
	//使用平台默认方式解码
	String s1 = new String(bys);
	System.out.println(s1);
	
	//使用自定义解码方式
	String s2 = new String(bytes,"GBK");
	System.out.println(s2);
}

3.3 字符流中的编码解码问题

字符流抽象基类

  • Reader: 字符输入流的抽象类
  • Writer:字符输出流的抽象类

字符流中和编码解码问题相关的两个类:

  • InputStreamReader:是从字节流到字符流的桥梁
  • OutputStreamWriter:是从字符流到字节流的桥梁
public static void main(String[] args) throws IOException {
	FileOutputStream fos = new FileOutputStream("D:\\itcast\\java.txt");
	OutputStreamWriter osw = new OutputStreamWriter(fos,"GBK");
	osw.write("中国");
	osw.close();
	
	FileInputStream fis= new FileInputStream("D:\\\\itcast\\\\java.txt");
	InputStreamReader isr = new InputStreamReader(fis,"GBK");
	
	  int ch; while((ch=isr.read())!=-1) 
	  {
		  System.out.print((char)ch);
		  }
	 
	isr.close();
}

3.4 字符流写数据的5种方式

方法名说明
void write(int c)写一个字符
void write(char[] cbuf)写入一个字符数组
void write(char[ cbuf, int off, int len])写入字符数组的一部分
void write(String str)写一个字符串
void wite(String str, int off, int len)写一个字符串的一部分
public static void main(String[] args) throws IOException {
	FileOutputStream fos = new FileOutputStream("D:\\itcast\\osw.txt");
	OutputStreamWriter osw = new OutputStreamWriter(fos);
	osw.write(97);
	osw.flush();//刷新流,将缓冲区的字符流写入文件
	
	char[] ch= {'a','a','b','b'};
	osw.write(ch);
	osw.flush();
	
	osw.write(ch,1,3);
	osw.flush();
	
	String s="abcdefg";
	 osw.write(s);
	 osw.flush();
	 
	 osw.write(s,1,3);
	
	osw.close();//先刷新再关闭
}

3.5 字符流读数据的2种方式

方法名说明
int read( )一次读一个字符
int read(char[] cbuf)一次读一个字符数组
public static void main(String[] args) throws IOException {
	FileInputStream fis = new FileInputStream("D:\\itcast\\osw.txt");
	InputStreamReader isr = new InputStreamReader(fis);
	
	//一次读一个字符
//	int ch;
//	while((ch=isr.read())!=-1) {
//		System.out.print((char)ch);
//	}
	
	
	//一次读一个字符数组
	char[] chs=new char[1024];
	int len;
	while((len=isr.read(chs))!=-1) {
		System.out.print(new String(chs,0,len));
	}
	
	isr.close();
}

3.6 字符缓冲流

字符缓冲流:

  • BufferedWriter: 将文本写入字符输出流,缓冲字符,以提供单个字符,数组和字符串的高效写入,可以指定缓冲区大小,或者可以接受默认大小。默认值足够大,可用于大多数用途。
  • BufferedReader: 从字符输入流读取文本,缓冲字符,以提供字符,数组和行的高效读取,可以指定缓冲区大小,或者可以使用默认大小。默认值足够大,可用于大多数用途。

构造方法:

  • BufferedWriter( Writer out)
  • BufferedReader(Reader in)
public static void main(String[] args) throws IOException {
//	BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\itcast\\bw.txt"));
//	bw.write("Hello\r\n");
//	bw.write("world\r\n");
//	bw.close();
	BufferedReader br = new BufferedReader(new FileReader("D:\\itcast\\bw.txt"));
	int ch;
	while((ch=br.read())!=-1) {
		System.out.print((char)ch);
	}
}

3.7 字符缓冲流特有功能

BufferedWriter:

  • void newLine( ): 写一行行分隔符,行分隔符字符由系统属性定义

BufferedReader:

  • public String readLine( ): 读一行文字。结果包含行的内容的字符串,不包括任何行终止字符,如果流的结尾已经到达,则为null
public static void main(String[] args) throws IOException {
//创建字符缓输出流
	BufferedWriter bw = new BufferedWriter(new FileWriter("D:\\itcast\\bw.txt"));
	
	//写数据
	for(int i=0; i<10; i++) {
		bw.write("Hello "+i);
		bw.newLine();
		bw.flush();
	}
	bw.close();
	}

案例

  1. 复制java文件

    需求:将模块目录下的ConversionStreamDemo.java 复制到模块目录下的 Copy.java

    public static void main(String[] args) throws IOException {
    	//根据数据源创建字符输入流对象
    	InputStreamReader isr=new InputStreamReader(new FileInputStream("D:\\java\\MyDemo\\src\\io\\ConversionStreamDemo.java"));
    	//根据目的地创建字符输出流对象
    	OutputStreamWriter osw=new OutputStreamWriter(new FileOutputStream("Copy.java"));
    	//读写数据,复制文件
    	
    	int ch;
    	while((ch=isr.read())!=-1) {
    		osw.write(ch);
    	}
    	/*
    	char[] ch=new char[1024];
    	int len;
    	while((len=isr.read(ch))!=-1) {
    		osw.write(ch,0,len);
    	}
    	*/
    	isr.close();
    	osw.close();
    	
    }
    
  2. 复制java文件改进版

public static void main(String[] args) throws IOException {
	//根据数据源创建字符输入流对象
	FileReader isr=new FileReader("D:\\java\\MyDemo\\src\\io\\ConversionStreamDemo.java");
	//根据目的地创建字符输出流对象
	FileWriter osw=new  FileWriter("Copy.java");
	//读写数据,复制文件
	/*
	 * int ch; while((ch=isr.read())!=-1) { osw.write(ch); }
	 */
	
	char[] ch=new char[1024];
	int len;
	while((len=isr.read(ch))!=-1) {
		osw.write(ch,0,len);
	}
	
	isr.close();
	osw.close();
	
}
  1. 复制 Java 文件(字符缓冲流改进版)
public static void main(String[] args) throws IOException {
	//根据数据源创建字符输入流对象
	BufferedReader isr=new BufferedReader(new FileReader("D:\\java\\MyDemo\\src\\io\\ConversionStreamDemo.java"));
	//根据目的地创建字符输出流对象
	BufferedWriter osw=new  BufferedWriter(new FileWriter("Copy.java"));
	//读写数据,复制文件
	/*
	 * int ch; while((ch=isr.read())!=-1) { osw.write(ch); }
	 */
	
	char[] ch=new char[1024];
	int len;
	while((len=isr.read(ch))!=-1) {
		osw.write(ch,0,len);
	}
	
	isr.close();
	osw.close();
	
}
  1. 复制 java 文件(字符缓冲流特有功能改进版)
public static void main(String[] args) throws IOException {
	//根据数据源创建字符输入流对象
	BufferedReader br=new BufferedReader(new FileReader("D:\\java\\MyDemo\\src\\io\\ConversionStreamDemo.java"));
	//根据目的地创建字符输出流对象
	BufferedWriter bw=new  BufferedWriter(new FileWriter("Copy.java"));
	//读写数据,复制文件
	
	String line;
	while((line=br.readLine())!=null) {
		bw.write(line);
		bw.newLine();
		bw.flush();
	}
	
	br.close();
	bw.close();
	
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

容与0801

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值