黑马程序员_Java学习日记num10

------- <a href="http://www.itheima.com" target="blank">android培训</a>、<a href="http://www.itheima.com" target="blank">java培训</a>、期待与您交流! ----------

学习内容:在javaIO中,比较重要的是五个类,一个接口。五个类是 Reaer, Writer,InputStream,  OutputStream,File(前四个类是抽象类,最后一个非抽象),接口是  Serializable。其他流对象。

 
一,字符流和字节流
IO流用来处理设备之间的数据传输,java对数据的操作时通过流的方式,java用于操作流的对象都在IO包中。
字符流是基于字节流的,字符流里面融合了字符编码表,所以字符流一般操作纯文本数据,而字节流可以操作所有的数据。字符流的两个基类是Reader,Writer。字节流的两个基类是InputStream和OutputStream。
(一)Writer
FileWriter
1,需求:在硬盘上创建一个文件并且写入数据。
//创建一个FileWriter对象,该对象一被初始化就必须要明确被操作的文件。创建FileWriter对象时,既可以传递File对象或者文件的名字String类型。如果硬盘上存在了文件,将会被覆盖,不存在会自己创建。若不想被覆盖,可以在FileWriter构造方法中传递一个布尔值true
FileWriter fw = new FileWriter("test.txt");
//调用write方法,将字符串写入到流中。
fw.Writer("abcd");
//刷新流对象的缓冲区的数据到目的地中
fw.flush();
//关闭流对象,释放资源  在关闭流资源时,会自动刷新内部的缓冲区的数据,将数据刷到目的地中
fw.close();
 
BufferedWriter
1,需求:使用BufferedWriter在硬盘上写入数据
对于BufferedWriter,可以提高FileWriter的效率,因为加入了缓冲技术。缓冲区要记得刷新
//创建流对象
FileWriter fw = new FileWriter("buf.txt");
//提高字符写入效率,引入了缓冲技术
BufferedWriter bfw = new BufferedWriter(fw);
bufw.write("hello,heima");
bufw.flush();//只要用到缓冲区,都要刷新
//关闭缓冲区
bufw.close();
(二)Reader
//创建一个文件读取流对象和指定名称的文件相关联,要保证该文件是已经存在的,如果不存在,会发生异常
FileReader fr= new FileReader("Test.txt");
//调用读取流对象的read方法。read每次只读一个字符且会自动往下读。另外read方法还有一个重载形式,可以一次读取多个字符,将读到的多个字符存放在字符数组中
int ch = 0;
while((ch=read())!=-1)
  System.out.println((char)ch);
//关闭流资源
fr.close();
 
BufferedReader
字符流缓冲区提供了一次读取一行的方法readLine(),该方法对文本数据的获取,当返回null时,表示读到文件末尾。
//创建一个读取流对象和文件相关联
FileReader fr = new FileReader("bufr.txt");
//为提高效率引入BufferedReader
BufferedReader bufr = new BufferedReader(bufr);
 
//读取操作
String line = null;
while((line = bufr.readLine())!=null)
{
System.out.println(line);
}
//关闭流
bufr.close();
(三)OutputStream
FileOutputStream
需求:通过FileOutputStream向硬盘中写入数据
FileOutputStream fos = new FileOutputStream("fos.txt");
fos.write("abcde".getBytes());
fos.close();
 
(四)InputStream
需求:通过FileInputStream读取一个文件并且打印在控制台上
1,每次读取一个字节
FileInputStream fis = new FileInputStream("fos.txt");
int ch = 0;
while((ch = read())!=-1)
System.out.println((char)ch);
fis.close();
2,每次读取的字节存放入字节数组中
FileInputStream fis = new FileInputStream("fos.txt");
int len = 0;
byte[] buf = new byte[1024];
while((len=fis.read(buf))!=-1)
 System.out.println(new String(buf,0,len));
fis.close();
3,读取一次,将读取到的数据存放入刚刚好的数组中,这种方式一般不建议使用,因为如果数据过大,会造成内存溢出。available()方法,字节流特有的
FileInputStream fis = new FileInputStream();
byte[] buf = new byte[fis.available()];
System.out.println(new String(buf));
fis.close();
 
(五)、转换流 InputStreamReader OutputStreamWriter
转换流是字节流通向字符流的桥梁
需求:将键盘录入的数据通过转换流打印在控制台上,以over结束
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out));
String line = null;
while((line=bufr.readLine())!=null)
{
if("over".equals(line))
break;
bufw.write(line.toUpperCase());
bufw.newLine();
bufw.flush();
}
 
bufr.close();
 
(六)、流操作规律
流操作的基本规律,一般通过三个明确来完成
1,明确源和目的
源:输入流   InputStream  Reader
目的:输出流 OutputStream Writer
2,操作的数据是否是纯文本
是:字符流
否:字节流
3,当体系明确后,在明确要使用那个具体的对象
通过设备来进行区分
源设备:内存,硬盘,键盘
目的设备:内存 硬盘,控制台
 
二,File
(一)File类常见方法:
1,创建。
boolean createNewFile():在指定位置创建文件,如果该文件已经存在,则不创建,返回false。
和输出流不一样,输出流对象一建立创建文件。而且文件已经存在,会覆盖。
 
boolean mkdir():创建文件夹。
boolean mkdirs():创建多级文件夹。
2,删除。
boolean delete():删除失败返回false。如果文件正在被使用,则删除不了返回falsel。
void deleteOnExit();在程序退出时删除指定文件。
 
 
3,判断。
boolean exists() :文件是否存在.
isFile():
isDirectory();
isHidden();
isAbsolute();
 
4,获取信息。
getName():
getPath():
getParent():
 
getAbsolutePath() 
long lastModified() 
long length() 
(二)关于File的一个综合案例
需求:列出指定目录下文件或者文件夹,包含子目录中的内容。
也就是列出指定目录下所有内容。
import java.io.*;
import java.util.*;
class JavaListDemo
{
public static void main(String[] args)
{
File dir = new File("e:\possible");
 
List<File> list = new ArrayList<File>();
 
File f = new File(dir,"javaList.txt");
 
fileToList(dir,list);
 
listToFile(list,f.getAbsolutePath());
}
public static void fileToList(File dir,List<File> list)
{
File[] files = dir.listFiles();
for (File f:files)
{
if(f.isDirectory())
fileToList(f,list);
else
if(f.toString().endsWith(".java"))
list.add(f);
}
}
public static void listToFile(List<File> list,String name)
{
BufferedWriter bfw = null;
try
{
bfw = new BufferedWriter(new FileWriter(name));
for(File f:list)
{
bfw.write(f.getAbsolutePath());
bfw.newLine();
bfw.flush();
}
}
catch (IOException e)
{
e.printStackTrace();
}
finally
{
try
{
if(bfw!=null)
bfw.close();
}
catch (IOException e)
{
e.printStackTrace();
}
}
}
}
 
三、重要的一些流对象
1,Properties
Properties是Hashtable的子类,也就是说它具备map集合的特点而且他里面存储的键值对都是字符串。是集合中的IO技术相结合的结合容器。
里面的重要方法:setProperty();
store();
load();
list();等等
 
2,打印流
printWriter  printStream
该流提供了打印方法,可以将各种数据类型的数据都原样打印。
printStream构造函数可以接收的参数类型  File对象  字符串路径  以及字节输出流
printWriter构造函数可以接收的参数类型  File对象  字符串路径  以及字节输出流 字符输出流
 
3,合并流SequenceInputStream
合并流SequenceInputStream构造函数接收的参数是一个枚举类型。将要合并的流对象存储到枚举中,然后通过SequenceInputStream对象合并到一个流中
 
4,对象的序列化或者持久化 Serializable
对象进行序列化时,会根据成员自定义一个UID,但若类的成员发生改变 那么存储的对象无法使用
若对非静态成员变量不想序列化,前面加上transient关键字即可,使其子啊对内存中存在,而不在文件中存在
注意:静态是不能够序列化的,只能序列化对内存中的
 
5,管道流  PipedInputStream   PipedOutputStream
输入输出可以直接进行连接,通常结合线程使用。不建议对这两个对象使用单线程,因为容易发生死锁。
 
6,RandomAccessFile 这个对象既可以读也可以写
随机访问文件是支持对随机访问文件的读取和写入。
这个类不算是IO体系中的子类,而是直接继承自Object。但是它是IO包中的成员,因为他具备读和写的功能。她内部封装了一个数组,而且通过指针对数组的元素进行操作,可以通过getFilePointer对象获取指针位置,同时可以通过seek改变指针的位置,也可以通过sikpBytes()只能向前跳跃读写
 
7,DataStream
用于操作基本数据类型的对象
 
8,ArrayStream
ByteArrayInputStream :在构造的时候需要接收数据源,而且数据源是一个数组。
ByteArrayOutputStream:在构造的时候,不用定义数据目的,因为该对象中已经内部封装了可变长度的字节数组,这就是数组目的
因为这两个流对象都操作的数组,并没有使用系统资源,所以,不进行close关闭。
原文地址:https://www.cnblogs.com/Rebecca-gg/p/4467468.html