文件的读写操作详解
文章目录
1.先谈谈I/O流类
在Java中将信息的输入与输出过程抽象为I/O流。(一个流就是一个源
流向目的地
的数据序列
)
- 输入是指数据流入程序,即写入(writer)
- 输出是指数据从程序流出,即读出(reader)
IO流一旦被创建就会自动打开;
调用close方法,可以显式关闭任何一个流,如果流对象不再被引用,Java的垃圾回收机制也会隐式地关闭它。
但最好记得关闭,不然可能系统还没有完成所有数据的写操作,程序就已经结束了。
输入输出流可以分为3类:
1.输入流或输出流(从流的方向出发)
2.节点流或处理流(从流的分工划分。节点流
:用来从数据源读入数据或往目的地写入数据;处理流
:对数据执行某种处理)
3.面向字符的流或面向字节的流(从流的内容划分)。
1.1 面向字符的流–Reader和Writer类
字符流的源或目标通常是
文本文件
。
字符流可以实现
内部格式
和文本文件中的外部格式
之间转换。内部格式:16-bit char 数据类型
外部格式:1.UTF
2.包括ASCLL码和非ASCLL码字符,比如希腊字符等
3
.GBK每个汉字2个字节,UTF-8每个汉字3个字节
,加入在接 收一个中文字符时,只接收了中文字符的一个字节就开始输出,那么中 文字符就会失帧,所以就会乱码
。
1.2面向字节的流–InputStream和OutputStream类
数据源或目标中含有非字符数据,必须用字节流输入/输出,通常用来读写诸如图片、声音之类的
二进制数据
。
1.3 三个标准输入输出流
- System.in : InputStream类型,默认对应键盘输入;
- System.out : PrintStream类型(OutputStram的子类),默认状态对应屏幕输出;
- System.err : PrintStram类型,代表标准错误信息输出流,默认对应屏幕输出;
1.4I/O异常
多数I/O方法在遇到错误时会
抛出异常
,因此调用这些方法时必须在函数头声明抛出IOException异常
,或者在try块中
执行,然后捕获IOException.
1.5【举例–从键盘读入信息并在显示器上显示】
package course3;
import java.io.*;
public class Echo {
public static void main(String[] args) throws IOException{
BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
String s;
//s=in.readLine读取一行内容
while((s=in.readLine()).length()!=0) {
System.out.println(s);
}
}
}
解析:
这里使用的
System.in
是在程序启动时由Java系统自动创建的流对象,由于它是原始的字节流
,因而不能直接从中读取字符,需要对其做进一步的处理。本例中以
System.in作为参数,进一步创建了一个
InputstreamReader流对象
,Inputstreamreader相当于字节流和字符流之间的一座桥梁,它读取字节将其转換为字符.Bufferedreader用于对inputstreamreader处理后的信息进行缓冲
,以提高效率。
2.写文本文件
在磁盘上创建一个文本文件并往其中写入字符数据,需要用到FileWriter类
,它是OutputStreamWriter类的子类,而OutputStreamWriter类又是Writer类的子类,即它属于字符流
。
1.在给出 File 对象的情况下构造一个 FileWriter 对象。
FileWriter(File file, boolean append)
2.在给出文件名的情况下构造 FileWriter 对象,它具有指示是否追加写入数据的 boolean 值。
FileWriter(String fileName, boolean append)
3.写入单个字符c。
public void write(int c) throws IOException
4.写入字符数组中开始为offset、长度为len的某一部分。
public void write(char [] c, int offset, int len)
5.写入字符串中开始为offset长度为len的某一部分。
public void write(String s, int offset, int len)
2.1【举例–在C盘根目录创建文本文件Hello.txt,并往里写入若干行文本】
import java.io.*;
class FileWriterTester {
public static void main ( String[] args ) {
String fileName = "c:\\Hello.txt" ;
try { //将所有IO操作放入try块中
FileWriter writer = new FileWriter( fileName ,true );
writer.write( "Hello!\n");
writer.write( "This is my blog,\n" );
writer.write( "You can see how this is done. \n" );
writer.write("先点赞,后观看,养成好习惯!\n");
writer.close();
}
catch ( IOException iox) {
System.out.println("Problem writing" + fileName ); }
}
}
详细解释:
1.运行此程序,会发现在原文件内容后面又追加了
重复的内容
,这就是将构造方法的第二个参数设为true的效果2.如果将文件属性改为只读属性,再运行本程序,就会出现IO错误,程序将转入catch块中,给出出错信息
3.在给出文件名的情况下构造 FileWriter 对象,它具有指示是否追加写入数据的 boolean 值。
FileWriter(String fileName, boolean append)
4.文本很少时用FileWriter就行了,文本多时使用更高效的BufferedWriter类,两者包含的方法几乎一致,只是BufferedWriter多提供了一个行分隔符方法:
void newLine()
3.读文本文件
从一个文本文件读取字符数据需要用到FileReader类
,他继承自Reader抽象类的子类InputStresmReader。
1.在给定从中读取数据的 File 的情况下创建一个FileReader。
FileReader(File file)
2.在给定从中读取数据的 FileDescriptor 的情况下创建一个新FileReader。
FileReader(FileDescriptor fd)
3.给定从中读取数据的文件名的情况下创建一个新FileReader。
FileReader(String fileName)
4.读取单个字符,返回一个int型变量代表读取到的字符.
public int read() throws IOException
5.读取字符到c数组,返回读取到字符的个数
public int read(char [] c, int offset, int len)
文件输入方法:
BufferedReader in = new BufferedReader(new FileReader( fileName) );
3.1 【举例–从创建的文本文件Hello.txt中读取文本并显示在屏幕上】
import java.io.*;
class BufferedReaderTester {
public static void main ( String[] args ) {
String fileName = "C:/Hello.txt" , line;
try {
BufferedReader in = new BufferedReader(
new FileReader( fileName ) );
line = in.readLine(); //读取一行内容
while ( line != null ) {
System.out.println( line );
line = in.readLine();
}
in.close();
}
catch ( IOException iox ) {
System.out.println("Problem reading " + fileName );
}
}
}
详细解释:
•FileReader对象:创建后将打开文件,如果文件不存在,会抛出一个IOException
•BufferedReader类的readLine()方法:从一个面向字符的输入流中读取一行文本。如果其中不再有数据,
返回null
•Reader类的
read()
方法:也可用来判别文件结束
。该方法返回的一个表示某个字符的int型整数,如果读到文件末尾,返回 -1。据此,可修改本例中的读文件部分:int c;
while((c=in.read())!= -1)
System.out.print((char)c);
4.巩固练习
在C盘根目录创建文本文件Hello.txt,并往里写入若干行文本。从Hello.txt中读取文本并显示在屏幕上。
import java.io.*;
public class Outtxt {
public static void main(String[] args) throws IOException{
String filename="C:/Hello.txt";
try { //将所有IO操作放入try块中
BufferedWriter writer = new BufferedWriter( new FileWriter(filename));
writer.write( "Hello!");
writer.newLine();
writer.write( "This is my blog," );
writer.newLine();
writer.write( "You can see how this is done." );
writer.newLine();
writer.write("先点赞,后观看,养成好习惯!");
writer.close();
}
catch ( IOException iox) {
System.out.println("Problem writing" + filename );
}
try{
BufferedReader br = new BufferedReader(new FileReader(filename));//构造一个BufferedReader类来读取文件
String s = null;
while((s = br.readLine())!=null){//使用readLine方法,一次读一行
System.out.println(s);
}
br.close();
}catch(IOException iox){
System.out.println("Problem reading"+filename);
}
}
}