JAVA I/O使用方法(转)
下面四张图表明了类之间的继承关系,其中红色、加粗的类名是常用的类。




常用转换
FileReader——>BufferedReader
BufferedReader in= new BufferedReader(new FileReader("Text.java"));
InputStream——>InputStreamReader——>BufferedReader
BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
String——>byte[]——>ByteArrayInputStream——>DataInputStream
DataInputStream in= new DataInputStream(new ByteArrayInputStream(str.getBytes()));
FileInputStream——>BufferedInputStream——>DataInputStream
DataInputStream in=new DataInputStream(new BufferedInputStream(new FileInputStream("Data.txt")));
FileWriter——>BufferedWriter——>PrintWriter
PrintWriter pw=new PrintWriter(new BufferedWriter("text.out"));
System.out(PrintStream)——>PrintWriter
PrintWriter pw=new PrintWriter(System.out,true);
FileOutputStream——>BufferedOutputStream——>PrintStream
PrintStream ps= new PrintStream(new BufferedOutputStream(new FileOutputStream("text.out")));
FileOutputStream——>BufferedOutputStream——>DataOutputStream
DataOutputStream dos= new DataOutputStream(new BufferedOutputStream(new FileOutputStream("Data.txt")));
程序举例
import java.io.*;
public class IOStreamDemo {
public static void main(String[] args) throws IOException {
/* 1.要想打开文件读取字符,你得先用String或File对象创建一个FileReader。
为了提高速度,你应该对这个文件作缓冲,因此你得把FileReader的reference 交给BufferedReader。
BufferedReader提供了readLine()方法,当你读到文件的末尾时readLine()会返回一个null,于是就退出while()循环了。
String sb是用来累加文件内容的,(再加一个换行符“\n”因为readLine()会把它们都剥掉).
最后用close()来清空缓冲区。*/
String s = "test";
StringBuilder source = new StringBuilder();
source.append(s);
source.append(System.getProperty("line.separator"));
/* 2. 用System.in生成一个能读取控制台输入的流。System.in是一个InputStream,
而BufferedReader需要一个Reader作参数,所以要先通过InputStreamReader来转转手。
Java遵循标准I/O的模型,提供了Syetem.in,System.out,以及System.err。
System.out是一个已经预先处理过的,被包装成PrintStream的对象。
System.err也是一个PrintStream;
System.in是一个未经处理的InputStream。
也就是说,虽然你可以直接往System.out和System.err上写,但是要想读System.in的话,就必须先做处理了。*/
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
System.out.print("Enter a line:");
System.out.println(reader.readLine());
/* 3. 用String s2作参数创建一个StringReader。然后用StringReader的read()方法把字符读出来,再送到控制台上去。
read()会把读出来的byte当作int,所以要想正常打印的话,你得先把它们转成char。*/
StringReader stringReader = new StringReader(source.toString());
int c;
while ((c = stringReader.read()) != -1)
System.out.print((char) c);
/*
4. 要想读取"格式化"的数据,你就得用DataInputStream了,DataInputStream是一个面向byte的I/O类,不是面向char的。
因此你只能从头到底一直用InputStream了。
当然你可以把所有的东西都当成byte。
然后用InputStream读出来。
但这里是String。要想把String当成byte数组。可以用String的getBytes()方法。而ByteArrayInputStream是可以处理byte数组的。
*/
System.out.println("===============ByteArrayInputStream begin===============");
DataInputStream byteArrayInputStream = new DataInputStream(
new ByteArrayInputStream(source.toString().getBytes()));
byte[] bytes = new byte[100];
while ((byteArrayInputStream.read(bytes)) != -1) {
System.out.print(new String(bytes));
}
System.out.println(System.getProperty("line.separator"));
System.out.println("===============ByteArrayInputStream end===============");
/* 5.向文件中写数据。先创建一个FileWriter,BufferedWriter是免不掉的。
然后再让PrintWriter去排版。这样就能得出能够读得懂的,普通的文本文件了。
输入流用完之后,readLine()会返回null。
最后调用close()方法清空缓冲区。*/
BufferedReader bufferedReader = new BufferedReader(new StringReader(source.toString()));
PrintWriter printWriter = new PrintWriter(new BufferedWriter(new FileWriter("IODemo.out")));
int lineCount = 1;
while ((s = bufferedReader.readLine()) != null)
printWriter.println(lineCount++ + ": " + s);
printWriter.close();
DataOutputStream dataOutputStream = new DataOutputStream(
new BufferedOutputStream(new FileOutputStream("Data.txt")));
/*6. 存储和恢复数据
PrintWriter会对数据进行格式化,这样人就能读懂了。
但是如果数据输出之后,还要恢复出来供其它流用,那你就必须用DataOutputStream来写数据,再用DataInputStream来读数据了。
当然,它们可以是任何流,不过我们这里用的是一个经缓冲的文件。
DataOutputStream和DataInputStream是面向byte的,因此这些流必须都是InputStream和OutputStream。
如果数据是用DataOutputStream写的,那么不管在哪个平台上,DataInputStream都能准确地把它还原出来。
这一点真是太有用了,因为没人知道谁在为平台专属的数据操心。如果你在两个平台上都用Java,那这个问题就根本不存在了。
用DataOutputStream写String的时候,要想确保将来能用DataInputStream恢复出来,唯一的办法就是使用UTF-8编码。
UTF-8是Unicode的一种变形。Unicode用两个字节来表示一个字符。
但是,如果你处理的全部,或主要是ASCII字符(只有7位),那么无论从存储空间还是从带宽上看,就都显得太浪费了,
所以UTF-8 用一个字节表示ASCII字符,用两或三个字节表示非ASCII的字符。
此外,字符串的长度信息存在(字符串)的头两个字节里。writeUTF( )和readUTF( )用的是Java自己的UTF-8版本(JDK文档里有关于这个字符集的完整讲解,
就在这两个方法的文档里),
所以如果你要用一个Java程序读取writeUTF( )写的字符串的话,就必须进行一些特殊处理了。
有了writeUTF( )和readUTF( ),你就能放心地把String和其它数据混在一起交给DataOutputStream了,
因为你知道String是以Unicode的形式存储的,而且可以很方便地用DataOutputStream恢复出来。
writeDouble( )会往流里写double,而它"影子"readDouble( )则负责把它恢复出来(其它数据也有类似的读写方法)。
但是要想让读取方法能正常工作,你就必须知道流的各个位置上都放了些什么数据。因为你完全可以把double读成byte,char,或其它什么东西。
所以要么以固定的格式写文件,要么在文件里提供额外的解释信息,然后一边读数据一边找数据。先提一下,对于复杂数据的存储和恢复,对象的序列化可能会比较简单。*/
dataOutputStream.writeDouble(3.14159);
dataOutputStream.writeUTF("That was pi");
dataOutputStream.writeDouble(1.41413);
dataOutputStream.writeUTF("Square root of 2");
dataOutputStream.close();
DataInputStream dataInputStream = new DataInputStream(
new BufferedInputStream(new FileInputStream("Data.txt")));
System.out.println(dataInputStream.readDouble());
System.out.println(dataInputStream.readUTF());
System.out.println(dataInputStream.readDouble());
System.out.println(dataInputStream.readUTF());
}
}
http://blog.sina.com.cn/s/blog_4cc16fc50100bvyb.html
InputStream/OutputStream:
1)抽象类,2)面向字节形式的I/O操作(8 位字节流) 。
Reader/Writer:
1)抽象类,2)面向字符的 I/O操作(16 位的Unicode字符) 。
InputStreamReader:
可以将InputStream转换为 Reader。
OutputStreamWriter:
可以将OutputStream转换为Writer。


Java I/O的核心采用了Decorator(装饰)模式。

http://wentao365.iteye.com/blog/1183951
JAVA I/O使用方法(转)的更多相关文章
- 获取当前应用的系统路径工具类和java的System.getProperty()方法介绍
java的System.getProperty()方法可以获取的值,如下: 对于Java程序,无论是未打包的还是打包的JAR或WAR文件,有时候都需要获取它运行所在目录信息,如何做到这一点呢? /** ...
- Java实现时间动态显示方法汇总
这篇文章主要介绍了Java实现时间动态显示方法汇总,很实用的功能,需要的朋友可以参考下 本文所述实例可以实现Java在界面上动态的显示时间.具体实现方法汇总如下: 1.方法一 用TimerTask: ...
- Java Native Interfce三在JNI中使用Java类的普通方法与变量
本文是<The Java Native Interface Programmer's Guide and Specification>读书笔记 前面我们学习了如何在JNI中通过参数来使用J ...
- 浅谈Java中的hashcode方法
哈希表这个数据结构想必大多数人都不陌生,而且在很多地方都会利用到hash表来提高查找效率.在Java的Object类中有一个方法: 1 public native int hashCode(); 根据 ...
- 0019 Java学习笔记-面向对象-方法
方法属于谁 方法要么属于类,要么属于对象 static修饰的方法属于类 没有static修饰的方法属于对象 方法只能定义在类里面,不能独立定义 不能独立的执行方法,要么通过类调用,要么通过方法调用 一 ...
- [Java] - 格式字符串替换方法
Java 字符串格式替换方法有两种,一种是使用String.format(...),另一种是使用MessageFormat.format(...) 如下: import java.text.Messa ...
- atitit.java给属性赋值方法总结and BeanUtils 1.6.1 .copyProperty的bug
atitit.java给属性赋值方法总结and BeanUtils 1.6.1 .copyProperty的bug 1. core.setProperty(o, "materialId&qu ...
- JAVA常见错误处理方法 和 JVM内存结构
OutOfMemoryError在开发过程中是司空见惯的,遇到这个错误,新手程序员都知道从两个方面入手来解决:一是排查程序是否有BUG导致内存泄漏:二是调整JVM启动参数增大内存.OutOfMemor ...
- 千万不要误用 java 中的 HashCode 方法
刚才debug追堆栈的时候发现一个很奇怪的问题 我用IE8和Google的浏览器访问同一个地址 Action的 scope="session" 也设置了 而且两个浏览器提交的参数m ...
- java中的native方法和修饰符(转)
Java中的native修饰符 今天偶然看代码,发现别人有这样写的方法,并且jar里面有几个dll文件,比较奇怪,于是把代码打开,发现如下写法. public native String GSMMod ...
随机推荐
- 基于TcpDump和pcap文件分析的Android平台网络抓包程序设计与实现【随便】
一.考虑使用Tcpdump,将抓到的包保存到cap文件中,然后手动分析.参考资料:1. http://www.cnblogs.com/tt-0411/archive/2012/09/23/269936 ...
- hibernate中先建表还是先建实体类
在实际工作中往往是先建表然后再生成类原因:建好数据库表之后往往要对数据表进行一些优化,比如说建索引,比如说建中间表,比如建视图.如果先建类的话这些优化是无法生成的
- PHP简易计算器方法1
<?phpheader("content-type:text/html;charset=utf-8");session_start();?><!DOCTYPE h ...
- C/C++ 用libcurl库进行http通讯网络编程
C/C++ 用libcurl库进行http通讯网络编程 目录索引: 一.LibCurl基本编程框架 二.一些基本的函数 三.curl_easy_setopt函数部分选项介绍 四.curl_easy_p ...
- C++ STL 一般总结
以下内容来源网上 经过整合而成(转载) 一.一般介绍 STL(Standard Template Library),即标准模板库,是一个具有工业强度的,高效的C++程序库.它被容纳于C++标准程序库( ...
- oracle转换数字到格式化字符串
问题描写叙述 oracle假设存储number(20,2)数据,0数据库中为0.00,2.1数据库中为2.10,3.88存储为3.88, 假设直接从数据库中取出相应显示为: 0 2.1 3.88 保留 ...
- ACCESS 里面的坑
在vs2005中用sql语句访问access数据库出现replace函数未定义错误,后来查询得知,在不能用replace访问access. 问题: 1.为什么以前运行正常的Access数据库,搬到 ...
- Java面试题之Class.forName的作用
按参数中指定的字符串形式的类名去搜索并加载相应的类,如果该类字节码已经被加载过,则返回代表该字节码的Class实例对象,否则,按类加载器的委托机制去搜索和加载该类,如果所有的类加载器都无法加载到该类, ...
- 2014.12.01 B/S 使用VS建立Web网站
要求:从hr数据库info表读取数据,在Web网站中显示为如图: 用DW绘制一个表格,然后将代码拷贝到新建的网站主页代码中 <div> <table bgcolor=" w ...
- Oracle的总体回顾
1.多表查询:一张以上的表进行查询,称为多表查询,多表查询的时候可以为表指定别名的方式以简化查询列的编写,在多表查询中,会产生笛卡尔积,就是两张表的总数相乘得到的结果,如果要想消除笛卡尔积要通过关联条 ...