1.什么是数据流?

数据流是指所有的数据通信通道。有两类流,InputStream and OutputStream,Java中每一种流的基本功能依赖于它们。InputStream用于read,OutputStream用于write,读 和写都是相对于内存说的,读就是从其他地方把数据拿进内存,写就是把数据从内存推出去。这两个都是抽象类,不能直接使用。

2.InputStream的方法有:

read()从流中读入数据有3种方式:

◆int read() 一次读一个字节

◆int read(byte[]) 读多个字节到数组中

◆int read(byte[],int off,int len) 指定从数组的哪里开始,读多长

◆skip() 跳过流中若干字节

◆available() 返回流中可用字节数,但基于网络时无效,返回0

◆markSupported() 判断是否支持标记与复位操作

◆mark() 在流中标记一个位置,要与markSupported()连用

◆reset() 返回标记过的位置

◆close() 关闭流

3.OutputStream的方法:

◆write(int)写一个字节到流中

◆write(byte[])将数组中的内容写到流中

◆write(byte[],int off,int len)将数组中从off指定的位置开始len长度的数据写到流中

◆close()关闭流

◆flush()将缓冲区中的数据强制输出

4.File类

File可以表示文件也可以表示目录,File类控制所有硬盘操作。

构造器:

◆File(File parent,String child) 用父类和文件名构造

◆File(String pathname) 用绝对路径构造

◆File(String parent,String child) 用父目录和文件名构造

◆File(URI uri) 用远程文件构造

常用方法:

boolean createNewFile();

boolean exists();

例子:

//建立 test.txt 文件对象,判断是否存在,不存在就创建

import java.io.*;

public class CreateNewFile

{

public static void main(String args[])

{

File f=new File("test.txt");

try

{

if(!f.exists())

{

f.createNewFile();

}

else

{

System.out.println("exists");

}

}

catch(Exception e)

{

e.printStackTrace();

}

}

}

boolean mkdir()/mkdirs()

boolean renameTo(File destination)

例子:

//看一下这 mkdir()/mkdirs() 的区别和 renameTo 的用法

import java.io.*;

public class CreateDir

{

public static void main(String args[])

{

File f=new File("test.txt");

File f1=new File("Dir");

File f2=new File("Top/Bottom");

File f3=new File("newTest.txt");

try

{

f.renameTo(f3);

f1.mkdir();

f2.mkdirs();

}

catch(Exception e)

{

e.printStackTrace();

}

}

}

String getPath()/getAbsolutePath()

String getParent()/getName()

例子:

//硬盘上并没有parent 目录和 test.txt 文件,但我们仍然可以操作,因为我们创建了他们的对象,是对对象进行操作

import java.io.*;

public class Test

{

public static void main(String args[])

{

File f=new File("parent/test.txt");

File f1=new File("newTest.txt");

try

{

System.out.println(f.getParent());

System.out.println(f.getName());

System.out.println(f1.getPath());

System.out.println(f1.getAbsolutePath());

}

catch(Exception e)

{

e.printStackTrace();

}

}

}

String list[] //显示目录下所有文件

long lastModified() //返回 1970.1.1 到最后修改时间的秒数

boolean isDirectory()

例子:

//列出目录下的所有文件和目录,最后修改时间,是目录的后面标出

import java.io.*;

import java.util.*;

public class Dir

{

public static void main(String args[])

{

File f=new File("Dir");

String[] listAll=null;

File temp=null;

try

{

listAll=f.list();

for(int i=0;i

{

temp=new File(listAll);

System.out.print(listAll+"\t");

if(temp.isDirectory())

{

System.out.print("\t

}

else

{

System.out.print(temp.length()+"\t");

}

System.out.println(new Date(temp.lastModified()));

}

}

catch(Exception e)

{

e.printStackTrace();

}

}

}

5.文件流的建立

File f=new File("temp.txt");

FileInputStream in=new FileInputStream(f);

FileOutputStream out=new FileOutputStream(f);

例子:文件拷贝

import java.io.*;

public class Copy

{

public static void main(String args[])

{

FileInputStream fis=null;

FileOutputStream fos=null;

try

{

fis=new FileInputStream("c2.gif");

fos=new FileOutputStream("c2_copy.gif");

int c;

while((c=fis.read()) != -1)

{

fos.write(c);

}

}

catch(Exception e)

{

e.printStackTrace();

}

finally

{

if(fis != null) try{ fis.close(); }catch(Exception e){ e.printStackTrace(); }

if(fos!= null) try{ fos.close(); }catch(Exception e){ e.printStackTrace(); }

}

}

}

6.缓冲区流

BufferedInputStream

BufferedOutputStream

他们是在普通文件流上加了缓冲的功能,所以构造他们时要先构造普通流。

例子:文件拷贝的缓冲改进

import java.io.*;

public class Copy

{

public static void main(String args[])

{

BufferedInputStream bis=null;

BufferedOutputStream bos=null;

byte buf[]=new byte[100];

try

{

bis=new BufferedInputStream(new FileInputStream("persia.mp3"));

bos=new BufferedOutputStream(new FileOutputStream("persia_copy.mp3"));

int len=0;

while( true )

{

len=bis.read(buf);

if(len<=0)

{

break;

}

bos.write(buf,0,len);

}

bos.flush();//缓冲区只有满时才会将数据输出到输出流,用flush()将未满的缓冲区中数据强制输出

}

catch(Exception e)

{

e.printStackTrace();

}

finally

{

if(bis != null) try{ bis.close(); }catch(Exception e){ e.printStackTrace(); }

if(bos!= null) try{ bos.close(); }catch(Exception e){ e.printStackTrace(); }

}

}

}

7.原始型数据流

DataInputStream

DataOutputStream

他们是在普通流上加了读写原始型数据的功能,所以构造他们时要先构造普通流。

方法:

readBoolean()/writeBoolean()

readByte()/writeByte()

readChar()/writeByte()

......

例子:

//这个流比较简单,要注意的就是读时的顺序要和写时的一样

import java.io.*;

public class DataOut{

public static void main(String args[])

{

DataOutputStream dos=null;

try

{

dos=new DataOutputStream(new FileOutputStream("dataout.txt"));

dos.writeInt(1);

dos.writeBoolean(true);

dos.writeLong(100L);

dos.writeChar('a');

}

catch(Exception e)

{

e.printStackTrace();

}

finally

{

if(dos!=null)

{

try

{

dos.close();

}

catch(Exception e)

{

}

}

}

}

}

import java.io.*;

public class DataIn

{

public static void main(String args[])

{

DataInputStream dis=null;

try

{

dis=new DataInputStream(new FileInputStream("dataout.txt"));

System.out.println(dis.readInt());

System.out.println(dis.readBoolean());

System.out.println(dis.readLong());

System.out.println(dis.readChar());

}

catch(Exception e)

{

e.printStackTrace();

}

finally

{

if(dis!=null)

{

try

{

dis.close();

}

catch(Exception e)

{

}

}

}

}

}

8.对象流

串行化:对象通过写出描述自己状态的数值来记述自己的过程叫串行话。

对象流:能够输入输出对象的流。

将串行化的对象通过对象流写入文件或传送到其他地方。

对象流是在普通流上加了传输对象的功能,所以构造对象流时要先构造普通文件流。

注意:只有实现了Serializable接口的类才能被串行化

例子:

import java.io.*;

class Student implements Serializable

{

private String name;

private int age;

public Student(String name,int age)

{

this.name=name;

this.age=age;

}

public void greeting()

{

System.out.println("hello ,my name is "+name);

}

public String toString()

{

return "Student["+name+","+age+"]";

}

}

public class ObjectOutTest

{

public static void main(String args[])

{

ObjectOutputStream oos=null;

try

{

oos=new ObjectOutputStream(

new FileOutputStream("student.txt"));

Student s1=new Student("Jerry",24);

Student s2=new Student("Andy",33);

oos.writeObject(s1);

oos.writeObject(s2);

}

catch(Exception e)

{

e.printStackTrace();

}

finally

{

if(oos!=null)

try

{

oos.close();

}

catch(Exception e)

{

e.printStackTrace();

}

}

}

}

import java.io.*;

public class ObjectInTest

{

public static void main(String args[])

{

ObjectInputStream ois=null;

Student s=null;

try

{

ois=new ObjectInputStream(

new FileInputStream("student.txt"));

System.out.println("--------------------");

s=(Student)ois.readObject();

System.out.println(s);

s.greeting();

System.out.println("--------------------");

s=(Student)ois.readObject();

System.out.println(s);

s.greeting();

}

catch(Exception e)

{

e.printStackTrace();

}

finally

{

if(ois!=null)

{

try

{

ois.close();

}

catch(Exception e)

{

e.printStackTrace();

}

}

}

}

}

9.字符流InputStreamReader/OutputStreamWriter

上面的几种流的单位是byte,所以叫做字节流,写入文件的都是二进制字节,我们无法直接看,下面要学习的是字节流。

Java采用Unicode字符集,每个字符和汉字都采用2个字节进行编码,ASCII码是Unicode编码的自集InputStreamReader是字节流到字符桥的桥梁(byte->char读取字节然后用特定字符集编码成字符)。

OutputStreamWriter是字符流到字节流的桥梁(char->byte)。

他们是在字节流的基础上加了桥梁作用,所以构造他们时要先构造普通文件流。

我们常用的是:

BufferedReader方法:readLine()

PrintWriter方法:println()

例子:

import java.io.*;

public class PrintWriterTest

{

public static void main(String args[])

{

PrintWriter pw=null;

try

{

pw=new PrintWriter(

new OutputStreamWriter(

new FileOutputStream("bufferedwriter.txt")));

pw.println("hello world");

}

catch(Exception e)

{

e.printStackTrace();

}

finally

{

if(pw!=null)

{

try

{

pw.close();

}

catch(Exception e)

{

e.printStackTrace();

}

}

}

}

}

import java.io.*;

public class BufferedReaderTest

{

public static void main(String args[])

{

BufferedReader br=null;

try

{

br=new BufferedReader(

new InputStreamReader(

new FileInputStream("bufferedwriter.txt")));

System.out.println(br.readLine());

}

catch(Exception e)

{

e.printStackTrace();

}

finally

{

if(br!=null)

{

try

{

br.close();

}

catch(Exception e)

{

e.printStackTrace();

}

}

}

}

}

10.随机存取文件RandomAccessFile

可同时完成读写操作

支持随机文件操作的方法:

readXXX()/writeXXX()

seek()将指针调到所需位置

getFilePointer()返回指针当前位置

length()返回文件长度

例子:

把若干个32位的整数写到一个名为“temp.txt”的文件中,然后利用seek方法,以相反的顺序再读取这些数据。

import java.io.*;

public class RandomFile

{

public static void main(String args[])

{

RandomAccessFile raf=null;

int data[]={12,31,56,23,27,1,43,65,4,99};

try

{

raf=new RandomAccessFile("temp.txt","rw");

for(int i=0;i

raf.writeInt(data);

for(int i=data.length-1;i>=0;i--)

{

raf.seek(i*4);

System.out.println(raf.readInt());

}

}

catch(Exception e)

{

e.getMessage();

}

finally

{

if(raf!=null)

{

try

{

raf.close();

}

catch(Exception e)

{

e.getMessage();

}

}

}

}

}

11.小结

这部分的难点就是类比较复杂,尤其是每个类的构造方式,我认为记住下面这个图比记类的继承关系更好些。

a.字节流:

InputStream

|-- FileInputStream (基本文件流)

|-- BufferedInputStream

|-- DataInputStream

|-- ObjectInputStream

OutputStream 同上图

BufferedInputStream DataInputStream ObjectInputStream只是在FileInputStream上增添了相应的功能,构造时先构造FileInputStream。

b.字符流:

Reader

|-- InputStreamReader (byte->char 桥梁)

|-- BufferedReader (常用)

Writer

|-- OutputStreamWriter (char->byte 桥梁)

|-- BufferedWriter

|-- PrintWriter (常用)

c. 随机存取文件RandomAccessFile

java文件与流_Java文件和流深入相关推荐

  1. java文件与流_Java文件与流

    文件 文件管理通过java.io包下.file类 作用: 1.文件属性 2.文件检查 3.文件删除 4.不包含对其文件内容的处理 File类的构造 语法: File f =new File(Strin ...

  2. java 文件io 实验_java I/O流实验小结

    最近老师给我们留了一个JAVA小实验,让键盘输入一些字符,然后写到一个自己建的文件里面,并且在显示器上显示文件里面的数据,要求在一个类里面实现. 在做实验的过程中有一些思想我觉得很有用,为了避免以后碰 ...

  3. java i o中文版_Java文件I/O的三种方法

    摘要:之前在面试中被问到过两次Java中文件读入输出怎么写,当时只记得一个大概,没有办法很清晰的说出一个条理,今天特地看出总结了一下这方面的内容,想要写出来给大家分享.首先文件读入输出流常用有三种:F ...

  4. java 中的流_Java中的流(IO

    Java中的流(IO流. java.io包中定义了多个流类型(类或抽象类)来实现 输入 / 输出功能,可以从不同的角度对其进行分类: 按单位可分为: 字节流         (一个字节一个字节的读取) ...

  5. java i o是什么流_Java I/O 流,输入流、输出流

    Java中的流,可以从不同的角度进行分类. 按照数据流的方向不同可以分为:输入流和输出流. 按照处理数据单位不同可以分为:字节流和字符流. 按照实现功能不同可以分为:节点流和处理流. 输出流: 输入流 ...

  6. java集合输入存储_Java练习IO流使用Properties集合存储数据并...

    案例: package IO; import java.io.FileWriter; import java.io.IOException; import java.util.Properties; ...

  7. java 分块上传_Java 文件分块上传客户端和服务器端源代码

    本博客介绍如何进行文件的分块上传.本文侧重介绍客户端,服务器端请参考博客<Java 文件分块上传服务器端源代码>.建议读者朋友在阅读本文代码前先了解一下 MIME 协议. 所谓分块上传并非 ...

  8. java 处理换行符_Java 文件换行符识别与转换

    项目经验,如需转载,请注明作者:Yuloran (t.cn/EGU6c76) 背景 项目开发需要手动合入几十种语言的翻译到 string.xml 中,这是一件非常痛苦的事情:Copy.Paste,Co ...

  9. java文件上传_Java文件上传细讲

    什么是文件上传? 文件上传就是把用户的信息保存起来. 为什么需要文件上传? 在用户注册的时候,可能需要用户提交照片.那么这张照片就应该要进行保存. 上传组件(工具) 为什么我们要使用上传工具? 为啥我 ...

最新文章

  1. nivicat复制mysql数据库[Err] [Dtf] 1273 - Unknown collation: 'utf8mb4_0900_ai_ci'错误
  2. Android开发中常见的设计模式
  3. 你真的了解 Cookie 和 Session 吗?
  4. android获取QQ昵称,【Ctrl.js】QQ读取好友昵称和QQ号源码
  5. axure 鼠标样式,Axure8-动态面板+简单鼠标事件实现单页面应用
  6. java基础-BigDecimal类常用方法介绍
  7. 2018年自然语言处理最值得关注的研究、论文和代码
  8. python 移动平均法_移动平均法详解
  9. Fibonacci数列Linux程序,使用fork()调用计算Fibonacci数列
  10. SQL每日一题 牛客17 10月的新客户单价和获客成本
  11. 自旋玻璃(spin glass)、自旋冰(spin ice)和量子自旋液体(quantum spin liquid)(之二)
  12. 【转】大学四年因为知道了这32个网站,我成了别人眼中的大神!
  13. 工业工程跨考计算机难吗,工业工程硕士跨考 难度大不大?
  14. c语言程序中*p代表什么,C语言声明指针的时候int*p到底是什么意思? 爱问知识人...
  15. 华三H3C设备 公司网络外网变慢分析
  16. Spring AOP中定义切点PointCut详解
  17. android 音标乱码的一些问题
  18. Matlab 图片颜色反转 批量
  19. Java内部类(匿名内部类)
  20. 3.发那科工业机器人程序介绍

热门文章

  1. 醒醒!Python已经支持中文变量名啦!
  2. 维度爆炸?Python实现数据压缩竟如此简单!
  3. 你还在用Python做数据分析么?
  4. html5 实现坦克大战,HTML5实现坦克大战(一)
  5. 计算机网络技术发源于什么,计算机网络基础试题和答案
  6. linux suse 安装redis,在openSuse linux上Redis安装简单步骤
  7. python315题的漫漫通关之路
  8. 【绝迹篇】C#RSA算法实现
  9. laravel5.5事件系统
  10. java中单例的几种写法