java编程笔记14 流与文件读写

1)      输入输出流(程序从某个地方数据,程序将数据保存到某个地方)

输入流是将数据从数据源传送到程序,输出流是将数据从程序送到期望的地方。(什么是数据源是关键,不要混淆输入和输出)

字节:InputStream和OutputStream

双字节:Reader和Writer

Reader和Writer用于读取双字节的Unicode的字符,读取中文时不会出现乱码

类的层次,继承关系,这里主要介绍文件的读写,即子类FileInputStream等。

2)      标准输入输出流

System.in  接受用户在标准io设备上的输入,一般是键盘。

System.out

System.err

3)      流的常用方法

以上四个流的常用方法。

读取文件的操作:

数据源是文件,程序从文件里要数据,应该用输入流。

InputStream使用在二进制文件上,比如应用程序,图片,媒体文件等,Reader用在文本文件,比如log文件,txt文件等。

InputStream的子类FileInputStream的构造方法

构造方法摘要

FileInputStream(File file)
          通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的 File 对象 file 指定。

FileInputStream(FileDescriptor fdObj)
          通过使用文件描述符 fdObj 创建一个 FileInputStream,该文件描述符表示到文件系统中某个实际文件的现有连接。

FileInputStream(String name)
          通过打开一个到实际文件的连接来创建一个 FileInputStream,该文件通过文件系统中的路径名 name 指定。

Reader子类InputStreamReader的构造方法

构造方法摘要

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

InputStreamReader(InputStream in, Charset cs)
          创建使用给定字符集的 InputStreamReader。

InputStreamReader(InputStream in, CharsetDecoder dec)
          创建使用给定字符集解码器的 InputStreamReader。

InputStreamReader(InputStream in, String charsetName)
          创建使用指定字符集的 InputStreamReader。

二者使用上的差异(inputstream读取unicode中文文件会产生乱码,见代码文件,略)

将内容保存到文件的操作

OutputStream和Writer类。

ReadFile.java
package FileOperation;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.Reader;

//比较InputStream和Reader读txt文件,据说InputStream会产生乱码,但兵马俑。不知道为什么
public class ReadFile {


public static void main(String[] args) throws IOException {

if(args == null || args.length < 1)
{
System.out.println(
"缺少参数字符串给出要读取的文件的位置");
}
//传入一个参数指定文件位置
File file = new File(args[0]);

//调用readFileUsingInputStream(file)方法读取件
System.out.println("使用 InputStream 读取文件 " + file.getAbsolutePath() +
", 内容为: ");
System.out.println(readFileUsingInputStream(file));

//调用readFileUsingReader(file)读文件
System.out.println("使用 Reader 读取文件 " + file.getAbsolutePath() +
", 内容为: ");
System.out.println(readFileUsingReader(file));

}


/*用InputStream流读文件,注意这里抛出了异常,可能出现在ins.close();当你在方法内部
* 写到某个语句可能产生异常的时候,会有提示你在方法头声明异常,我们也可以看到throws出
* 的异常也并不一定要急着去处理,在main方法里调用此方法时再次把异常往上抛,并没有去处理
*/
public static String readFileUsingInputStream(File file) throws IOException
{
InputStream ins
= null;
StringBuffer buffer
= new StringBuffer();//用一个buffer保存读取的数据

try{
ins
= new FileInputStream(file);//FileInputStream的构造方法,指定某个文件

byte[] tmp = new byte[10];

int length = 0;

//int read(byte[] a)方法,从输入流读取数据,并存储于缓冲区a内,返回值为读取字节数
//流读取最后完好的保存了换行 空格
while((length = ins.read(tmp)) != -1)//每次读10字节
{
buffer.append(
new String(tmp,0,length));
}
}
catch(Exception e){
e.printStackTrace();
}
finally{
if(ins != null)
{
ins.close();
}
}

return buffer.toString();
}

//同上
public static String readFileUsingReader(File file) throws IOException
{
Reader reader
= null;

StringBuffer buffer
= new StringBuffer();

try{
reader
= new InputStreamReader(new FileInputStream(file));

char[] tmp = new char[10];//字符流,注意跟上面的缓冲区的区别

int length = 0;

while((length = reader.read(tmp)) != -1)
{
buffer.append(
new String(tmp,0,length));
}
}
catch(Exception e){
e.printStackTrace();
}
finally{
if(reader != null)
{
reader.close();
}
}

return buffer.toString();
}

}

使用 InputStream 读取文件  D:\filetest.txt, 内容为:
标题:静夜思

作者:李白

床前明月光,
疑是地上霜。
举头望明月,
低头思故乡。


使用 Reader 读取文件  D:\filetest.txt, 内容为:
标题:静夜思

作者:李白

床前明月光,
疑是地上霜。
举头望明月,
低头思故乡。


WriteFile
package FileOperation;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.io.Reader;
import java.io.Writer;

public class WriteFile {


public static void writeFileUsingOutputStream(File file,String content) throws Throwable
{
if(file.createNewFile())
System.out.println(
"已建立新文件 " + file.getAbsolutePath());

OutputStream ous
= null;

try{
ous
= new FileOutputStream(file);
ous.write(content.getBytes());
ous.flush();
}
catch(Exception e){
e.printStackTrace();
}
finally{
if(ous != null)
ous.close();
}
System.out.println(
"已写入文件 " + file.getAbsolutePath());
}


public static void writeFileUsingWriter(File file,String content) throws IOException
{
if(file.createNewFile())
System.out.println(
"已建立新文件 " + file.getAbsolutePath());

Writer writer
= null;

try{
//注意writer的生成,由中间过程FileOutputStream转化了一次
writer = new OutputStreamWriter(new FileOutputStream(file));
writer.write(content);
writer.flush();
//强制将缓存里的数据输出
}catch(Exception e){
e.printStackTrace();
}
finally{
if(writer != null)
writer.close();
}
System.out.println(
"已写入文件 " + file.getAbsolutePath());
}


public static void main(String[] args) throws Throwable {

System.out.println(
"请输入文件内容,#符号结束输入:");

//注意writer和reader对象都要通过另一个流生成
Reader reader = new InputStreamReader(System.in);//注意标准输入的用法

StringBuffer buffer
= new StringBuffer();
char ch;
//输入内容都放入buffer里
while((ch = (char) reader.read()) != '#')
buffer.append(ch);

//分别用两种方法来保存内容
writeFileUsingOutputStream(new File("C:\\output_stream.txt"), buffer.toString());
writeFileUsingWriter(
new File("C:\\ouput_writer.txt"),buffer.toString());
}

}

请输入文件内容,#符号结束输入:
标题:茕茕白兔
选自:诗经

茕茕白兔,
东奔西顾。
衣不如新,
人不如故。
#
已建立新文件  C:\output_stream.txt
已写入文件  C:\output_stream.txt
已建立新文件  C:\ouput_writer.txt
已写入文件  C:\ouput_writer.txt

posted @ 2011-03-15 19:18  jinmengzhe  阅读(914)  评论(0编辑  收藏  举报