引入
I:Input
O:Output
IO又分流IO和块IO
Java.io是大多数面向数据流的输入/输出类的主要软件包,此外,Java也对块传输提供支持,在核心库 java.nio中采用的便是块IO
流IO的好处是简单易用,缺点是效率较低。块IO效率很高,但编程比较复杂
java.oi包提供大量的流类,所有输入流都是抽象类InputStream或抽象类Reader的子类,所有输出流都是抽象类OutputStream或抽象类Writer的子类
File类
File类的对象主要用来获取文件信息,不涉及读写操作
我们在这里建立一个文本文档,之后便可用File类进行一些操作
public class FileTest {
public static void main(String[] args) {
File f = new File("D:\\javaTest","Alspase.txt");
System.out.println(f.getName()+"could be read? "+f.canRead());
System.out.println("how to get it? "+f.getAbsolutePath());
System.out.println("文档字节长度为"+f.length());
System.out.println("创建新文档");//此时还未创建文档
File file = new File("Rykony.txt");
if (!file.exists()){
try{
file.createNewFile();
System.out.println("Succeed!");
}
catch(IOException exp){
System.out.println("Sorry");
}
}
}
}
/*
输出:
Alspase.txtcould be read? true
how to get it? D:\javaTest\Alspase.txt
文档字节长度为18
创建新文档
Succeed!
*/
//上面输出是在未创建文档时的输出,若已创建会是下面的输出
/*
输出:
Alspase.txtcould be read? true
how to get it? D:\javaTest\Alspase.txt
文档字节长度为18
创建新文档
*/
//此时创建文档是创建在项目目录中
文件字节输入输出流
FileInpuStream输入流打开一个到达文件的通道,创建输入流时可能会出现异常,比如指向文件不存在,这个异常可以用IOException对象表示这个出错信号
输入流的目的是提供读取源中数据的通道,只要不关闭流,每次调用read方法时就会顺序读取文件的其余内容,直至文件末尾或输入流关闭,所以请养成用完输入流就关流的习惯,关闭方法为close()
FileOutpuStream输出流开通一个到达文件的通道,如果指向文件不存在,java就会创建该文件,如果文件存在,输出流会刷新该文件
输入流会出异常,输出流也一样,比如当输出流试图读写的文件是不允许操作的或有其他受限原因就会抛出异常
如果你不想重新刷新文件你可以选择是否具有刷新功能的构造方法指向文件的输出流(具体看后面的代码
输出流的目的是提供通向目的地的通道,程序可以通过这个通道将数据写入目的地,只要不关闭流,每次调用write方法就会顺序的向文件写入内容,直至流被关闭,所以就像输出流一样,请记得用close()方法随开随关输出流
public class FileTest {
public static void main(String[] args) {
File file = new File("D:\\javaTest","Alspase.txt");
byte [] a="Have a nice day!".getBytes();
try{
OutputStream out = new FileOutputStream(file,true);//使append值为true可使原文档不被刷新
out.write(a,0,a.length);
out.close();
}
catch(IOException e){
System.out.println("Error "+e);
}
byte [] b = new byte[100];
int n=-1;
try{
InputStream in = new FileInputStream(file);
while ((n=in.read(b,0,100))!=-1){
String s = new String (b,0,n);
System.out.println(s);
}
in.close();
}
catch(IOException e){
System.out.println("Error "+e);
}
}
}
/*
输出:
Could you read me?Have a nice day!
*/
而之前的文档内容也成功的被更改
文件字符输入输出流
文件字节输入输出流的read方法和write方法以字节为单位处理数据,当处理汉字(一个字两个字节)时读取不当易出现乱码
相比之下,文件字符输入输出流用字符数组读写数据,即用字符为基本单位处理数据
缓冲流
BufferedReader和BufferedWriter类创建的对象叫做缓冲输入输出流,增强了读写文件的能力,二者的源和目的地必须为字符输入输出流
BufferedReader流能读取文本行,方法为readLine()
另外BufferedReader流有一个独特的向文章写入回行符的方法newLine()
此时的Alspase文件内容
public class FileTest {
public static void main(String[] args) {
File file = new File("D:\\javaTest","Alspase.txt");
File writeFile = new File("Rykony.txt");
try{
Writer out = new FileWriter(writeFile);
BufferedWriter bufferWrite = new BufferedWriter(out);
Reader in = new FileReader(file);
BufferedReader bufferRead = new BufferedReader(in);
String str = null;
while ((str = bufferRead.readLine())!=null){
StringTokenizer cnt = new StringTokenizer(str);
int count = cnt.countTokens();
str = str+"句子中单词数:"+count;
bufferWrite.write(str);
bufferWrite.newLine();
}
bufferWrite.close();
out.close();
in = new FileReader(writeFile);
bufferRead = new BufferedReader(in);
String s = null;
System.out.println(writeFile.getName()+"内容:");
while ((s = bufferRead.readLine())!=null){
System.out.println(s);
}
bufferRead.close();
in.close();
}
catch (IOException e){
System.out.println("Error "+e);
}
}
}
/*
输出:
Rykony.txt内容:
They say句子中单词数:2
Everybody knows everybody knows where we're going句子中单词数:7
Yeah we're going down句子中单词数:4
They say句子中单词数:2
Everybody knows everybody knows where we're going句子中单词数:7
Yeah we're going down句子中单词数:4
Yeah we're going down句子中单词数:4
Yeah we're going down句子中单词数:4
All the right moves hey句子中单词数:5
Yeah we're going down句子中单词数:4
All the right moves hey句子中单词数:5
Yeah we're going down句子中单词数:4
*/
此时Rykony文件内容
(关流时候一定注意你关的是输入流还是输出流,不然就会像我找了十几分钟才找到是哪出的问题
随机流
RandomAccessFile类创建的流称作随机流,这个类的指向既可以作为流的源,也可以作为流的目的地
数据流
DataInputStream和DataOutputStream类创建的对象称为数据输入流和数据输出流,他们允许程序按照与机器无关的风格读取Java原始数据,不用关心数据的字节数
参考文章
JAVA2实用教程_5th 第10章
课后总结
在博客里已经敲过的一些代码的基础上又根据上课学长所讲的内容敲了一些之前没做的内容,比如用转换流去改变编码方式,成功看到了一堆乱码,在敲代码解决问题的同时也提升了自己
感谢观看