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的时候 ...
随机推荐
- 草珊瑚的css基础
首先要了解如下概念: viewport,窗口大小,containing block,block formatting context,inline formatting context,dirctio ...
- 【网摘】DICOM 基础简介
一 什么是DICOM?DICOM是Digital Imaging and Communication of Medicine的缩写,是美国放射学会(American College of Radiol ...
- XAF使用数据库访问层缓存的提升性能
很多时候,为了提升性能,我们可以给数据库访问层做缓存. 以下几步可以完成这个任务:1. 使用自定义的 XPObjectSpaceProvider1.1. 创建自定义的 XPObjectSpacePro ...
- C运行时的数据结构
本文描述一下:C运行时的数据结构,相关的段,压栈等 unix默认的编译器会将编译生成的文件默认命名为a.out 目标文件和可执行文件可以有几种不同的格式,所有这些不同格式具有一个共同的概念,那就是段. ...
- iOS - OC PList 数据存储
前言 直接将数据写在代码里面,不是一种合理的做法.如果数据经常改,就要经常翻开对应的代码进行修改,造成代码扩展性低.因此,可以考虑将经常变的数据放在文件中进行存储,程序启动后从文件中读取最新的数据.如 ...
- iOS - AutoLayout
前言 NS_CLASS_AVAILABLE_IOS(6_0) @interface NSLayoutConstraint : NSObject @available(iOS 6.0, *) publi ...
- [转载] 如何使用Lex/YACC
原文: http://segmentfault.com/a/1190000000396608?hmsr=toutiao.io&utm_medium=toutiao.io&utm_sou ...
- python接口的调用方法
第一个图灵机器人接口实例: #!/usr/bin/env python # -*- coding: utf_8 -*- import urllib2,urllib import json import ...
- 无限极分类,传递一个父ID,返回所有子集
方法: static public function getChildren($data,$pid){ $arr=array(); foreach ($data as $v) { if ($v['pi ...
- Android网络编程系列 一 TCP/IP协议族之传输层
这篇借鉴的文章主要是用于后续文章知识点的扩散,在此特作备份和扩散学习交流. 传输层中有TCP协议与UDP协议. 1.UDP介绍 UDP是传输层协议,和TCP协议处于一个分层中,但是与TCP协议不同,U ...