Java 之 I/O 系列 01 ——基础
Java 之 I/O 系列 目录
整理《疯狂java编程》
15章
IO流分为输入流(InputStream)和输出流(OutputStream)两类
按流所处理的数据类型又可以分为字节流和字符流(用于处理Unicode字符数据)两类
字节流主要是由 InputStream和OutputStream作为基类,而字符流主要是由 Reader和Writer作为基类的
节点流(低级流) 和 处理流(高级流):
JAVA使用处理流来包装节点流式一种典型的装饰器设计模式,通过使用处理流来包装不同的节点流,既可以消除不同节点流的实现差异,也可以提供更方便的方法来完成输入输出功能,这就允许Java应用程序采用相同的代码,透明的方式来访问不同输入\输出设备的数据流。所以处理流也叫做包装流
下图说明相关体系:

文件类:(File):
提供文件操作功能(File可以创建,删除等操作对文件或目录,但是要访问文件内容,就必须用到输入/输出流)
1.创建File类对象:
File f;
f = new File("Test.java");
f = new File("E:\\ex\\","Test.java");
2.将目录也当作文件处理File类中提供了实现目录管理功能的方法:
File path = new File("E:\\ex\\");
File f = new File(path, "Test.java");
方法:
f.getName():返回文件名 temp.dat
f.getParent():返回文件所在目录名 data
f.getPath():返回文件路径 data\temp.dat
f.getAbsolutePath():返回绝对路径 …\data\temp.dat
f.exists():文件是否存在
f.canWrite(), f.canRead():文件是否可写、读
f.isFile(), f.isDirectory():是否为文件或目录
f.lastModified(), f.length(), f.delete():文件的最后修改日期、长度;删除文件
f.mkdir(), f.list():创建一个目录;列出目录下所有的文件
几个例子说明:
/**
* FileInputStream 测试
* @ClassName: fileTest_1
* @Description:
* @author xingle
* @date 2014-4-15 下午3:12:54
*/
public class fileTest_1 {
public static void main(String[] str) throws IOException{
File f = new File("E:\\test.txt");
FileInputStream fis = new FileInputStream(f);
byte[] buf = new byte[32];
int hasRead = 0;
while((hasRead=fis.read(buf))>0){
System.out.println(new String(buf,0,hasRead));
}
if(fis!=null){
fis.close();
}
}
}
/**
* FileReader 测试
* @ClassName:
* @Description:
* @author xingle
* @date 2014-4-15 下午2:24:12
*/
public class fileTest_2 {
public static void main(String[] args) throws IOException {
File f = new File("E:\\test.txt"); FileReader fr = new FileReader(f);
char[] cbuf = new char[32];
int hasRead = 0;
try {
while((hasRead = fr.read(cbuf))>0){
System.out.println(new String(cbuf, 0, hasRead));
}
} catch (IOException e) {
e.printStackTrace();
}finally{
if(fr!=null){
fr.close();
}
}
}
}
/**
* FileOutputStream 测试
* @ClassName: fileTest_3
* @Description: 把一个文件的所有内容写到另外一个文件中
* @author xingle
* @date 2014-4-15 下午2:45:25
*/
public class fileTest_3 {
public static void main(String[] args) throws IOException {
FileInputStream fis = null;
FileOutputStream fos = null;
try{
File fi = new File("E:\\test.txt");
fis = new FileInputStream(fi);
File fo = new File("E:\\testout.txt");
//覆盖写入
fos = new FileOutputStream(fo);
//追加写入
//fos = new FileOutputStream(fo,true);
//判断是否存在该文件
if (!fo.exists()) {
System.out.println("file is not exist");
fi.createNewFile();
}
int hasRead = 0;
byte[] buf = new byte[32];
while((hasRead=fis.read(buf))>0){
fos.write(buf, 0, hasRead);
}
}catch(IOException e){
e.printStackTrace();
}finally{
if(fis!=null){
fis.close();
}
if(fos!=null){
fos.close();
}
}
}
}
/**
* 浏览当前目录下的所有文件和目录
* @ClassName: fileTest_4
* @Description:
* @author xingle
* @date 2014-4-15 下午3:31:22
*/
public class fileTest_4 {
public static void main(String[] args){
File f1 = new File("");
String path = f1.getAbsolutePath();
System.out.println("当前路径:"+path);
File f = new File(path);
File[] fileLs = f.listFiles(); for(int i=0;i<fileLs.length;i++){
if(fileLs[i].isDirectory()){
System.out.println( "目录-- " + fileLs[i].getName());
}
else{
System.out.println("文件--"+fileLs[i].getName());
}
}
}
}
/**
* 文件过滤
* @ClassName: 打印.txt结尾的文件名
* @Description:
* @author xingle
* @date 2014-4-15 下午4:32:45
*/
public class fileTest_5 {
public static void main(String[] args){
File f = new File("E:\\filetest");
String[] files = f.list(new MyFilter());
for(String name:files){
System.out.println(name);
}
}
} class MyFilter implements FilenameFilter{
@Override
public boolean accept(File dir, String name) {
return name.endsWith(".txt");
} }
过滤流—缓冲流
类BufferedInputStream和BufferedOutputStream继承FilterInputStream和FilterOutputStream,实现了带缓冲的过滤流,它提供了缓冲机制,把任意的I/O流“捆绑”到缓冲流上,可以提高该I/O流的读取效率,在初始化时,除了要指定所连接的I/O流之外,还可以指定缓冲区的大小。
在读写的同时对数据缓存,这样避免每次读写数据都要进行实际的物理读写操作,在用BufferdOutputStream输出时,数据先输入缓冲区,当缓冲区满的时再写入连接的输出流,可以调用flush()来清空缓冲区。
/**
* 文件缓冲流测试
* @ClassName: fileTest_6
* @Description:
* @author xingle
* @date 2014-4-17 上午8:34:54
*/
public class fileTest_6 {
public static void main(String[] args){
try{
File fin = new File("E:\\test.txt");
File fout = new File("E:\\testout.txt");
BufferedInputStream bufin = new BufferedInputStream(new FileInputStream(fin), 256);
BufferedOutputStream bufout = new BufferedOutputStream(new FileOutputStream(fout), 256);
int len;
byte bArray[] = new byte[256];
do{
len = bufin.read(bArray);
bufout.write(bArray, 0, len);
System.out.println("len:"+len);
}while(len==256);
bufin.close();
bufout.close();
}catch (IOException e) {
throw new RuntimeException();
}
}
}
过滤流—数据流
DataInputStream和DataOutputStream, 继承FilterInputStream和FilterOutputStream,可以用来与计算机无关的格式读写JAVA的基本数据类型以及String对象。
DataInputStream
数据输入流允许应用程序以与机器无关方式从底层输入流中读取基本 Java 数据类型。应用程序可以使用数据输出流写入稍后由数据输入流读取的数据。
DataInputStream 对于多线程访问不一定是安全的。 线程安全是可选的,它由此类方法的使用者负责。
readBoolean() 读一字节,非零为真
readByte() 以8位读字节
readChar() 读Unicode字符
readInt() 读整数值
writeChar(int v) 把字符写进输出流
writeLong(long v) 把长整写进输出流
writeInt(int v) 把整数写进输出流
数据输出流可以是一个已经建立好的输入数据流对象,例如网络的连结,文件等。数据流可通过如下方式建立。
DataOutputStream
数据输出流允许应用程序以适当方式将基本 Java 数据类型写入输出流中。然后,应用程序可以使用数据输入流将数据读入。
FileInputStream fis = new FileInputStream("file1.txt");
FileOutputStream fos = new FileOutputStream("file2.txt");
DataInputStream dis = new DataInputStream(fis);
DataOutputStream dos = new DataOutputStream(fos);
/**
* 过滤流—数据流 :DataInputStream 和 DataOutputStream 测试
* @ClassName: fileTest_7
* @Description:
* @author xingle
* @date 2014-4-17 下午5:53:03
*/
public class fileTest_7 {
public static void main(String[] args) throws IOException{
FileOutputStream fos = new FileOutputStream("D:\\test\\2.txt");
DataOutputStream dos = new DataOutputStream(fos);
try{
dos.writeBoolean(true);
dos.writeByte((byte)123);
dos.writeChar('J');
dos.writeDouble(3.1415926);
dos.writeFloat(2.71f);
dos.writeInt(1234556);
dos.writeLong(998877665544332211L);
dos.writeShort((short) 11223);
}finally{
dos.close();
}
FileInputStream fis = new FileInputStream("D:\\test\\2.txt");
DataInputStream dis = new DataInputStream(fis);
try{
System.out.println("\t " + dis.readBoolean());
System.out.println("\t " + dis.readByte());
System.out.println("\t " + dis.readChar());
System.out.println("\t " + dis.readDouble());
System.out.println("\t " + dis.readFloat());
System.out.println("\t " + dis.readInt());
System.out.println("\t " + dis.readLong());
System.out.println("\t " + dis.readShort());
}finally{
dis.close();
}
} }
Java 之 I/O 系列 01 ——基础的更多相关文章
- Java知识系统回顾整理01基础06数组01创建数组
一.数组定义 定义:数组是一个固定长度的,包含了相同类型数据的 容器 二.声明数组 int[] a; 声明了一个数组变量. []表示该变量是一个数组 int 表示数组里的每一个元素都是一个整数 a 是 ...
- Java知识系统回顾整理01基础04操作符01算术操作符
一.算数操作符类别 基本的有: + - * / % 自增 自减: ++ -- 二.基本算数操作符 + - * / 基本的加 减 乘 除 public class HelloWorld { public ...
- Java知识系统回顾整理01基础06数组07数组工具类Arrays
一.Arrays简介 Arrays是针对数组的工具类,可以进行 排序,查找,复制填充等功能. 大大提高了开发人员的工作效率. 二.Arrays提供的数组复制方法 与使用System.arraycopy ...
- java(jdk1.7) IO系列01之InputStream和OutputStream解析
1.InputStream和OutputStream简介 在java中InputStream和OutputStream分别代表字节输入流和字节输出流,表示以字节的方式来实现进程或者程序的通信,Inpu ...
- Java知识系统回顾整理01基础02面向对象01类和对象
一.面向对象实例--设计英雄这个类 LOL有很多英雄,比如盲僧,团战可以输,提莫必须死,盖伦,琴女 所有这些英雄,都有一些共同的状态 比如,他们都有名字,hp,护甲,移动速度等等 这样我们就可以设计一 ...
- Java知识系统回顾整理01基础01第一个程序07Eclipse使用----找不到类如何解决?
一.现象 有时候会碰到如图所示的问题,分明有Hello这个类,并且也有主方法,可是运行就会出现找不到或者无法加载类Hello,或者Class Not Found 异常. 出现这个状况,有多种原因造成, ...
- Java知识系统回顾整理01基础01第一个程序06Eclipse使用技巧
一.批量修改 ALT+SHIFT+R 二.快速输入主方法 1. 敲入main 2. alt+/ 三.快速输入System.out.println 1. 敲入syso 2. alt+/ 四.快速输入fo ...
- Java知识系统回顾整理01基础01第一个程序05Eclipse中运行Java程序
一.打开Java文件 直接打开在 命令行Hello World 中创建的java 文件 HelloWorld.java 二.运行 点击绿色运行按钮,直接运行 在eclipse中,编译过程自动执行了 三 ...
- Java知识系统回顾整理01基础01第一个程序04创建Eclipse项目
一.为Eclipse设置桌面快捷方式图标 二.双击桌面快捷方式打开Eclipse 三.选择工作区 使用在命令行Hello World中的项目目录e:\project 除了第一次启动eclipse的时候 ...
随机推荐
- Know How To Use ID_NULL Function To Search An Object In Oracle Forms
ID_NULL built in function is used to determine that an object type variable is null or not null in O ...
- GenericServlet,HttpServletRequest和HttpServletResponse
最基本的是通过实现Servlet接口来编写Servlet类,这需要实现Servlet接口中定义的5个方法. 为了简化Servlet的编写,在javax.servlet包中提供了一个抽象类Generic ...
- JQuery 选中Radio
<tr> <td> <input type="radio" name="rdb" value="启用" che ...
- 请求webservice接口的某方法数据
NSURL *url = [NSURL URLWithString:@"http://xxx.xxx.com/xxx/xxxxWS?wsdl"]; NSString *soapMs ...
- JS——时间日期控件
原文:http://blog.sina.com.cn/s/blog_621768f30100qmfz.html 今天找到一个还不错的日历控件 下载地址:http://www.my97.net/dp/d ...
- 《NoSQL精粹》思维导图读书笔记
<NoSQL精粹>思维导图读书笔记 各主题笔记 这本书短小精悍,虽不能解答所有NoSQL疑问,但在读书过程中会抛给你不少未曾想过的问题,给人以更深入的思考: 这里对每一个主题分别做了笔记: ...
- Comware 架构理解
网络操作系统 首先什么是网络操作系统: 一种说法是:运行在路由器,网络交换机,防火墙上的特别的操作系统 另一种说法是:部署在局域网或者私有网络,允许网络中的多个计算机共享文件和打印机,因为现在的单机系 ...
- Codeforces Round #279 (Div. 2) E. Restoring Increasing Sequence 二分
E. Restoring Increasing Sequence time limit per test 1 second memory limit per test 256 megabytes in ...
- (一)二维数组&&指针数组与数组指针
一.首先我们从字面意思理解一下什么是指针数组什么是数组指针 1.指针数组:本质是一个数组,数组中的每一个元素是一个指针. 2.数组指针:本质是一个指针,而指针指向一个数组. 二.我们该怎么区分指针数组 ...
- C++——友元、异常和其他
一.友元 类并非只能拥有友元函数,也可以将类作为友元.在这种情况下,友元类的所有方法都可以访问原始类的私有成员和保护成员.另外,也可以做更严格的限制,只将特定的成员函数指定为另一个类的友元.哪些函数. ...