实验4 文件IO.docx
《实验4 文件IO.docx》由会员分享,可在线阅读,更多相关《实验4 文件IO.docx(27页珍藏版)》请在冰豆网上搜索。
实验4文件IO
实验4文件IO
一、实验目的1
二、实验内容1
1、关于File类的预备知识1
1.1File的构造方法2
1.2File的部分实例方法2
2、练习java.io.File类4
3、用java.io.PrintWriter类将数据输出到文本文件。
4
4、用java.util.Scanner从文本文件读入数据。
5
5、关于流和四大根类的预备知识6
6、用Reader/Writer的子类读写文本文件8
6.1Reader,FileReader,Writer,FileWriter的介绍8
6.2用FileWriter和FileReader读写文本文件12
7、用InputStream/OutputStream的子类读写文本文件12
7.1InputStream和OutputStream的子类12
7.2用FileInputStream和FileOutputStream读写二进制文件14
7.3用DataInputStream和DataOutputStream读写二进制文件16
7.4用BufferedInputStream和BufferedOutputStream读写二进制文件18
一、实验目的
1、掌握java语言的文件类FILE,能获取文件属性
2、掌握字符流IO的Reader/Writer及子类
3、掌握字节流IO的InputStream/OutputStream及子类
二、实验内容
1、关于File类的预备知识
一个File对象代表了一个文件。
这个文件可能存在,也可能不存在。
如果存在,那么利用该对象的方法,可以获取对应文件的属性,但不能读写文件。
注意:
目录文件(文件夹)和普通文件都是文件。
一个目录文件的内容是其它文件的属性。
1.1File的构造方法
构造方法摘要
File(File parent,String child)
根据parent抽象路径名和child路径名字符串创建一个新File实例。
例如Filetextfile=newFile(“text”);
Filefile=newFile(textfile,“a.txt”);
File(String pathname)
通过将给定路径名字符串转换成抽象路径名来创建一个新File实例。
例如Filefile=newFile(“text/a.txt”);
File(String parent,String child)
根据parent路径名字符串和child路径名字符串创建一个新File实例。
例如Filefile=newFile(“text”,“a.txt”);
File(URI uri)
通过将给定的file:
URI转换成一个抽象路径名来创建一个新的File实例。
只能是本地文件资源
URIu=newURI("file:
///e:
/javaprog/text/a.txt");
Filefile=newFile(u);
1.2File的部分实例方法
获得文件信息
StringgetName();//获得文件(目录)名
StringgetAbsolutePath() //获得绝对路径
StringgetParent();//获得上级目录名
获得文件属性
booleanexists();//是否存在
booleancanWrite();//是否可写
booleancanRead();//是否可读
booleanisFile();//是否是一个文件
booleanisDirectory();//是否是一个目录
longlastModified();//文件最后修改日期
longlength();//文件长度(字节数长度)
目录操作
–booleancreateNewFile();//创建该文件对象表示的普通文件。
不能创建目录文件。
且文件路径中包含的文件夹必须存在,否则失败。
比如要创建d:
\a\t.txt,如果a不存在,会失败。
–booleanmkdir();//创建当前文件对象表示的目录。
比如创建d:
\a\b,如果a目录不存在,会失败
–booleanmkdirs();//创建当前文件对象表示的目录。
比如创建d:
\a\b,如果a目录不存在,会自动创建
–booleandelete();//删除当前文件对象表示的文件(可以是目录文件)。
如果删除的是文件夹,则该文件夹必须为空。
如果需要删除一个非空的文件夹,则需要首先删除该文件夹内部的每个文件和文件夹,然后在可以删除,这个需要书写一定的逻辑代码实现。
如果当前文件对象是目录文件
String[]list();//求出目录里所有的文件或目录名
File[]listFiles();//求目录里所有的文件对象
2、练习java.io.File类
在D:
盘建立文件夹t,再在t下建立a.txt。
运行下面的程序。
importjava.io.*;
publicclassTestFile{
publicstaticvoidmain(String[]s){
Filefile=newFile("D:
/t/a.txt");//Windows下,字符串也可以是D:
\\t\\a.txt
System.out.println("它存在吗?
"+file.exists());
System.out.println("它能读吗?
"+file.canRead());
System.out.println("它能写吗?
"+file.canWrite());
System.out.println("它是目录文件吗?
"+file.isDirectory());
System.out.println("它是普通文件吗?
"+file.isFile());
System.out.println("它用绝对路径吗?
"+file.isAbsolute());
System.out.println("它的绝对路径是?
"+file.getAbsolutePath());
System.out.println("它的相对路径是?
"+file.getPath());
System.out.println("它的文件名是?
"+file.getName());
System.out.println("它是隐藏的吗?
"+file.isHidden());
System.out.println("它最近的修改时间是?
"+newjava.util.Date(file.lastModified()));
System.out.println("文件名改为b.txt成功了吗?
"+file.renameTo(newFile("b.txt")));
}
}
3、用java.io.PrintWriter类将数据输出到文本文件。
构造方法摘要
PrintWriter(File file)
使用指定文件创建不具有自动行刷新的新PrintWriter。
PrintWriter(File file,String csn)
创建具有指定文件和字符集且不带自动刷行新的新PrintWriter。
PrintWriter(OutputStream out)
根据现有的OutputStream创建不带自动行刷新的新PrintWriter。
PrintWriter(OutputStream out,boolean autoFlush)
通过现有的OutputStream创建新的PrintWriter。
PrintWriter(String fileName)
创建具有指定文件名称且不带自动行刷新的新PrintWriter。
PrintWriter(String fileName,String csn)
创建具有指定文件名称和字符集且不带自动行刷新的新PrintWriter。
PrintWriter(Writer out)
创建不带自动行刷新的新PrintWriter。
PrintWriter(Writer out,boolean autoFlush)
创建新PrintWriter。
(1)首先为文本文件创建一个PrintWriter对象:
PrintWriteroutput=newPrintWriter(“text/a.txt”);
若已经有了文件对象file,也可以以它为参数来构建对象:
Filefile=newFile(“text/a.txt”);
PrintWriteroutput=newPrintWriter(file);
(2)然后,用对象的print、println、printf、write等方法写文件
运行下面的程序,然后查看你的工作目录下的a.txt文件。
importjava.io.*;
publicclassWriteFileWithPrintWriter{
publicstaticvoidmain(String[]arguments)throwsException{
PrintWriteroutput=newPrintWriter("a.txt");//输出到当前目录下的a.txt
output.print("重庆\t");
output.printf("西南大学\t%d\t",82);
output.write("良好");//write()方法可以写字符、字符数组、字符串
output.println();
output.print("成都\t");
output.printf("四川大学\t%d\t",84);
output.write("良好");
output.println();
output.close();
}
}
之所以可能抛出异常,是由于根据字符串,可能无法创建文件。
比如””和“a?
.txt”这样的字符串。
4、用java.util.Scanner从文本文件读入数据。
键盘输入Scannerinput=newScanner(System.in);
文件输入
Filefile=newFile(“text/b.txt”);
Scannerinput=newScanner(file);
然后用input.next()input.nextInt()input.nextLine()等来读入数据
运行下面的程序。
importjava.io.File;
importjava.util.Scanner;
publicclassReadFileWithScanner{
publicstaticvoidmain(String[]s)throwsException{
Filefile=newFile("a.txt");//将当前目录下的a.txt作为输入源
if(!
file.exists()){
System.out.println("文件不存在");
System.exit(0);
}
Scannerinput=newScanner(file);
while(input.hasNext()){
Stringcity=input.next();
Stringuniversity=input.next();
intscore=input.nextInt();
System.out.println(city+","+university+","+score+input.nextLine());
}
input.close();
}
}
5、关于流和四大根类的预备知识
流是对数据以及读写操作的封装。
不限于文件流。
在之前大家接触过System.in和System.out,它们分别是标准输入流和标准输出流。
☐java.io包中的流主要分为
⏹字节流:
以8位字节形式读写(InputStream/OutputStream)
⏹字符流:
以16位字符形式读写(Reader/Writer)。
从输入流中读数据
openastream
whilemoreinformation{
readinformation
}
Closethestream
写到输出流
openastream
whilemoreinformation{
writeinformation
}
closethestream
四大抽象根类:
字符输入流Reader,字符输出流Writer,字节输入流InputStream,字节输出流OutputStream
操作方向
最小操作单位
从文件输入
输出到文件
字符(unicode16位)
读文本文件
根类Reader
写到文本文件
根类Writer
字节(byte8位)
读二进制文件
根类InputStream
写到二进制文件
根类OutputStream
字符流和字节流的区别
InputStream/OutputStream和Reader/Writer都直接继承自Java的根类Object,它们各自形成一个独立的继承体系。
6、用Reader/Writer的子类读写文本文件
6.1Reader,FileReader,Writer,FileWriter的介绍
前面实验内容第3部分已经介绍了用PrintWriter写文本文件,第4部分介绍了用Scanner读文本文件。
其中,PrintWriter是字符输出流Writer的子类,也可以用其它子类(比如FileWriter)来写文本文件。
要读文本文件,也可以用字符输入流Reader的子类(比如FileReader)。
抽象类Reader有下列方法:
Reader是Object的子类,方法摘要如下:
abstract void
close()
关闭该流。
void
mark(int readAheadLimit)
标记流中的当前位置。
boolean
markSupported()
判断此流是否支持mark()操作。
int
read()
读取单个字符。
int
read(char[] cbuf)
将字符读入数组。
abstract int
read(char[] cbuf,int off,int len)
将字符读入数组的某一部分。
int
read(CharBuffer target)
试图将字符读入指定的字符缓冲区。
boolean
ready()
判断是否准备读取此流。
void
reset()
重置该流。
long
skip(long n)
跳过字符。
InputStreamReader是Reader的子类
InputStreamReader的方法摘要
void
close()
关闭该流。
String
getEncoding()
返回此流使用的字符编码的名称。
int
read()
读取单个字符。
int
read(char[] cbuf,int offset,int length)
将字符读入数组中的某一部分。
boolean
ready()
告知是否准备读取此流。
FileReader是InputStreamReader的子类
FileReader类的构造方法摘要
FileReader(File file)
在给定从中读取数据的File的情况下创建一个新FileReader。
FileReader(FileDescriptor fd)
在给定从中读取数据的FileDescriptor的情况下创建一个新FileReader。
FileReader(String fileName)
在给定从中读取数据的文件名的情况下创建一个新FileReader。
抽象类Writer有下列方法:
Writer的方法摘要
Writer
append(char c)
将指定字符追加到此writer。
Writer
append(CharSequence csq)
将指定字符序列追加到此writer。
Writer
append(CharSequence csq,int start,int end)
将指定字符序列的子序列追加到此writer.Appendable。
abstract void
close()
关闭此流,但要先刷新它。
abstract void
flush()
刷新此流。
void
write(char[] cbuf)
写入字符数组。
abstract void
write(char[] cbuf,int off,int len)
写入字符数组的某一部分。
void
write(int c)
写入单个字符。
void
write(String str)
写入字符串。
void
write(String str,int off,int len)
写入字符串的某一部分。
OutputStreamWriter是Writer的子类
OutputStreamWriter的方法摘要
void
close()
关闭该流。
void
flush()
刷新该流的缓冲。
String
getEncoding()
返回此流使用的字符编码的名称。
void
write(char[] cbuf,int off,int len)
写入字符数组的某一部分。
void
write(int c)
写入单个字符。
void
write(String str,int off,int len)
写入字符串的某一部分。
FileWriter是OutputStreamWriter的子类
FileWriter的构造方法摘要
FileWriter(File file)
在给出File对象的情况下构造一个FileWriter对象。
FileWriter(File file,boolean append)
在给出File对象的情况下构造一个FileWriter对象。
FileWriter(FileDescriptor fd)
构造与某个文件描述符相关联的FileWriter对象。
FileWriter(String fileName)
在给出文件名的情况下构造一个FileWriter对象。
FileWriter(String fileName,boolean append)
在给出文件名的情况下构造FileWriter对象,它具有指示是否挂起写入数据的boolean值。
6.2用FileWriter和FileReader读写文本文件
importjava.io.*;
publicclassTestFileWriterAndFileReader{
publicstaticvoidmain(String[]arguments)throwsException{
char[]s={'c','h','i','n','a'};
FileWriterfw=newFileWriter("a.txt");
fw.write(s);//写字符数组到文件
fw.write("-goodmorning.");//写字符串到文件
fw.close();
char[]s2=newchar[100];
FileReaderfr=newFileReader("a.txt");
fr.read(s2);//读文件数据到字符数组
System.out.println(s2);//将字符数组的内容用标准输出流输出
}
}
7、用InputStream/OutputStream的子类读写文本文件
7.1InputStream和OutputStream的子类
抽象类InputStream的方法
方法摘要
int
available()
返回此输入流方法的下一个调用方可以不受阻塞地从此输入流读取(或跳过)的字节数。
void
close()
关闭此输入流并释放与该流关联的所有系统资源。
void
mark(int readlimit)
在此输入流中标记当前的位置。
boolean
markSupported()
测试此输入流是否支持mark和reset方法。
abstract int
read()
从输入流读取下一个数据字节。
int
read(byte[] b)
从输入流中读取一定数量的字节并将其存储在缓冲区数组b中。
int
read(byte[] b,int off,int len)
将输入流中最多len个数据字节读入字节数组。
void
reset()
将此流重新定位到对此输入流最后调用mark方法时的位置。
long
skip(long n)
跳过和放弃此输入流中的n个数据字节。
抽象类OutputStream的方法