public class IOStreamDemo {
public static void main(String[] args) {
try {
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("C:\\file_out.txt"));
BufferedReader bufferedReader = new BufferedReader(new FileReader("c:\\hb.log"));
String tempStr;
while((tempStr = bufferedReader.readLine()) != null){
System.out.println(tempStr);
bufferedWriter.write(tempStr);
}
bufferedReader.close();
//数据先是放到缓冲区中的,然后再写入文件,因此一定要用flush()方法,否则在文件中没有数据显示
bufferedWriter.flush();
bufferedWriter.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
与JDBC编程一样,程序里打开的文件IO资源不属于内存里的资源,垃圾回收机制无法回收该资源,所以应该显示关闭IO资源。
使用java的IO流执行输出时,不要忘记关闭输出流,关闭输出流除了可以保证流的物理资源被回收之外,可能还可以将输出流缓冲区中的数据flush到物理节点(因为在执行close()方法之前,自动回执行输出流的flush()方法)
转换流
InputStreamReader : 将字节输入流转换成字符输入流
OutputStreamWriter : 将字节输出流转换成字符输出流
怎么没有把字符流转换成字节流?
字节流比字符流的使用更广泛,但是字符流比字节流操作更方便。如果有一个流已经是字符流了,也就是说,一个用起来更方便的流,为什么要转换成字节流呢?反之,如果现在有一个字节流,但我们知道这个字节流的内容都是文本内容,那么把它转换成字符流来处理会更方便一些,所以java只提供了将字节流转换成字符流的类。
public class ReadOfficeDoc {
/*
* 不能直接获取doc文档中的数据,获取的全部是乱码
*/
public static void main(String[] args) {
FileInputStream fis;
try {
fis = new FileInputStream("c:\\HUAWEI统一WebUI接口说明书.doc");
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(fis));
String str;
while((str = bufferedReader.readLine()) != null){
System.out.println(str);
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Java使用System.in代表标准输入,即键盘输入,但这个标准输入时InputStream类的实例,使用不太方便,而且键盘输入内容都是文本内容,所以可以使用InputSteamReader将其转换成字符流,普通的Reader读取输入内容时依然不太方便,我们可以将普通的Reader再次包装成BufferedReader,利用BufferedReader的readLine()方法可以一次读取一行内容。
package hb.io;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class KeyInTest {
public static void main(String[] args) throws IOException {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String buffer = null;
while((buffer = br.readLine()) != null){
if(buffer.equals("exit")){
break;
}else{
System.out.println(buffer);
}
}
}
}
使用命令编译
javac KeyInTest.java
java KeyInTest
备注:BufferedReader具有一个readLine()方法,可以非常方便地一次读取一行内容,所以经常把读取文本内容的输入流包装成BufferedReader,用来方便的读取输入的文本内容。
由于PrintStream类的输出功能非常强大,通常如果我们需要输出文本内容,都应该将输出流包装成PrintStream后进行输出。
System.out的类型就是PrintStream.
package hb.io;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.PrintStream;
public class PrintStreamTest {
public static void main(String[] args) {
try {
FileOutputStream fos = new FileOutputStream("c:\\hb.txt");
PrintStream ps = new PrintStream(fos);
ps.println("hello");
ps.print(new PrintStreamTest());
ps.close();
fos.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
}
}
}