【转】Java中的IO操作
在使用io操作之前,先看一下java中的文件类File如何使用。File包括文件和目录,对文件和目录的操作是新建目录mkdir,新建文件createNewFile,删除文件和目录delete,以及其他的一些操作。
package zaojiahua; import java.io.File;
import java.io.IOException; /* 对文件类的操作 */
public class Test
{
public static void main(String[] args) throws IOException
{
//新建一个目录
File file = new File("1/2");
//判断目录是否存在
if(!file.exists())
{
//创建多层目录
file.mkdirs();
} //创建文件
File file2 = new File(file,"1.txt");
file2.createNewFile(); //创建文件
File file3 = new File("2.txt");
file3.createNewFile();
//获取文件的绝对路径
System.out.println(file3.getAbsolutePath());
System.out.println(file2.getParent());
//删除目录
file.delete(); File file4 = new File("1/3");
//遍历目录中的文件和目录,是单层遍历
String str[] = file4.list();
for(String s : str)
{
System.out.println(s);
} //列出一个目录下的所有文件
System.out.println("**********************listAll**********************");
listAll(file4);
} static void listAll(File filename)
{
if(filename.isDirectory())
{
File fileDir [] = filename.listFiles();
for(File file : fileDir)
{
if(file.isDirectory())
{
System.out.println("目录:"+file);
listAll(file);
}
else
System.out.println("文件:"+file);
}
}
else
{
System.out.println("文件:"+filename);
}
} }
接下来是java中IO类的操作,IO分类如下图所示,这里只说几个常用的。
首先是FileInputStream和FileOutputStream,这一对流是对文件进行读写的,读写方法是从父类inputStream和OutputStream继承下来的read和write方法。
package com.zaojiahua.iodemo; import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException; public class Test { public static void main(String[] args) throws IOException { File file = new File("file.txt");
//实现数据的拷贝
FileInputStream inputStream = new FileInputStream(file);
FileOutputStream outputStream = new FileOutputStream("1.txt"); // int i;
// while((i = inputStream.read() ) != -1)
// {
// //read的返回值是int,如果遇到了文件尾则返回-1
// outputStream.write(i);
// } //或者使用如下的方法
byte [] buf = new byte[1024];
int len = -1;
while((len = inputStream.read(buf)) != -1)
{
outputStream.write(buf);
} inputStream.close();
outputStream.close();
} }
BufferedInputStream对外提供滑动读取的功能实现,通过预先读入一整段原始输入流数据至缓冲区中,而外界对BufferedInputStream的读取操作实际上是在缓冲区上进行,如果读取的数据超过了缓冲区的范围,那么BufferedInputStream负责重新从原始输入流中载入下一截数据填充缓冲区,然后外界继续通过缓冲区进行数据读取。这样的设计的好处是:避免了大量的磁盘IO,因为原始的InputStream类实现的read是即时读取的,即每一次读取都会是一次磁盘IO操作(哪怕只读取了1个字节的数据),可想而知,如果数据量巨大,这样的磁盘消耗非常可怕。而通过缓冲区的实现,读取可以读取缓冲区中的内容,当读取超过缓冲区的内容后再进行一次磁盘IO,载入一段数据填充缓冲,那么下一次读取一般情况下就直接可以从缓冲区读取,减少了磁盘IO。说白了buffered就是用来缓存的,可以用来提高读取的效率,之所以说FileInputStream是阻塞的方法是因为CUP的速度和磁盘的速度是不匹配的,如果每次要读取的时候都访问磁盘这样就造成了阻塞。通过以上的说明可以看出buffered则并不是阻塞的。所以我们读取文件的时候一般都在文件流上边套上一层buffer流。
package com.zaojiahua.iodemo; import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException; public class Test { public static void main(String[] args) throws IOException { File file = new File("file.txt");
//使用buffer实现数据的拷贝
BufferedInputStream input = new BufferedInputStream(new FileInputStream(file));
BufferedOutputStream output = new BufferedOutputStream(new FileOutputStream("1.txt")); //或者使用如下的方法
byte [] buf = new byte[1024];
int len = -1;
while((len = input.read(buf)) != -1)
{
output.write(buf,0,len);
//将读取到的字节数据转化为字符串打印出来
String str = new String(buf,0,len);
System.out.println(str);
} //关闭流
input.close();
output.close();
} }
数据在硬盘上都是以字节的方式存储的,那么什么时候使用字符流,什么时候使用字节流呢?字符流是对字符操作的,也就是对文本文件或者其他字符文件操作。而对于图片,声音,视频这些文件则用字节流操作。接下来是对字符流的操作,字符流相当于是字节流+编码表。可以向文件中直接写入字符串。读取的时候注意是用字符数组接受,不是字节数组。
package com.zaojiahua.iodemo; import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException; public class Test { public static void main(String[] args) throws IOException { File file = new File("file.txt"); //使用字符流实现文本文件的复制
FileReader reader = new FileReader(file);
FileWriter writer = new FileWriter("2.txt");
int len;
//这里是字符数组,不是字节数组
char [] buf = new char[1024];
while((len = reader.read(buf)) != -1)
{
System.out.println(new String(buf,0,len));
writer.write(buf,0,len);
}
//可以将字符串直接写到文件中
writer.write("\r\n"+"end"); //关闭流
reader.close();
writer.close();
} }
以下是缓冲的字符流。经过缓冲以后可以读取和写入一行的数据。
package com.zaojiahua.iodemo; import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException; public class Test { public static void main(String[] args) throws IOException { File file = new File("file.txt"); //使用字符流实现文本文件的复制
BufferedReader bufferedReader = new BufferedReader(new FileReader(file));
BufferedWriter bufferedWriter = new BufferedWriter(new FileWriter("2.txt")); String buf;
//使用buffer缓冲的时候可以读取和写入一行
while((buf = bufferedReader.readLine()) != null)
{
bufferedWriter.write(buf);
//写入一行
bufferedWriter.newLine();
System.out.println(buf);
} //关闭流
bufferedReader.close();
bufferedWriter.close();
}
}
最后解决的一个问题是字节流和字符流的转化,使用的是InputStreamReader和OutputStreamWriter,它们本身属于的是reader和writer字符流,我们之所以会用到这些转化流是因为系统有时候只给我们提供了字节流,为了方便操作,要用到字符流。比如说System.in标准输入流就是字节流。你想从那里得到用户在键盘上的输入,只能是以转换流将它转换为Reader以方便自己的程序读取输入。再比如说Socket里的getInputStream()很明显只给你提供字节流,你要想读取字符,就得给他套个InputStreamReader()用来读取。
package com.zaojiahua.iodemo; import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter; public class Test { public static void main(String[] args) throws IOException { //字节流和字符流的相互转化
FileInputStream fileInputStream = new FileInputStream("input.txt");
//inputSreamReader本来就是reader对象,创建的时候需要传入一个InputStream对象,将字节流转化为字符流
BufferedReader reader = new BufferedReader(new InputStreamReader(fileInputStream)); //将字符流转化为字节流
OutputStreamWriter outputStreamWriter = new OutputStreamWriter(new FileOutputStream("output.txt"));
BufferedWriter writer = new BufferedWriter(outputStreamWriter); //实现拷贝文件的操作
String buf;
while((buf = reader.readLine()) != null)
{
writer.write(buf);
writer.newLine();
System.out.println(buf);
} //关闭流
reader.close();
writer.close();
}
}
【转】Java中的IO操作的更多相关文章
- Java中的IO操作和缓冲区
目录 Java中的IO操作和缓冲区 一.简述 二.IO流的介绍 什么是流 输入输出流的作用范围 三.Java中的字节流和字符流 字节流 字符流 二者的联系 1.InputStreamReader 2. ...
- java中的IO操作总结
一.InputStream重用技巧(利用ByteArrayOutputStream) 对同一个InputStream对象进行使用多次. 比如,客户端从服务器获取数据 ,利用HttpURLConnect ...
- java中的IO操作
IO流是用来处理设备之间的数据传输,Java对数据的操作是通过流的方式进行,而操作流的对象都封装到java.io包中.根据操作数据的种类可以把IO流分为字节流(InputStream,OutputSt ...
- java学习系列(一)Java中的IO操作
Java的IO流是实现输入/输出的基础,它可以方便地实现数据的输入\输出操作,在Java中把不同的输入\输出源抽象为"流",通过流的方式允许Java程序使用相同的方式来访问不同的输 ...
- 第12讲-Java中的IO操作及对象的序列化与反序列化
1.知识点 1.1.课程回顾 1.2.本章重点 1.2.1 io操作 1.2.2 对象的序列化与反序列化 2.具体内容 2.1.Java IO 2.1.1.什么是IO IO其实就是输入.输出 I ...
- java中的io系统详解 - ilibaba的专栏 - 博客频道 - CSDN.NET
java中的io系统详解 - ilibaba的专栏 - 博客频道 - CSDN.NET 亲,“社区之星”已经一周岁了! 社区福利快来领取免费参加MDCC大会机会哦 Tag功能介绍—我们 ...
- java中的IO流
Java中的IO流 在之前的时候我已经接触过C#中的IO流,也就是说集中数据固化的方式之一,那么我们今天来说一下java中的IO流. 首先,我们学习IO流就是要对文件或目录进行一系列的操作,那么怎样操 ...
- JAVA学习记录(二)————JAVA中的IO
Java中I/O操作主要是指使用Java进行输入,输出操作. Java所有的I/O机制都是基于数据流进行输入输出,这些数据流表示了字符或者字节数据的流动序列. 数据流是一串连续不断的数据的集合,就象水 ...
- JAVA中通过Jedis操作Redis连接与插入简单库
一.简述 JAVA中通过Jedis操作Redis连接与插入简单库 二.依赖 <!-- https://mvnrepository.com/artifact/redis.clients/jedis ...
随机推荐
- 【LeetCode 33】Search in Rotated Sorted Array
Search in Rotated Sorted Array 分段有序的数组,二分查找返回下标,没有返回-1 数组有序之后经过 rotated, 比如:6 1 2 3 4 5 or 5 6 7 8 ...
- ABP Zero最新版源码
获取专业版源码 官网 学习版源码
- 枚举Enum通过int值或文本转为对应的枚举类型
1.数值转枚举 如果枚举类型继承了数值类型,可以直接强制转换 public enum SourceType : byte { YC = , TS = , QK = , ZQ = } //转换方式 ; ...
- AJPFX解析关于编码ansi、GB2312、unicode与utf-8的区别
大家平时遇到乱码问题是否有自己的一套解决方案?这篇文章就是介绍一下常用的编码方式关于编码ansi.GB2312.unicode与utf-8的区别 先做一个小小的试验: 在一个文件夹里,把一个txt文本 ...
- 5 月编程语言排行榜:Java第一,R跌出Top20
我们都知道,最近,TIOBE 发布了 5 月份编程语言排行榜.其中,前三名依然健稳不变,他们分别是 Java.C.C++,第四则为: Python ,第五则为 VB .NET. 下面两张图,我们可以看 ...
- 什么是BDD?
BDD是TDD的一种衍生,通过特定的BDD框架,用自然语言或类自然语言,按照编写用户故事或者用户用例的方式,以功能使用者的视角,描述并编写测试用例. BDD源于TDD并优于测试驱动开发. 之所以说BD ...
- jboss中JVM监控
1)打开 http://server-name-or-ip/jmx-console/HtmlAdaptor2)在 jboss.system 节点找到 type=ServerInfo ,点击进入3)找到 ...
- win7 快捷键 收集
1. 轻松访问键盘快捷方式 按住右 Shift 八秒钟:启用和关闭筛选键 按左 Alt + 左 Shift + PrtScn (或 PrtScn):启用或关闭高对比度 按左 Alt + 左 Shift ...
- mycat+ mysql集群 分库分表
mycat介绍Mycat数据库分库分表中间件国内最活跃的.性能最好的开源数据库中间件!Mycat关键特性关键特性支持SQL92标准支持MySQL.Oracle.DB2.SQL Server.Postg ...
- Java常用工具类---image图片处理工具类、Json工具类
package com.jarvis.base.util; import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStre ...