国内最全IT社区平台 联系我们 | 收藏本站
华晨云阿里云优惠2
您当前位置:首页 > php开源 > php教程 > #java读书笔记#IO流2

#java读书笔记#IO流2

来源:程序员人生   发布时间:2016-06-08 13:03:04 阅读次数:2048次
5、字符流经常使用基类的子类
写入流:
(1)FileWriter:
构造方法:
FileWriter(String fileName) 
根据给定的文件名构造1个 FileWriter 对象。 
FileWriter(String fileName, boolean append) 
根据给定的文件名和唆使是不是附加写入数据的 boolean 值来构造 FileWriter 对象。 
FileWriter(File file) 
根据给定的 File 对象构造1个 FileWriter 对象。 
FileWriter(File file, boolean append) 
根据给定的 File 对象构造1个 FileWriter 对象。 
FileWriter(FileDescriptor fd) 

构造与某个文件描写符相干联的 FileWriter 对象。


方法摘要:跟Writer1样abstract  void close() 关闭此流,但要先刷新它。abstract  void flush() 刷新该流的缓冲。void write(int c) 写入单个字符。void write(char[] cbuf) 写入字符数组。          abstract  void write(char[] cbuf, int off, int len) 写入字符数组的某1部份。 void write(String str) 写入字符串。 

void write(String str, int off, int len) 写入字符串的某1部份。 


(2)BufferedWriter:

构造方法:BufferedWriter(Writer out) 创建1个使用默许大小输出缓冲区的缓冲字符输出流。 BufferedWriter(Writer out, int sz) 

创建1个使用给定大小输出缓冲区的新缓冲字符输出流。 


方法摘要:void close() 关闭此流,但要先刷新它。 void flush() 刷新该流的缓冲。 void newLine() 写入1个行分隔符。 void write(char[] cbuf, int off, int len) 写入字符数组的某1部份。 void write(int c) 写入单个字符。 void write(String s, int off, int len) 

写入字符串的某1部份。 


(3)OutputStreamWriter:字节通向字符的转换流

构造方法:

OutputStreamWriter(OutputStream out) 创建使用默许字符编码的 OutputStreamWriter。

方法摘要:

void write(char[] cbuf, int off, int len) 写入字符数组的某1部份。 

void write(int c) 写入单个字符。

 void write(String str, int off, int len) 

写入字符串的某1部份。


(4)PrintWriter:

构造方法:

PrintWriter(String fileName) 创建具有指定文件名称且不带自动行刷新的新 PrintWriter。

PrintWriter(File file) 使用指定文件创建不具有自动行刷新的新 PrintWriter。

PrintWriter(Writer out) 创建不带自动行刷新的新 PrintWriter。 

PrintWriter(Writer out, boolean autoFlush) 创建新 PrintWriter。 

PrintWriter(OutputStream out) 根据现有的 OutputStream 创建不带自动行刷新PrintWriter。

 PrintWriter(OutputStream out, boolean autoFlush) 通过现有的 OutputStream 创建新的 PrintWriter。


方法摘要:

PrintWriter append(char c) 将指定字符添加到此 writer。 

void print(各种类型的数据:) 打印各种类型的数据 

void println(各种类型的数据:):自动换行打印各种类型的数据

void write(char[] buf) 写入字符数组。

 void write(char[] buf, int off, int len) 写入字符数组的某1部份。 

void write(int c) 写入单个字符。 void write(String s) 写入字符串。 

void write(String s, int off, int len) 写入字符串的某1部份。 


读取流:

(1)FileReader:

构造方法:

FileReader(String fileName) 在给定从中读取数据的文件名的情况下创建1个新 FileReader。

FileReader(File file) 在给定从中读取数据的 File 的情况下创建1个新 FileReader。 

FileReader(FileDescriptor fd) 在给定从中读取数据的 FileDescriptor 的情况下创建1个新 FileReader。

 

方法摘要:

和Reader基类方法1致:

abstract  void close() 关闭该流并释放与之关联的所有资源。

int read() 读取单个字符。

int read(char[] cbuf)  将字符读入数组

abstract  int read(char[] cbuf, int off, int len) 将字符读入数组的某1部份。

long skip(long n)  跳过字符。

 

(2)BufferedReader:

构造方法:

BufferedReader(Reader in) 创建1个使用默许大小输入缓冲区的缓冲字符输入流。


方法摘要:

int read() 读取单个字符。 

int read(char[] cbuf, int off, int len) 将字符读入数组的某1部份。 

String readLine() 读取1个文本行。

 

(3)InputStreamReader:字符通向字节的桥梁:

构造方法:

InputStreamReader(InputStream in) 创建1个使用默许字符集的 InputStreamReader。


方法摘要:

int read() 读取单个字符。

int read(char[] cbuf)  将字符读入数组

abstract  int read(char[] cbuf, int off, int len) 将字符读入数组的某1部份。

long skip(long n)  跳过字符。


(4)LineNumberReader:

构造方法:

LineNumberReader(Reader in) 使用默许输入缓冲区的大小创建新的行编号 reader。


方法摘要:

int read() 读取单个字符。 

int read(char[] cbuf, int off, int len) 将字符读入数组中的某1部份。 

String readLine() 读取文本行。

long skip(long n) 跳过字符。 

int getLineNumber() 取得当前行号。 

void setLineNumber(int lineNumber) 设置当前行号。 

6、IO流常见需求:
字符流:
(1)需求1:在硬盘上创建1个文件并写入信息
用字符写入流:FileWriter
FileWriter fw = new FileWriter("g:\\filewriter.txt");
fw.write("输入信息");
fw.write("也能够写入字符数组".toCharArray());
fw.flush();

fw.close();

(2)需求2:在原有文件上续写数据
FileWriter fw = new FileWriter("g:\\filewriter.txt",true);
fw.write("还可以续写信息");
fw.write("也能够写入字符数组".toCharArray());
fw.flush();

fw.close();


(3)需求3:读取硬盘上的文本文件,并将数据打印在控制台
FileReader fr = new FileReader("g:\\filewriter.txt");
**第1种读取方法:1个1个字节的读
int ch = 0;
ch = fr.read();
sop((char)ch);
fr.close();
**第2种读取方法:利用数组来提高效力
char[] buf = new char[1024];
int len = 0;
while((len = fr.read(buf))!=⑴)
{
sop(new String(buf,0,len));
}

fr.close();


(4)需求4:拷贝文本文件
利用缓冲区提高数据读写效力
(无缓冲区就相当于1滴1滴的喝水,有缓冲区就相当于1杯1杯的喝水)
BufferedReader bufr = new BufferedReader(new FileReader("g:\\filewriter.txt"));
BufferedWriter bufw = new BufferedWriter(new FileWriter("d:\\copyfilewriter.txt"));
String line = null;
while((line = bufr.readLine())!=null)
{
burw.write(line);
bufw.newLine();
bufw.flush();
}
bufr.close();

bufw.close();


字节流:字节流写入时没有刷新
(1)需求1:在硬盘上创建1个文件并写入信息(字节流写入时没有刷新)
FileOutputStream fos = new FileOutputStream("g:\\filestream.txt");
fos.write(97);//写入1个字节,int:97代表写入char:a
fos.write("也能够写入字节数组".getBytes());//通常使用此种方式写入,直观!
fos.close();

(2)需求2:在硬盘已有文件上续写数据(字节流写入时没有刷新)

FileOutputStream fos = new FileOutputStream("g:\\filestream.txt",true);
fos.write("创建字节写入流时,传进去1个true参数就能够继续写入信息".getBytes());

fos.close();


(3)需求3:读取硬盘上的文件
FileInputStream fis = new FileInputStream("g:\\filestream.txt");
**第1种读法:1个字节1个字节的读(此种读法慢)
int ch = 0;
while((ch = fis.read())!=⑴)
{
sop((char)ch);
}
**第1种读法:利用字节数组读(此种读法效力有1定提高)
byte[] buf = new byte[1024];
int len = 0;
while((len = fis.read())!=⑴)
{
sop(new String(buf,0,len));

}


(4)需求4:拷贝字节文件,如图片或MP3或电影
第1种拷贝:不带缓冲区(慢,还是效力问题)
FileInputStream fis = new FileInputStream("g:\\1.mp3");
FileOutputStream fos = new FileOutputStream("g:\\copy1.mp3");
byte[] buf = new byte[1024];
int len = 0;
while((len = fis.read(buf))!=⑴)
{
fos.(buf,0,len);//字节流写入无需刷新
}
fis.close();

fos.close();


第2种拷贝:带缓冲区,高效
BufferedInputStream bufi = new BufferedInputStream(new FileInputStream("g:\\1.mp3"));
BufferedOutputStream bufo = new BufferedOutputStream(new FileOutputStream("g:\\copy1.mp3"));
int ch = 0;
while((ch = bufi.read())!=⑴)
{
bufo.write(ch);
}
bufi.close();

bufo.close();


转换流:
(1)需求1:读取1个键盘录入
InputStream in = System.in;//创建1个键盘录入流,流不关则可以1直录入
int by1 = in.read();//1次读1个字节
int by2 = in.read();//1次读1个字节
sop(by1);//假定键盘录入的是abcd,则打印a
sop(by2);//假定键盘录入的是abcd,则打印b

in.close();


(2)需求2:键盘录入1行数据打印1行数据,如果录入的是over则结束录入
InputStream in = System.in;
StringBuilder sb = new StringBuilder();
while(true)
{
int ch = in.read();
if(ch=='\r')
continue;
if(ch=='\n')
{
String line = sb.toString();
if("over".equals(line))
break;
sop(line.toUpperCase());//输出大写
sb.delete(0.sb.length());//清除上1行录入的数据

}
else
sb.append((char)ch);

}

in.close();


(3)需求3:发现需求2中其实就是读1行的原理,故引入字节通向字符的桥梁:InputStreamReader
为提高效力加入缓冲区:
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
String line = null;
while((line = bufr.readLine())!=null)
{
if("over".equals(line))
break;
sop(line.toUpperCase());//输出大写
}

bufr.close();


(4)需求4:键盘录入数据并打印到控制台
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bufw = new BufferedWriter(new OntputStreamWriter(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();

bufw.close();


(5)需求5:将键盘录入的数据存储到硬盘文件
则只需将(4)中的
BufferedWriter bufw = new BufferedWriter(new OntputStreamWriter(System.out));
改成:
BufferedWriter bufw = new BufferedWriter(new OntputStreamWriter(new FileWriter("g:\\demo.txt")));
即:
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bufw = new BufferedWriter(new OntputStreamWriter(new FileWriter("g:\\demo.txt")));
String line = null;
while((line = bufr.readLine())!=null)
{
if("over".equals(line))
break;
bufw.write(line.toUpperCase());
bufw.newLine();
bufw.flush();
}
bufr.close();

bufw.close();


(6)需求6:将硬盘文件的数据打印到控制台
则只需将(4)中的
BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in));
改成:
BufferedReader bufr = new BufferedReader(new InputStreamReader(new FileReader("g:\\demo.txt")));
即:
BufferedReader bufr = new BufferedReader(new InputStreamReader(new FileReader("g:\\demo.txt")));
BufferedWriter bufw = new BufferedWriter(new OntputStreamWriter(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();

bufw.close();


7、流操作的规律:
流操作的难点:流对象很多,不知道具体用哪一个
规律:
(1)第1步:先明确源和目的
源:
文本:用Reader
字节:用InputStream
目的:
文本:用Writer
字节:用OutputStream
(2)第2步:明确是否是纯文本
是:用字符流;
不是:用字节流
(3)第3步:明确流体系后,通过装备来明确具体使用哪一个流对象
源装备:
键盘:System.in
硬盘:文件流File
内存:数组流ArrayStream
目的装备:
键盘:System.out
硬盘:文件流File

内存:数组流ArrayStream


8、File类
构造方法:
File(String pathname) 
通过将给定路径名字符串转换为抽象路径名来创建1个新 File 实例。 
File(String parent, String child) 
根据 parent 路径名字符串和 child 路径名字符串创建1个新 File 实例。
File(File parent, String child) 
根据 parent 抽象路径名和 child 路径名字符串创建1个新 File 实例。
方法摘要:
(1)创建:
boolean createNewFile() 
当且仅当不存在具有此抽象路径名指定名称的文件时,不可分地创建1个新的空文件。 
boolean mkdir() 
创建1级文件夹
boolean mkdirs() 
创建多级文件夹
(2)判断
boolean canExecute() 
测试利用程序是不是可以履行此抽象路径名表示的文件。 
boolean canRead() 
测试利用程序是不是可以读取此抽象路径名表示的文件。 
boolean canWrite() 
测试利用程序是不是可以修改此抽象路径名表示的文件。
int compareTo(File pathname) 
按字母顺序比较两个抽象路径名。 
boolean isAbsolute() 
测试此抽象路径名是不是为绝对路径名。 
boolean isDirectory() 
测试此抽象路径名表示的文件是不是是1个目录。 
boolean isFile() 
测试此抽象路径名表示的文件是不是是1个标准文件。 
boolean isHidden() 
测试此抽象路径名指定的文件是不是是1个隐藏文件。
boolean exists() 
测试此抽象路径名表示的文件或目录是不是存在。 
(3)获得:
String getParent() 
返回此抽象路径名父目录的路径名字符串;如果此路径名没有指定父目录,则返回 null。 
File getParentFile() 
返回此抽象路径名父目录的抽象路径名;如果此路径名没有指定父目录,则返回 null。 
String getName() 
返回由此抽象路径名表示的文件或目录的名称。
String getPath() 
将此抽象路径名转换为1个路径名字符串。 
String getAbsolutePath() 
返回此抽象路径名的绝对路径名字符串。
File getAbsoluteFile() 
返回此抽象路径名的绝对路径名情势。
(4)删除:
boolean delete() 
删除此抽象路径名表示的文件或目录。 
oid deleteOnExit() 
在虚拟机终止时,要求删除此抽象路径名表示的文件或目录。 
(5)获得全部:(非常重要!!!)
String[] list() 
返回1个字符串数组,这些字符串指定此抽象路径名表示的目录中的文件和目录。 
String[] list(FilenameFilter filter) 
返回1个字符串数组,这些字符串指定此抽象路径名表示的目录中满足指定过滤器的文件和目录。 
File[] listFiles() 
返回1个抽象路径名数组,这些路径名表示此抽象路径名表示的目录中的文件。 
生活不易,码农辛苦
如果您觉得本网站对您的学习有所帮助,可以手机扫描二维码进行捐赠
程序员人生
------分隔线----------------------------
分享到:
------分隔线----------------------------
关闭
程序员人生