java字符流

开发者经常会使用到读写文件的功能,java中使用流来实现文件的读写。

1、字符输入流

读取一个文件,先使用逐个字符读取的方式,代码如下:

package com.fileReaderDemo.cc;

import java.io.FileReader;
import java.io.IOException;

public class FileReaderDemo {

	public static void main(String[] args) throws IOException {
		//读取字符经常会用到FileReader,构造方法中传入文件的路径
		FileReader fr = new FileReader("E://demo.txt");
		//该变量接收read()方法返回的ASCII码
		int c;
		//使用循环将其逐个打印出来,
		while((c = fr.read())!=-1){
			//这里,需要将c强制转换成char类型
			System.out.print((char)c);
		}
		/*
		 * 关闭流资源,关闭后该对象与内存的关联就取消了,
		 * 如果后面还要用的话,可以使用fr.flush()方法,
		 * 先将数据保存,然后继续使用该对象。
		 */
		fr.close();
	}
}
当然,在字符很多的时候,逐个读取的话,会非常浪费时间,所以我们用到FileReader类的read(char[])方法

public class FileReaderUseArrayDemo {

	public static void main(String[] args) throws IOException {
		FileReader fr = new FileReader("E:\\demo.txt");
		/*
		 * 该数组存储字符,每次存3个
		 * 通常会将数组的长度定义为1024
		 * 此处定义了3个是为了演示一个问题
		 */
		char[] ch = new char[3];
		while(fr.read(ch)!=-1){
			System.out.print(ch);
		}
		fr.close();
	}
}
demo.txt中存了1234567890 一共十个字符,而打印出来的结果是:123456789089,原因是因为数组每次存3个字符,第三次存了{7,8,9},第四次的时候,只把ch[0]修改为0,后面两个字符是没有变的,所以多打印了8和9。所以我们将其修改一下。

package com.fileReaderDemo.cc;

import java.io.FileReader;
import java.io.IOException;

public class FileReaderUseArrayDemo {

	public static void main(String[] args) throws IOException {
		FileReader fr = new FileReader("E:\\demo.txt");
		// 该数组存储字符,每次存3个
		char[] ch = new char[3];
		//该变量存储读取有效位的长度
		int len;
		//每次存储读取到的有效位
		String str = null;
		//fr.read(ch)会返回读取到的有效位的长度
		while((len=fr.read(ch))!=-1){
			//使用str存储有效位,String的构造方法,读取数组指定位置
			str = new String(ch,0,len);
			System.out.print(str);
		}
		fr.close();
	}
}
修改之后,最后一次打印,就只打印了读取到的有效位:0。

2、字符输出流

将字符写入一个文本文件,经常使用FileWriter类,该类与FileReader类对象,一个读一个写。

package com.demo.cc;

import java.io.FileWriter;
import java.io.IOException;
public class FileWriterDemo {
	public static void main(String[] args) throws IOException {
		//新建FileWriter对象,并传入文件地址
		FileWriter fw = new FileWriter("E:\\demo.txt");
		//写入Hello World!
		fw.write("Hello World!");
		//刷新流
		fw.flush();
		//关闭流,每次流关闭的时候也会先刷新流
		fw.close();
	}
}


使用该方法新建的输出流,每次都会将原有的文件覆盖,然后重新写入数据,所以每次运行该程序,demo.txt文件中都只有一个Hello World,如果不想覆盖文件,则需要使用另一个构造方法 FileWriter(String file,Boolean bool)

使用方法如下:

package com.demo.cc;

import java.io.FileWriter;
import java.io.IOException;
public class FileWriterDemo {
	public static void main(String[] args) throws IOException {
		//新建FileWriter对象,并传入文件地址
		FileWriter fw = new FileWriter("E:\\demo.txt",true);
		//写入Hello World!
		fw.write("Hello World!");
		//刷新流
		fw.flush();
 		//关闭流,每次流关闭的时候也会先刷新流
		fw.close();
	}
}


 突然不知道该说什么了,脑子里冒出来一个想法,就是遇到不熟悉的东西,好多人都直接在网上搜索,比如,刚刚我不想让它直接覆盖文件,我上网搜索可能一下就找到了答案,但是除了答案之外,我好想什么都没学到,但是下载一个jdk的API文档,找到FileWriter类的使用,你可能会有意想不到的收获。所以,还是不要贪图快捷的小便宜,能学到更多才是重要的。 

好了,接下来开始复制文本文件,过程就是在目标目录下创建一个文件,将内容完全的复制到该文件中就可以了

package com.demo.cc;

import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

public class FileCopyDemo {

	public static void main(String[] args) throws IOException {
		//新建输出流,指定目录下应该存在该文件,否则会发生异常
		FileReader fr = new FileReader("E:\\demo.txt");
		//新建输入流
		FileWriter fw = new FileWriter("E:\\demoCopy.txt");
		//该变量存储有效位的长度
		int len;
		char[] ch = new char[10];
		//循环读取,直到返回-1
		while((len=fr.read(ch))!=-1){
			//该方法是将数组的有效位写入文件中
			fw.write(ch, 0, len);
		}
		//关闭流资源
		fr.close();
		fw.close();
	}
}






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值