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. Android设计模式系列-组合模式

    Android中对组合模式的应用,可谓是泛滥成粥,随处可见,那就是View和ViewGroup类的使用.在android UI设计,几乎所有的widget和布局类都依靠这两个类.组合模式,Compos ...

  2. Redis实战之Redis + Jedis

    用Memcached,对于缓存对象大小有要求,单个对象不得大于1MB,且不支持复杂的数据类型,譬如SET 等.基于这些限制,有必要考虑Redis! 相关链接: Redis实战 Redis实战之Redi ...

  3. UIAlertViewController+TextField 输入框

    if (IOS8) { UIAlertController *alertController=[UIAlertController alertControllerWithTitle:CustomLoc ...

  4. [Arduino+Android] 自制土砲智能安全帽

    专案动机(1/2) .现今社会中,各种交通运输载具方便了人类的生活,缩小了地域的差异性,当中车辆是人们日常生活中最频繁接触到的一部分. .车辆使人们的行动更加便利,也因此道路上行驶的车辆越来越多. . ...

  5. 一个方便的shell命令,查看软件安装目录

    查看软件安装路径:whereis phpfind / -name nginx.configfind 查找 / 从根目录 -name 文件查找

  6. ZOJ 3829 Known Notation 贪心

    Known Notation Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://acm.zju.edu.cn/onlinejudge/showPro ...

  7. C# 网络编程之豆瓣OAuth2.0认证具体解释和遇到的各种问题及解决

            近期在帮人弄一个豆瓣API应用,在豆瓣的OAuth2.0认证过程中遇到了各种问题,同一时候自己须要一个个的尝试与解决,终于完毕了豆瓣API的訪问.作者这里就不再吐槽豆瓣的认证文档了,毕 ...

  8. ME21N/ME22N/ME23N屏幕增强BADI ME_GUI_PO_CUST

    最近想更深入学习下classic BADI, 以前没玩过BADI屏幕增强, 所以决定玩一下. 这次的屏幕增强主要用到两个BADI: ME_GUI_PO_CUST和ME_PROCESS_PO_CUST ...

  9. 应聘.net开发工程师常见的面试题(四)

    1.在Asp.net中所有的自定义用户控件都必须继承自________? 答:Control. 2.在.Net中所有可序列化的类都被标记为_____? 答:[serializable] 3.在.Net ...

  10. php中global和$GLOBALS[]的分析之一

    PHP 的全局变量和 C 语言有一点点不同,在 C 语言中,全局变量在函数中自动生效,除非被局部变量覆盖       这可能引起一些问题,有些人可能漫不经心的改变一个全局变量.PHP 中全局变量在函数 ...