JAVA中I/O流
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():创建一个目录;列出目录下所有的文件
几个例子说明:

import java.io.*;
class FileTest{
public static void main(String[] str){
File f = new File("E:\\Workspace\\aaa.txt");
//判断是否存在该文件
if (!f.exists()){
System.out.println("file is not exist");
try {
f.createNewFile();//不存在就创建新的文件
} catch (IOException e) {
e.printStackTrace();
}
} File f1 = new File("E:\\Workspace\\aaa1\\sdfsdf\\asdf");
if (f1.mkdir()){ //创建目录
System.out.println("yes");
}
else{
System.out.println("errors ");
}
}
}


import java.io.*; //浏览当前目录下的所有文件和目录
class FileDirectory{
public static void main( String[] args ) {
try {
File f1 = new File("");
String ss = f1.getAbsolutePath();
System.out.println("ss= " + ss);
File f = new File(ss); if( f.isDirectory() ) {
//获取目录下所有的文件列表
File[] files = f.listFiles();
for( int i=0; i<files.length; i++ ) {
if( files[ i ].isDirectory() ) {
System.out.println( "<dir> " + files[ i ].getName() );
}
else {
System.out.println( files[ i ].getName() );
}
}
}
}
catch( Exception e ) {
e.printStackTrace();
}
}
}


import java.io.*; class SuperTest{
public static void main(String args[]) {
File dir = new File("E:\\Workspace\\Java\\test20111108"); // 用File 对象表示一个目录
Filter filter = new Filter("txt"); // 生成一个名为java的过滤器
System.out.println("list java files in directory " + dir); String[] files = dir.list(filter); // 列出目录dir下,文件后缀名为txt的所有文件 for (int i = 0; i < files.length; i++) {
File f = new File(dir, files[i]); // 为目录dir 下的文件或目录创建一个File 对象
if (f.isFile()) // 如果该对象为后缀为java的文件,则打印文件名
System.out.println("file: " + f);
else
System.out.println("sub directory " + f); // 如果是目录则打印目录名
}
}
} class Filter implements FilenameFilter {
String extent;
Filter(String extent) {
this.extent = extent;
} public boolean accept(File dir, String name) {
return name.endsWith("." + extent); //返回文件的后缀名
}
}

字节文件流:FileInputStream和FileOutputStream

import java.io.*; /**
*把一个文件的所有内容写到另外一个文件中
*/
class FileStreamTest{
public static void main(String args[]) {
try {
File inFile=new File("test1.txt");
File outFile=new File("test2.txt");
FileInputStream fis=new FileInputStream(inFile);
FileOutputStream fos=new FileOutputStream(outFile); int c;
while((c=fis.read())!=-1) //读取一个字节
{
fos.write(c);
} fis.close();
fos.close();
}catch(FileNotFoundException e) {
System.out.println("FileStreamsTest: "+e);
}catch(IOException e) {
System.err.println("FileStreamsTest: "+e);
}
}
}


import java.io.*; class CopyFileTest{
public static void main(String args[]) {
CopyFileTest cf = new CopyFileTest ();
cf.copyFile("test1.txt","test3.txt");
} public boolean copyFile(String src,String des){
File srcFile,desFile;
srcFile = new File(src);
desFile = new File(des);
FileInputStream fis = null;
FileOutputStream fos = null; try{
desFile.createNewFile();
fis = new FileInputStream(srcFile);
fos = new FileOutputStream(desFile);//覆盖
// fos = new FileOutputStream(desFile,true);//追加 int bytesRead;
byte[] buf = new byte[4 * 1024]; // 4K buffer
while((bytesRead=fis.read(buf))!=-1){
fos.write(buf,0,bytesRead);
}
fos.flush();
fos.close();
fis.close();
}catch(IOException e){
System.out.println(e);
return false;
}
return true;
}
}

如果只是在尾部追加,而不是覆盖需要调用FileOutputStream(“file”,true)就Ok了,对于字符流文件就是FileWriter(“file”,true)就OK乐。
父类过滤流: FilterInputStream(InputStream in); FilterOutputStream(OutputStream out);
过滤流—缓冲流
类BufferedInputStream和BufferedOutputStream继承FilterInputStream和FilterOutputStream,实现了带缓冲的过滤流,它提供了缓冲机制,把任意的I/O流“捆绑”到缓冲流上,可以提高该I/O流的读取效率,在初始化时,除了要指定所连接的I/O流之外,还可以指定缓冲区的大小。 在读写的同时对数据缓存,这样避免每次读写数据都要进行实际的物理读写操作,在用BufferdOutputStream输出时,数据先输入缓冲区,当缓冲区满的时再写入连接的输出流,可以调用flush()来清空缓冲区。

import java.io.*; class SuperTest{
public static void main(String args[]) {
try {
File inFile = new File("test1.txt");
File outFile = new File("test4.txt"); BufferedInputStream bufFis=new BufferedInputStream(new FileInputStream(inFile),256);
BufferedOutputStream bufFos=new BufferedOutputStream(new FileOutputStream(outFile),256); int len;
byte bArray[]=new byte[256]; do{
System.out.println("while");
len = bufFis.read(bArray);
bufFos.write(bArray,0,len);
System.out.println("len: " +len);
}while (len==256); bufFis.close();
bufFos.close();
} catch (FileNotFoundException e) {
System.out.println("FileStreamsTest: " + e);
} catch (IOException e) {
System.err.println("FileStreamsTest: " + e);
}
}
}

过滤流—数据流
DataInputStream和DataOutputStream, 继承FilterInputStream和FilterOutputStream,可以用来与计算机无关的格式读写JAVA的基本数据类型以及String对象。 readBoolean() 读一字节,非零为真 readByte() 以8位读字节 readChar() 读Unicode字符 readInt() 读整数值 writeChar(int v) 把字符写进输出流 writeLong(long v) 把长整写进输出流 writeInt(int v) 把整数写进输出流
数据输出流可以是一个已经建立好的输入数据流对象,例如网络的连结,文件等。数据流可通过如下方式建立。
FileInputStream fis = new FileInputStream("file1.txt");
FileOutputStream fos = new FileOutputStream("file2.txt");
DataInputStream dis = new DataInputStream(fis);
DataOutputStream dos = new DataOutputStream(fos);

import java.io.*; class DataStreamIOTest{
public static void main(String args[]) throws IOException
{
FileOutputStream fos = new FileOutputStream("a.txt");
DataOutputStream dos = new DataOutputStream(fos);
try {
dos.writeBoolean(true);
dos.writeByte((byte) 123);
dos.writeChar('J');
dos.writeDouble(3.141592654);
dos.writeFloat(2.7182f);
dos.writeInt(1234567890);
dos.writeLong(998877665544332211L);
dos.writeShort((short) 11223);
} finally {
dos.close();
} FileInputStream fis = new FileInputStream("a.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();
}
}
}//需要注意的是必须throws IOException才可以编译通过。

字符流

例子:利用FileWriter来写文件
try
{
FileWriter fw = new FileWriter("mydata.txt");
PrintWriter out = new PrintWriter(fw);
out.print("面朝大海,");
out.println("春暖花开!");
out.println("环境美好!!");
out.close();
fw.close();
}catch(IOException e)
{
e.printStackTrace();
}


例子:字符缓冲流BufferedReader
import java.io.*;
class SuperTest{
public static void main(String args[]) throws IOException
{
File file = new File("mydata.txt"); try {
BufferedReader in = new BufferedReader(new FileReader(file));
String s;
s = in.readLine();
while ( s != null ) {
System.out.println("Read: " + s);
s = in.readLine();
}
in.close();
} catch (FileNotFoundException e1) {
System.err.println("File not found: " + file);
} catch (IOException e2) {
e2.printStackTrace();
}
}
}


例子:拷贝(FileReader和FileWriter)
try {
FileReader input = new FileReader(args[0]);
FileWriter output = new FileWriter(args[1]); char[] buffer = new char[128];
int charsRead;
charsRead = input.read(buffer); while ( charsRead != -1 )
{
output.write(buffer, 0, charsRead);
charsRead = input.read(buffer);
} input.close();
output.close();
} catch (IOException e)
{
e.printStackTrace();
}
}


例子:拷贝(BufferedWriter)
try {
FileReader input = new FileReader(args[0]);
BufferedReader bufInput = new BufferedReader(input);
FileWriter output = new FileWriter(args[1]);
BufferedWriter bufOutput = new BufferedWriter(output);
String line; line = bufInput.readLine();
while ( line != null )
{
bufOutput.write(line, 0, line.length());
bufOutput.newLine();
line = bufInput.readLine();
} bufInput.close();
bufOutput.close();
}
catch (IOException e)
{
e.printStackTrace();
}

随机存取文件流--RandomAccessFile 1 RandomAccessFile是一种特殊的文件流,可以用它在文件的任何地方查找或者插入数据 2 RandomAccessFile同时实现了DataInput和DataOutput接口,所以可以用它来读/写文件 3构造器: RandomAccessFile(java.io.File f,String mode) RandomAccessFile(String file,String mode) 4 mode可以为”r”或”rw”
方法: 1 readXXX()或writeXXX(): 如ReadInt(), ReadLine(), WriteChar(), WriteDouble()等 2 int skipBytes(int n):将指针向下移动若干字节 3 length():返回文件长度 4 long getFilePointer():返回指针当前位置 5 void seek(long pos):将指针调到所需位置

import java.io.*;
import java.util.*; class RandomAccessFileTest{
public static void main(String args[])
{
try{
File logfile=new File("mydata.txt"); if(logfile.exists())
{
RandomAccessFile raf=new RandomAccessFile(logfile,"rw");
System.out.println("leghth = " + raf.length());
raf.seek(raf.length()); for(int i=0;i<5;i++)
{
raf.writeBytes("Write "+new Date()+ "\r\n");
} raf.seek(0);
String x=raf.readLine(); while(x!=null)
{
System.out.println(x);
x=raf.readLine();
} raf.close();
}
}catch(IOException e){
e.printStackTrace();
}
}
}

JAVA流总结:
1 在Java中有数据传输的地方都用到I/O流(通常是文件,网络,内存和标准输入输出等)。
2 InputStream 和OutputStream是所有字节流的祖先(只有RandomAccessFile类是一个例外),read和write是它们最基本的方法,读写单位是字节
3 Reader 和Writer是所有字符流的祖先,read和write是它们最基本的方法,读写单位是字符。
4 在众多的流对象中,并不是每一种都单独使用,其中过滤流的子类在数据送出去之前做必要的处理
5 File, File(Input/Output)Stream, RandomAccessFile是处理本地文件的类。
6 Data(Input/Output)Stream是一个过滤流的子类,借此可以读写各种基本数据,在文件和网络中经常使用。如: readByte, writeBoolean等。
7 Buffered(Input/Output)Stream的作用是在数据送到目的之前先缓存,达到一定数量时再送到目的,已减少阻塞次。
8 Piped(Input/Output)Stream适合与一个处理的输出作为另一个处理的输入的情况
JAVA中I/O流的更多相关文章
- java中的IO流
Java中的IO流 在之前的时候我已经接触过C#中的IO流,也就是说集中数据固化的方式之一,那么我们今天来说一下java中的IO流. 首先,我们学习IO流就是要对文件或目录进行一系列的操作,那么怎样操 ...
- java中的缓冲流BufferedWriter和BufferedReader
java中的缓冲流有BufferedWriter和BufferedReader 在java api 手册中这样说缓冲流: 从字符输入流中读取文本,缓冲各个字符,从而实现字符.数组和行的高效读取.可以指 ...
- java 中 “文件” 和 “流” 的简单分析
java 中 FIle 和 流的简单分析 File类 简单File 常用方法 创建一个File 对象,检验文件是否存在,若不存在就创建,然后对File的类的这部分操作进行演示,如文件的名称.大小等 / ...
- Java中的IO流总结
Java中的IO流总结 1. 流的继承关系,以及字节流和字符流. 2. 节点流FileOutputStream和FileInputStream和处理流BufferedInputStream和Buffe ...
- Java中的IO流大体介绍
由于Java中的IO流是在是知识点繁多,所以我大约花了1周的时间将其整理起来.但是整理起来后并不是将完事了,我还是要分字节流和字符流来讲述.然后字节流和字符流中还有是否带有缓冲流. 讲述完IO流后我将 ...
- Java中的IO流,Input和Output的用法,字节流和字符流的区别
Java中的IO流:就是内存与设备之间的输入和输出操作就成为IO操作,也就是IO流.内存中的数据持久化到设备上-------->输出(Output).把 硬盘上的数据读取到内存中,这种操作 成为 ...
- Java中的IO流(五)
上一篇<Java中的IO流(四)>记录了一下Properties类,此类不属于IO流,它属于集合框架.接下来说一下IO流中的其它流 一,打印流PrintStream PrintStream ...
- Java中的IO流(六)
上一篇<Java中的IO流(五)>把流中的打印流PrintStream,PrintWriter,序列流SequenceInputStream以及结合之前所记录的知识点完成了文件的切割与文件 ...
- JAVA 中的IO流
Java中的IO流是用来处理设备与设备之前的数据传输,在java中以流的形式传输.流分为两类:字节流和字符流. 字节流:InputStream,OutPutSteam.(计算机内的数据都是以字节存储的 ...
- Java中的IO流(四)
上一篇<Java中的IO流(三)>把IO流中的文件及目录操作的对象File类记录了一下,本篇把本不属性IO流但又和IO流有关系的一个对象作一下记录,此对象本属于集合框架里的一个子集,即Pr ...
随机推荐
- 01 HTML基础
HTML就是超文本标记语言的简写,是最基础的网页语言. 通过标签定义的语言,代码都是由标签所组成的.(最重要的标签是定义标题.段落和换行的标签) 不区分大小写 head部分是给html页面增加一些辅助 ...
- 20145223 《Java程序程序设计》实验报告4
20145223杨梦云Java实验四<Andoid开发基础> 实验内容 安装Android Studio 运行安卓AVD模拟器 使用Android运行出模拟手机并显示自己的学号 实验步骤 ...
- android studio手动加入jar包
点击启动AndroidStudio,启动后的界面如图所示. 复制你需要添加的jar,并将其黏贴到app— —src— —main— —libs文件夹下,可运行的AndroidStudio项目都有像这样 ...
- MapReduce 作业调试
1. 最经典的方法通过打印语句来调试程序 System.err.println("Bad Data"+value.toString()); 这些输出错误都会记录到一个标准错误中,可 ...
- 快学Java NIO 续篇
可以先看Java NIO的整体介绍,这篇接着说以下内容,<快学Java NIO>续篇 FileChannel SocketChannel ServerSocketChannel Java ...
- three.js光源
在Threejs中,光源用Light表示,它是所有光源的基类.它的构造函数是: THREE.Light ( hex ) 它有一个参数hex,接受一个16进制的颜色值.例如要定义一种红色的光源,我们可以 ...
- UVALive6900 Road Repair(树的点分治)
题目大概说一棵树,树边有费用和收益两个属性,求一条收益和最大的路径满足费用和不超过C. 树上任意两点的路径都可以看成是过某一个子树根的路径,显然树分治. 治的时候要解决的一个问题是,找到费用小于等于某 ...
- 【BZOJ3450】Tyvj1952 Easy 期望DP
[BZOJ3450]Tyvj1952 Easy Description 某一天WJMZBMR在打osu~~~但是他太弱逼了,有些地方完全靠运气:(我们来简化一下这个游戏的规则有n次点击要做,成功了就是 ...
- Android NumberPicker 修改分割线颜色和高度及字体颜色大小
(1)重写NumberPicker已达到修改显示字体颜色大小 public class TextColorNumberPicker extends NumberPicker { public Text ...
- Android GPS 取经纬度
// 获取位置管理服务 private LocationManager locationManager;3 String mProviderName = ""; private v ...