黑马程序员技术交流社区
标题:
day19 IO流总结
[打印本页]
作者:
牛德阳
时间:
2016-1-1 22:41
标题:
day19 IO流总结
本帖最后由 牛德阳 于 2016-1-1 22:49 编辑
Reader:用于读取字符流的抽象类。子类必须实现的方法只有 read(char[], int, int) 和 close()。
Writer:写入字符流的抽象类。子类必须实现的方法仅有 write(char[], int, int)、flush() 和 close()
package day18;
import java.io.*;
/*把文件内容拷贝到另一个文件*/
public class filelianxi {
public static void main(String[] args) throws IOException {
//copy1();
copy2();
}
public static void copy1() throws IOException//第一种拷贝方法
{
FileReader fr=new FileReader("c:\\ioException.txt");
FileWriter fw=new FileWriter("c:\\ioException.java");
int num;
while((num=fr.read())!=-1)
{
fw.write(num);
}
fr.close();
fw.close();
}
public static void copy2() // 第二中拷贝方法 {
FileReader fr=null;
FileWriter fw = null;
try {
fr = new FileReader("c:\\ioException.txt");
char[] arr=new char[1024];
fw = new FileWriter("c:\\ioException1.java");
int length=0;
while((length=fr.read(arr))!=-1)
{
fw.write(arr, 0, length);
}
}
catch (IOException e) {
e.printStackTrace();
}
finally{
try {
if(fr!=null)
fr.close();
} catch (IOException e) {
e.printStackTrace();
}
try {
if(fw!=null)
fw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}}
复制代码
BufferedReader:从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。 可
以指定缓冲区的大小,或者可使用默认的大小。大多数情况下,默认值就足够大了。
自定义BufferedReader实现其功能
package day19;
import java.io.FileReader;
import java.io.IOException;
public class myBufferedReader {
private FileReader fr;
public myBufferedReader(FileReader fr)//构造方法
{
this.fr=fr;
}
public String myReadLine() throws IOException//实现ReadLine()功能
{
StringBuffer sb=new StringBuffer();
int ch=0;
while((ch=fr.read())!=-1)
{
if(ch=='\r')
continue;
if(ch=='\n')//window里回车符是\r\n读到\n的时候行读取完毕返回字符串
return sb.toString();
else
sb.append((char)ch);
}
if(sb.length()!=0)
return sb.toString();
return null;
}
public void myclose() throws IOException{
fr.close();//关闭FileReader流
}
}
复制代码
BufferedWriter:将文本写入字符输出流,缓冲各个字符,从而提供单个字符、数组和字符串的高效写
入。
下面是用BufferedReaer和BufferedWriter拷贝文件的例子:
package day19;
import java.io.*;
public class buffercopydemo {
public static void main(String[] args) {
BufferedWriter bufw=null;
BufferedReader bufr=null;
try
{
bufr=new BufferedReader(new FileReader("bufferwriterdemo.java"));
bufw=new BufferedWriter(new FileWriter("buf.txt"));
String line=null;
while((line=bufr.readLine())!=null)
{
bufw.write(line);
bufw.flush();
bufw.newLine();
}
}
catch(IOException e)
{
throw new RuntimeException("读写失败");
}
finally
{
try
{
if(bufw!=null)
{
bufw.close();
}
if(bufr!=null){ bufr.close();}
}
catch(IOException e){
throw new RuntimeException("读写失败");
}
}
}
}
复制代码
LineNumberReader : 跟 踪 行 号 的 缓 冲 字 符 输 入 流 。 此 类 定 义 了 方 法 setLineNumber(int) 和
getLineNumber(),它们可分别用于设置和获取当前行号。
自定义LineNumberReader 实现该类的功能
package day19;
import java.io.FileReader;
import java.io.IOException;
public class myLineNumberReader extends myBufferedReader {
复制代码
InputStream:是表示字节输入流的所有类的超类。
FileInputStream:从文件系统中的某个文件中获得输入字节。哪些文件可用取决于主机环
FileInputStream 用于读取诸如图像数据之类的原始字节流。要读取字符流,请考虑使用 FileReader。
OutputStream:此抽象类是表示输出字节流的所有类的超类。
FileOutputStream:文件输出流是用于将数据写入 File 或 FileDescriptor 的输出流。
以下是字节流读取文件的三种方式:
package day19;
import java.io.*;
public class fileStream1 {
public static void main(String[] args) throws IOException {
FileOutputStream fos=new FileOutputStream("buf.txt");
FileInputStream fis=new FileInputStream("buf.txt");
write(fos);
read_1(fis);
read_2(fis);
read_3(fis);
}
public static void write(FileOutputStream fos) throws IOException
{
fos.write("niudeyang".getBytes());//将字符串转换成字节数组写入文件中
fos.close();
}
public static void read_1(FileInputStream fis) throws IOException//第一种读取方式
{
int i;
while((i=fis.read())!=-1)
{
System.out.print((char)i);
}
fis.close();
}
public static void read_2(FileInputStream fis) throws IOException//第二种读取方式把读取内容放入创建的字节数组中
{
byte[] b=new byte[1024];//数组长度为1024的整数倍
int i=0;
while((i=fis.read(b))!=-1)
{
System.out.println(new String(b,0,i));
}
fis.close();
}
public static void read_3(FileInputStream fis) throws IOException
{
byte[] b=new byte[fis.available()];//利用fis.available()设置数组大小提高效率无需循环
fis.read(b);
System.out.println(new String(b));
fis.close();
}
}
复制代码
package day19;
/*用实现缓冲的字节流拷贝MP3文件<span style="line-height: 2.2em;">*/</span>
复制代码
package day19;
import java.io.*;
public class transStream2 {
/*1.需求1:从键盘输入并打印一行数据
* 需求2:读取文件中内容并打印
* 需求3:从键盘输入数据存储在文件
*/
public static void main(String[] args) throws IOException {
xuqiu_1();
xuqiu_2();
xuqiu_3();
}
private static void xuqiu_3() throws IOException {//需求3:从键盘输入数据存储在文件中
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(new FileOutputStream("buf.txt",true),"UTF-8"));
String str=null;
while((str=br.readLine())!=null){
bw.write(str.toUpperCase());
bw.flush();
;
}
br.close();
bw.close();
}
private static void xuqiu_2() throws IOException {//需求2:读取文件中内容并打印
BufferedReader br=new BufferedReader( new FileReader("buf.txt"));
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out));
String str=null;
while((str=br.readLine())!=null){
bw.write(str.toUpperCase());
bw.flush();
;
}
br.close();
}
private static void xuqiu_1() throws IOException {//需求1:从键盘输入并打印一行数据
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(System.out));
String str=null;
while((str=br.readLine())!=null){
if("over".equalsIgnoreCase(str))
break;
bw.write(str.toUpperCase());
bw.flush();
;
}
br.close();
}
}
复制代码
作者:
Garnet92
时间:
2016-1-2 11:35
一直比较迷茫 看了 这个 有点思路了 多谢分享
作者:
Garnet92
时间:
2016-1-2 11:36
60分 已经很不错了 继续努力
作者:
yehua1026
时间:
2016-1-2 12:09
非常好!!!
作者:
337325635
时间:
2016-1-2 21:46
明天才开始学 ,正好可以复习
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2