java中的IO流
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流的更多相关文章
- 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 ...
- Java中的IO流(三)
上一篇<Java中的IO流(二)>把学习Java的字符流以及转换流作了一下记录,从本篇开始将把IO流中对文件或文件夹操作的对象File类的学习进行一下记录. 一,File类的构造函数及字段 ...
- Java中的IO流(二)
上一篇<Java中的IO流(一)>把学习IO流的字符流作了一下记录,本篇把字节流记录一下. 一,Java中的字节流 Java中的字节流的操作方式与字符流的操作方式大致相同,连方法名都是类似 ...
随机推荐
- hadoop安装详解
1.hadoop简介 Hadoop是Apache软件基金会旗下的一个开源分布式计算平台.以Hadoop分布式文件系统(HDFS,Hadoop Distributed Filesystem)和MapRe ...
- hdu1754线段树维护区间最大值
#include <iostream> #include <cstdio> using namespace std; #define MAXN 200005 int N,M; ...
- 用Bootstrap 写了个站点
近期发现vdceye的站点有些丑陋,就找了一个bootstrap工具,又一次把站点写了一遍 这个工具果然好用 http://vdceye.com/
- 12.1 文档相关 Webbrowser 该文档已被修改,是否保存修改结果
附件:http://files.cnblogs.com/xe2011/Webbrowser_Document_IsModified.rar 该文档已被修改,是否保存修改结果?是:保存修改结果 ...
- glog摘记
projcet url:https://code.google.com/p/google-glog/ usage: application-level logging setting flags GL ...
- [Bootstap] 9. Dropdown
Dropdown Arrow Class In order to create a down arrow like this: , what class should we apply to the ...
- AIR 程序开发系列 之五 保存数据的几种方式
Local SharedObject 这种方法比较简单方便的保存少的数据到到设备中.你不用自己去管理这些数据,设备会自动管理他. SharedObject 在 flash.net 包中,继承自Even ...
- [012]泛型--lambda表达式捕获
lambda表达式的捕获跟参数差不多,可以是值或者引用. 1.值捕获 与传值参数类似,采用值捕获的前期是变量可以拷贝:与参数不通透的是:被捕获的变量的值是在lambda创建时拷贝,而不是调用时拷贝. ...
- 写JQuery插件的基本知识
普及JQuery知识 知识1:用JQuery写插件时,最核心的方法有如下两个: 复制代码 代码如下: $.extend(object) 可以理解为JQuery 添加一个静态方法. $.fn.exten ...
- swfupload详细参数
SWFUpload的初始化与配置 首先,在页面中引用SWFUpload.js ,如<script type=”text/javascript” src=”http://www.swfupload ...