------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------
-IO流的有关类
字节流:InputStream, OutputStream
FileInputStream, FileOutputStream // BufferedInputStream, BufferedOutputStream
PrintWriter类:向文本输出流打印对象的格式化表示形式。此类实现在
PrintStream
中的所有print 方法。它不包含用于写入原始字 节的方法,对于这些字节,程序应该使用未编码的字节流进行写入。
字符流:Reader, Writer
FileReader, FileWriter // BufferedReader, BufferedWriter
转换流:InputStreamReader, OutputStreamWriter
-学习FileWriter
package day18_IO;
import java.io.FileWriter;
import java.io.IOException;
/**
* 学习FileWriter,注意异常产生的原因和正确关闭资源的书写方法
* @author Administrator
*/
public class Day18_08_IOException {
public static void main(String[] args) {
//在 代码块 外部建立用,代码块内部实例化创建
FileWriter fw = null;
try {
fw = new FileWriter("demo.txt");
fw.write("aaaaa");
} catch (IOException e) {
//e.printStackTrace();
System.out.println("catch: "+e.toString());
} finally {
if(fw!=null)
try {
fw.close();
} catch (IOException e) {
//e.printStackTrace();
System.out.println("catch: "+e.toString());
throw new RuntimeException("写入资源关闭失败");
}
}
}
}
FileWriter的常用方法:fw.writer(); fw.flush(); fw.close();
注意点:1、一创建FileWriter对象就要指定要操作的源(默认覆盖已存在同名的文件)
2、为什么要flush方法,与close方法有什么区别。
3、文件的续写(不覆盖) FileWriter fw = new FileWriter("文件名",true);,换行\r\n
4、换行:Windows系统下(\r\n);Linux系统下(\n)
-学习FileReader
文件读取方式一:
FileReader fr = new FileReader("demo.txt");
int ch = 0;
//read()方法一次读一个字符,而且会自动往下读
while((ch= fr.read())!=-1){
System.out.print((char)ch);//强转为字符型输出
}
文件读取方式二:
FileReader fr = new FileReader("demo.txt");
//定义一个字符数组
char[] cbuf = new char[1024];
int count = 0;
while((count=fr.read(cbuf))!=-1){
System.out.println(new String(cbuf,0,count));
}
-有关FileWriter 和 FileReader 操作的练习
package day18_IO;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
/**
* 通过copy练习,熟悉IO流中FileWriter与FileReader类的写法操作
* @author Administrator
*/
public class Day18_13_CopyPractice2 {
static FileWriter fw = null;
static FileReader fr = null;
public static void main(String[] args) {
//copy_1();
copy_2();
}
//读一个字符,复制一个字符
public static void copy_1(){
try {
fw = new FileWriter("copydemo.txt");
fr = new FileReader("demo.txt");
int ch = 0;
while((ch=fr.read())!=-1){
fw.write(ch);
}
System.out.println("复制成功");
} catch (Exception e) {
e.printStackTrace();
System.out.println("复制失败");
} finally {
colseResource();
}
}
//通过字符数组进行复制
public static void copy_2(){
try {
fw = new FileWriter("copydemo2.txt");
fr = new FileReader("demo.txt");
char[] buf = new char[1024];
int len = 0;
while((len=fr.read(buf))!=-1){
fw.write(buf,0,len);
}
System.out.println("复制成功");
} catch (IOException e) {
System.out.println("复制失败");
e.printStackTrace();
} finally {
colseResource();
}
}
//释放资源
private static void colseResource() {
if(fr!=null){
try {
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(fw!=null){
try {
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
特有方法:newLine(); readLine();
注意:1、readLine()方法返回类型为字符串String类型,read()方法返回的是整数类型。
2、readLine()方法的返回值并不包含末尾的换行符。
-通过缓冲区技术实现对文本文件的复制
package day19_IO;
import java.io.*;
/**
* 通过缓冲区技术实现对文本文件的复制
*
* @author Administrator
*
*/
public class Day19_03_CopyByBuffered {
public static void main(String[] args) {
BufferedWriter bw = null;
BufferedReader br = null;
try {
bw = new BufferedWriter(new FileWriter("bufferedCopy.txt"));
br = new BufferedReader(new FileReader("demo.txt"));
String line = null;
while((line=br.readLine())!=null){
bw.write(line);
bw.newLine();
//bw.flush();
}
System.out.println("文件复制成功....");
} catch (IOException e) {
e.printStackTrace();
} finally {
//释放资源
try {
if(br!=null)
br.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
if(bw!=null)
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
-自定义MyBufferedReader类
package day19_IO;
import java.io.FileReader;
import java.io.IOException;
/**
* 通过理解BuffereReader类中的方法readLine(),学习自己创建一个MyBufferedReader
* @author Administrator
*
*/
public class Day19_05_MyBufferedReader {
private FileReader fr;
public void MyBufferedReader(FileReader fr){
this.fr = fr;
}
public String myBufferedReader() throws IOException{
//定义一个临时容器,源BufferedReader封装的是字符数组
//因为最终还是要将数据转换为字符串,我们这里就定义一个StringBuilder容器
StringBuilder sb = new StringBuilder();
int ch = 0;
while((ch=fr.read())!=-1){
if(ch=='\r')
continue;
if(ch=='\n')
return sb.toString();
else
sb.append((char)ch);//先强转为字符型
}
//防止末尾没有换行符,这里我们需要再做一个判断
if(sb.length()!=0)
return sb.toString();
return null;
}
//为MyBufferedReader 同样添加一个关闭资源的方法
public void myClose() throws IOException{
fr.close();
}
}
-LineNumberReader类
跟踪行号的缓冲字符输入流。此类定义了方法
setLineNumber(int)
和getLineNumber()
,它们可分别用于设置和获取当前行号。默认情况下,行编号从 0 开始。该行号随数据读取在每个行结束符处递增,并且可以通过调用
setLineNumber(int)
更改行号。但要注意的是,setLineNumber(int)
不会实际更改流中的当前位置;它只更改将由getLineNumber() 返回的值。可认为行在遇到以下符号之一时结束:换行符('\n')、回车符('\r')、回车后紧跟换行符。
package day19_IO;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.io.LineNumberReader;
/**
* 学习LineNumberReader类
* 练习:模拟创建一个带行号的缓冲区对象。
* @author Administrator
*
*/
public class Day19_09_LineNumberReader {
public static void main(String[] args) {
FileReader fr = null;
LineNumberReader lnr = null;
try {
fr = new FileReader("demo.txt");
lnr = new LineNumberReader(fr);
String line = null;
//可以自己设定开始行号
//lnr.setLineNumber(100);
while((line=lnr.readLine())!=null){
System.out.println(lnr.getLineNumber()+": "+line);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}