Java中的IO流

在之前的时候我已经接触过C#中的IO流,也就是说集中数据固化的方式之一,那么我们今天来说一下java中的IO流。

首先,我们学习IO流就是要对文件或目录进行一系列的操作,那么怎样操作文件或目录呢?这就用到了File类,一个强大的对象,它既可表示文件,又可以表示目录。在程序中,利用File可以对文件进行基本的操作,比如说查看文件名称,文件大小等等。

创建一个File对象的句法如下:

File file = new File(String path);

在该类创建的时候,通过构造函数传递path,path表示所指向的文件路径名。例如,"File file = new File("C:\\Hello.txt");"就创建了一个指向C盘根目录下名为Hello的txt文件的对象。注意,在windows操作系统中,路径名中的分隔符可以用"/",或者用"\",但是必须要写成"\\"其中第一个代表转义字符。File对象是java.io包中引用磁盘文件的唯一对象,File类仅仅是描述File对象的属性,而并未说明数据是如何存储的。File类提供了一些重要的方法来管理文件或目录的属性,下面来个大家一一列举:

我只是列举出一些File类的常用方法,他还有很多其他的方法,在需要用到的时候大家可以自行查看API,好了,废话不多少直接上代码,看看File类是如何获取文件属性的:

public static void main(String[] args) {
File file = new File("D:\\Hello.txt");
if(file.exists()){
System.out.println("文件的名称:"+file.getName());
System.out.println("文件的相对路径:"+file.getPath());
System.out.println("文件的绝对路径:"+file.getAbsolutePath());
System.out.println("文件的大小:"+file.length());
if(!file.delete()){
System.out.println("删除失败");
return;
}
System.out.println("删除成功");
}else{
System.out.println("文件不存在");
}
}

这样我们就进行了一系列简单的File类的操作,在这里要提一下,可能有很多初学IO流的人还不是很明白相对路径与绝对路径的区别,可是我们要通过文件流老操作文件就要清楚的知道文件的位置,也就是要清楚的给出路径来让程序找到他,那么什么是相对路径与绝对路径呢?现在我们先来看一下绝对路径,绝对路径就是你当前计算机下文件所在的位置,也就是我们通常在浏览文件的时候上方地址栏上给出的路径就是绝对路径,也就是不伦你做什么程序,是找文件也好是导图片也要,只要你写的是绝对路径,并且是在你的本机上操作那就是绝对没有问题的,可是这样我们也看出了他的缺点,我们写出来的程序都是要给别人用的,要在很多电脑上显示,这样你再用绝对路径的话就会出现找不到该文件或者我们常说的图裂了,那么这时候就要用到相对路径了,相对路径就是相对于你自身这个程序或者执行程序的文件的路径,简单说也就是你的代码写在哪个文件里就相对于哪个文件,这样不管我们的放在什么地方,只要他的相对位置没有变就不会出错。另外,我们用"../"来表示上一层目录,"../../"来表示山商城目录,以此类推。

我们简单的说了一下文件的查看,下面我们来看看文件或目录的创建等一系列操作:

    public static void main(String[] args) {
//通过刚刚的演示,我们已经删除了该文件
File file = new File("D:\\Hello.txt");
try {
if(file.createNewFile()){
System.out.println("文件创建成功");
}
} catch (IOException e) {
e.printStackTrace();
}
File directory = new File("D:\\通过file创建");
if(directory.mkdirs()){
System.out.println("目录创建成功");
}
}

通过两段简单的代码我们学习了java中对文件的基本操作,下面我们来进行今天的重点,IO流那么流是什么呢?我们来看一下官方对于流的定义:流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象。即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输特性将流抽象为各种类,方便更直观的进行数据操作。而在java中,我们处理数据的类型不同又分为字符流和字节流,数据的流向不同我们又分为了输出流和输入流。

了解了一下流的定义,我们直接来看代码,下面这段代码是一段输入流,也就是通过FileInputStream来读取文件中的数据:

public static void main(String[] args) {
//在使用inputStream的时候很多地方都要抛出异常,所以我们在外部定义
//一个为空的流,方便使用
InputStream input = null;
try {
input = new FileInputStream("D:\\Hello.txt");
int data = 0;
byte[] b = new byte[input.available()];
for (int i = 0; (data = input.read()) != -1; i++) {
b[i] = (byte) data;
}
String name = new String(b);
System.out.println(name);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
input.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

因为inputStream的read方法返回值是int类型,所以我们循环每次读到的数据都是int类型,因为编码方式原因,如果我们文件里的数据汉字汉字的话,我们通过(char)int强制转换就会出现乱码,所以要先将数据保存在byte数组里,再通过new String(byte[])来进行转换。

通过代码我们可以看出inputStream读取文件的核心方法就是read()方法,那么同样的OutputStream的写入文件方法就是write():

    public static void main(String[] args) {
// 代码中没有太大的改动,在存入文件时同样是存入byte数组
OutputStream output = null;
try {
output = new FileOutputStream("D:\\Hello.txt");
String str = "好好学习天天向上";
byte[] b = str.getBytes();
output.write(b);
System.out.println("数据写入成功");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
try {
output.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}

这样就完成了文件读写,还有一种便是带缓冲区的方法,通过BufferedReader和BufferedWriter来读写文件,这种方法可以先把一批数据放到缓冲区,接下来的操作都是通过缓冲区获得,可以提高操作效率,与上面方法没有太大的改动,就不一一列举。还要提一下的就是二进制文件的读写,我们知道在计算机中所有的东西都是二进制的存在形式,也就是说这种二进制的读写基本可以读写全部文件,图片或电影,下面我们就来写一个复制图片的例子来给大家一个直观的感受:

    public static void main(String[] args) {
DataOutputStream dos = null;
DataInputStream dis = null;
try {
//创建输入流
InputStream input = new FileInputStream("D:\\cat.jpg");
dis = new DataInputStream(input);
//创建输出流
OutputStream output = new FileOutputStream("D:\\mao.jpg");
dos = new DataOutputStream(output);
int num = 0;
while ((num=dis.read())!=-1) {
dos.write(num);
}
System.out.println("复制成功");
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally{
try {
dos.close();
dis.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} }

这样就完成了图片的复制,java的IO流还有许多nice的方法,望大家多提建议!

java中的IO流的更多相关文章

  1. Java中的IO流总结

    Java中的IO流总结 1. 流的继承关系,以及字节流和字符流. 2. 节点流FileOutputStream和FileInputStream和处理流BufferedInputStream和Buffe ...

  2. Java中的IO流大体介绍

    由于Java中的IO流是在是知识点繁多,所以我大约花了1周的时间将其整理起来.但是整理起来后并不是将完事了,我还是要分字节流和字符流来讲述.然后字节流和字符流中还有是否带有缓冲流. 讲述完IO流后我将 ...

  3. Java中的IO流,Input和Output的用法,字节流和字符流的区别

    Java中的IO流:就是内存与设备之间的输入和输出操作就成为IO操作,也就是IO流.内存中的数据持久化到设备上-------->输出(Output).把 硬盘上的数据读取到内存中,这种操作 成为 ...

  4. Java中的IO流(五)

    上一篇<Java中的IO流(四)>记录了一下Properties类,此类不属于IO流,它属于集合框架.接下来说一下IO流中的其它流 一,打印流PrintStream PrintStream ...

  5. Java中的IO流(六)

    上一篇<Java中的IO流(五)>把流中的打印流PrintStream,PrintWriter,序列流SequenceInputStream以及结合之前所记录的知识点完成了文件的切割与文件 ...

  6. JAVA 中的IO流

    Java中的IO流是用来处理设备与设备之前的数据传输,在java中以流的形式传输.流分为两类:字节流和字符流. 字节流:InputStream,OutPutSteam.(计算机内的数据都是以字节存储的 ...

  7. Java中的IO流(四)

    上一篇<Java中的IO流(三)>把IO流中的文件及目录操作的对象File类记录了一下,本篇把本不属性IO流但又和IO流有关系的一个对象作一下记录,此对象本属于集合框架里的一个子集,即Pr ...

  8. Java中的IO流(三)

    上一篇<Java中的IO流(二)>把学习Java的字符流以及转换流作了一下记录,从本篇开始将把IO流中对文件或文件夹操作的对象File类的学习进行一下记录. 一,File类的构造函数及字段 ...

  9. Java中的IO流(二)

    上一篇<Java中的IO流(一)>把学习IO流的字符流作了一下记录,本篇把字节流记录一下. 一,Java中的字节流 Java中的字节流的操作方式与字符流的操作方式大致相同,连方法名都是类似 ...

随机推荐

  1. webService 接口调用配置

    1.配置XML文件,如果新建一个XML文件需要在applicationContext.xm里面配置一下 <import resource="cxf-client.xml" / ...

  2. hadoop 1.2 集群搭建与环境配置

    一.虚拟机环境 见我的另一篇博客http://www.cnblogs.com/xckk/p/6000881.html, 需要安装JDK环境,centos下安装JDK可参考: http://www.ce ...

  3. Cocos2d-x——CocosBuilder官方帮助文档翻译1 使用自定义类

    原创:请注明转载! 在Cocos2d-x中使用CocosBuilder 使用自定义类 CocosBuilder的使用方法是通过自定义类.在CocosBuilder中选中一个对象并在属性栏中输入自定义类 ...

  4. linux ssh 配置 添加用户 另外一种方法

    [root@localhost ~]# vi /etc/pam.d/sshd #%PAM-1.0auth       required     pam_stack.so service=system- ...

  5. C#-动态生成40个按钮,大小(20,20),要求每行6个放置

    应该为for (int i=0;i<基本数据DataSet3.Tables [0].Rows .Count ;i++)                 {                 int ...

  6. 开源企业IM,免费企业即时通讯软件-ENTBOOST云通讯平台Windows(r174)版本号公布

    经过恩布团队全体成员的不懈努力,依照原定计划,最终在今天(5月14日)公布第二个开源版本号,恩布企业互联IM,ENTBOOST 0.2.0(r174beta)Windows版本号:主要功能支持文本.表 ...

  7. [Node.js] Creating Demo APIs with json-server

    json-server makes it extremely easy to setup robust JSON apis to use for demos and proof of concepts ...

  8. 在Struts2中使用ValueStack、ActionContext、ServletContext、request、session等 .

    笔者不知道该用哪个词来形容ValueStack.ActionContext等可以在Struts2中用来存放数据的类.这些类使用的范围不同,得到的方法也不同,下面就来一一介绍. 声明:本文参考Strut ...

  9. [020]转--C++ swap函数

    原文来自:http://www.cnblogs.com/xloogson/p/3360847.html 1.C++最通用的模板交换函数模式:创建临时对象,调用对象的赋值操作符 template < ...

  10. 信号之abort函数

    abort函数的功能是使异常程序终止. #include <stdlib.h> void abort(void); 此函数不返回 此函数将SIGABRT信号发送给调用进程(进程不应忽略此信 ...