java IO流文件的读写具体实例
IO流的分类:
1、根据流的数据对象来分:
高端流:所有的内存中的流都是高端流,比如:InputStreamReader
低端流:所有的外界设备中的流都是低端流,比如InputStream,OutputStream
如何区分:所有的流对象的后缀中包含Reader或者Writer的都是高端流,反之,则基本上为低端流,不过也有例外,比如PrintStream就是高端流
2、根据数据的流向来分:
输出流:是用来写数据的,是由程序(内存)--->外界设备
输入流:是用来读数据的,是由外界设备--->程序(内存)
如何区分:一般来说输入流带有Input,输出流带有Output
3、根据流数据的格式来分:
字节流:处理声音或者图片等二进制的数据的流,比如InputStream
字符流:处理文本数据(如txt文件)的流,比如InputStreamReader
如何区分:可用高低端流来区分,所有的低端流都是字节流,所有的高端流都是字符流
4、根据流数据的包装过程来分:
原始流:在实例化流的对象的过程中,不需要传入另外一个流作为自己构造方法的参数的流,称之为原始流。
包装流:在实例化流的对象的过程中,需要传入另外一个流作为自己构造方法发参数的流,称之为包装流。
如何区分:所以的低端流都是原始流,所以的高端流都是包装流
IO流对象的继承关系(如下图):
下面来看一些具体的代码例子:
按字节来读取文件
代码如下
public class ReadFromFile {
/**
* 以字节为单位读取文件,常用于读二进制文件,如图片、声音、影像等文件。
*/
public static void readFileByBytes(String fileName) {
File file = new File(fileName);
InputStream in = null;
try {
System.out.println("以字节为单位读取文件内容,一次读一个字节:");
// 一次读一个字节
in = new FileInputStream(file);
int tempbyte;
while ((tempbyte = in.read()) != -1) {
System.out.print(tempbyte);
}
in.close();
} catch (IOException e) {
e.printStackTrace();
return;
}
try {
System.out.println("以字节为单位读取文件内容,一次读多个字节:");
// 一次读多个字节
byte[] tempbytes = new byte[100];
int byteread = 0;
in = new FileInputStream(fileName);
ReadFromFile.showAvailableBytes(in);
// 读入多个字节到字节数组中,byteread为一次读入的字节数
while ((byteread = in.read(tempbytes)) != -1) {
System.out.print(tempbytes, 0, byteread);
}
} catch (Exception e1) {
e1.printStackTrace();
} finally {
if (in != null) {
try {
in.close();
} catch (IOException e1) {
}
}
}
}
按字符来读取文件
复制代码代码如下:
/**
* 以字符为单位读取文件,常用于读文本,数字等类型的文件
*/
public static void readFileByChars(String fileName) {
File file = new File(fileName);
Reader reader = null;
try {
System.out.println("以字符为单位读取文件内容,一次读一个字符:");
// 一次读一个字符
reader = new InputStreamReader(new FileInputStream(file));
int tempchar;
while ((tempchar = reader.read()) != -1) {
// 对于windows下,\r\n这两个字符在一起时,表示一个换行。
// 但如果这两个字符分开显示时,会换两次行。
// 因此,屏蔽掉\r,或者屏蔽\n。否则,将会多出很多空行。
if (((char) tempchar) != '\r') {
System.out.print((char) tempchar);
}
}
reader.close();
} catch (Exception e) {
e.printStackTrace();
}
try {
System.out.println("以字符为单位读取文件内容,一次读多个字符:");
// 一次读多个字符
char[] tempchars = new char[30];
int charread = 0;
//由于要以字符来读取,所以需要套上字符流
reader = new InputStreamReader(new FileInputStream(fileName));
// 读入多个字符到字符数组中,charread为一次读取字符数
while ((charread = reader.read(tempchars)) != -1) {
// 同样屏蔽掉\r不显示
if ((charread == tempchars.length)
&& (tempchars[tempchars.length - 1] != '\r')) {
System.out.print(tempchars);
} else {
for (int i = 0; i < charread; i++) {
if (tempchars[i] == '\r') {
continue;
} else {
System.out.print(tempchars[i]);
}
}
}
}
} catch (Exception e1) {
e1.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e1) {
}
}
}
}
按行来读取文件
代码如下:
/**
* 以行为单位读取文件,常用于读面向行的格式化文件
*/
public static void readFileByLines(String fileName) {
File file = new File(fileName);
BufferedReader reader = null;
try {
System.out.println("以行为单位读取文件内容,一次读一整行:");
reader = new BufferedReader(new FileReader(file));
String tempString = null;
int line = 1;
// 一次读入一行,直到读入null为文件结束
while ((tempString = reader.readLine()) != null) {
// 显示行号
System.out.println("line " + line + ": " + tempString);
line++;
}
reader.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null) {
try {
reader.close();
} catch (IOException e1) {
}
}
}
}
将一个文件的内容写入另一个文件(按行来写)
复制代码代码如下:
public class FileTest {
public static void main(String[] args) {
File file=new File("c:\\test.txt");
BufferedReader read=null;
BufferedWriter writer=null;
try {
writer=new BufferedWriter(new FileWriter("c:\\zwm.txt"));
} catch (IOException e1) {
e1.printStackTrace();
}
try {
read=new BufferedReader(new FileReader(file));
String tempString = null;
while((tempString=read.readLine())!=null){
writer.append(tempString);
writer.newLine();//换行
writer.flush();//需要及时清掉流的缓冲区,万一文件过大就有可能无法写入了
}
read.close();
writer.close();
System.out.println("文件写入完成...");
} catch (IOException e) {
e.printStackTrace();
}
}
}
转载于:https://blog.51cto.com/12267285/1929453
相关文章:
Matlab与线性代数 -- 矩阵的重组3
本图文详细介绍了矩阵重组的第三种情况,从矩阵中选取子矩阵。

ASP.NET小收集:IFrame使用
使用Iframe制作一个固定框架,很方便与象后台网站之类的页面1<html xmlns"http://www.w3.org/1999/xhtml">2<head runat"server">3<title>后台</title>4</head>5<frameset cols"170,*"framespacing&…

linux mac中实现类似secureCRT的clone session
在你的登录账户下的.ssh文件夹新建一个文件:config. cd ~/.ssh vi config config的文件中,内容为: host * ControlMaster auto ControlPath ~/.ssh/master-%r%h:%p 重新打开终端,第一次,你还是需要输入密码,…

C#动态加载DLL(转)
利用反射进行动态加载和调用.Assembly assAssembly.LoadFrom(DllPath); //利用dll的路径加载加载dll后,需要使用dll中某类.Type typeass.GetType(“TypeName”);//利用类型的命名空间和名称获得类型需要实例化类型,才可以使用,参数可以人为的指定,也可以无参数,静态实例可以省略…

mysql高可用之MMM
博主QQ:819594300博客地址:http://zpf666.blog.51cto.com/有什么疑问的朋友可以联系博主,博主会帮你们解答,谢谢支持!一、MMM简介:MMM即Multi-MasterReplication Manager for MySQL:mysql多主复制管理器。M…
Matlab与线性代数 -- 矩阵的重组4
本图文详细描述了矩阵重组的第四种情况,将矩阵改写成行向量或者列向量。

利用spring aop统一处理异常和打日志
利用spring aop统一处理异常和打日志 spring aop的概念,很早就写博客介绍了,现在在工作中真正使用。 我们很容易写出的代码 我们很容易写出带有很多try catch 和 logger.warn(),logger.error()的代码,这样一个方法本来的业务逻辑只有5行&a…
Matlab与线性代数 -- 矩阵的重组5
本图文详细介绍了矩阵重组的Matlab命令reshape()。
windows XP下Python2.7包管理工具安装-setuptool,pip、distribute、nose、virtualenv
在Python开发中为了对项目进行管理和调试。必须安装一些特定的软件包。据说业内这个叫做yak shaving-做一个非常酷非常绚丽的Python项目之前,必须做的一些枯燥无味的准备工作。本文介绍了setuptool。pip、distribute、nose、virtualenv的安装。 1,pytho…

黑客必知的SQL语句 黑客知道,程序员必知
SQL语句先前写的时候,很容易把一些特殊的用法忘记,我特此整理了一下SQL语句操作。 一、基础 1、说明:创建数据库 Create DATABASE database-name 2、说明:删除数据库 drop database dbname 3、说明:备份sql server --…

AutowireCapableBeanFactory,实现不必配置xml文件,动态加载bean
场景 今天遇见一个问题,如何能做到一个类,没有在spring的配置文件中配置,但是还能通过某种方式加载进来。通过查看一些代码,查看stackoverflow,了解了一些知识。 如果一个类并没有在applicationContext中配置我们可以…
[导入]如何理解Return的返回值?
如何理解Return的返回值? 问题: 在创建和录制脚本的时候,发现在脚本vuser_init、Action、vuser_end三部分,都会有一条“return 0;”语句,那么我们平时在编写脚本时如何应用return语句,return不同的返回值又…
如何利用神经网络结合遗传算法进行非线性函数极值寻优(2)
如何利用神经网络结合遗传算法进行非线性函数极值寻优

自己亲自写的两本linux资料,免费下载,pdf文档
第一本是我写的韩顺平老师解说的linux视频的笔记,该视频原本有21讲,可是我始终没有找到当中的17、18讲。可是其它部分我感觉及记录的还是蛮认真的。该套视频解说的非常基础,因此我的这本笔记也非常基础。这里是免积分在csdn上的下载地址&…

深入理解Java:SimpleDateFormat安全的时间格式化
转自:http://www.cnblogs.com/peida/archive/2013/05/31/3070790.html 想必大家对SimpleDateFormat并不陌生。SimpleDateFormat 是 Java 中一个非常常用的类,该类用来对日期字符串进行解析和格式化输出,但如果使用不小心会导致非常微妙和难以…

如何提高增加包含大量记录的表的主键字段的效率
如何提高增加包含大量记录的表的主键字段的效率 LazyBee 1 问题的提出: 在给客户升级数据库系统时,由于报表的需要,系统中每一个表都需要有主键字段。系统审计表自然也有这个要求—需要增加一个identify的字段,但这个表中有2000多…

${pageContext.request.contextPath} JSP取得绝对路径
在使用的时候可以使用${pageContext.request.contextPath},也同时可以使用<%request.getContextPath()%>达到同样的效果,同时,也可以将${pageContext.request.contextPath},放入一个JSP文件中,将用C:…
Matlab与线性代数 -- 矩阵的水平连接和垂直连接
本图文详细介绍了Matlab中矩阵的水平连接和垂直连接。
Matlab与线性代数 -- 矩阵的复制
本图文详细介绍了Matlab中矩阵复制函数repmat(A,m,n)。

用C#实现抽象工厂模式
大家都知道,在开发中,如果用好了某种模式,那效率…… 嘿嘿 我就不说了 进入正题吧: 以下都为源代码,可直接拷贝,然后自己研究 由于是讲解,所以只涉及基本的架构 项目名为:Ab…

树莓派 raspberry安全关机命令重启命令
树莓派可以通过下面几个命令来实现安全关机:sudo shutdown -h now sudo halt sudo poweroff sudo init 0上面四行代码都可以,执行一行都可以安全关机, ^_^树莓派重启 定时重启方法:sudo reboot shutdown -r now shutdown -r 04:00:00 #定时重…
jps命令(Java Virtual Machine Process Status Tool)(转)
1、介绍 用来查看基于HotSpot的JVM里面中,所有具有访问权限的Java进程的具体状态, 包括进程ID,进程启动的路径及启动参数等等,与unix上的ps类似,只不过jps是用来显示java进程,可以把jps理解为ps的一个子集。 使用jps时…

使用 Smartmontools 检测硬盘坏道
2019独角兽企业重金招聘Python工程师标准>>> 在这篇文章中,我们通过几个必要的步骤,使用特定的磁盘扫描工具让你能够判断 Linux 磁盘或闪存是否存在坏道。 在Linux上使用坏块工具检查坏道 坏块工具可以让用户扫描设备检查坏道或坏块ÿ…
如何使用Github管理自己的代码
本文介绍了使用Github管理代码的基本操作方法。由LSGO软件技术团队的安晟提供。

javassist 初步学习
javassist简介 javassist可以对一个已经编译好了的.class文件的字节码进行改动,比如说我可以为一个类添加一个方法,添加一个属性,也可以修改一个方法等,还可以对一个方法,异常进行拦截等。 我们常用到的动态特性主要…

.NET环境下有关打印页面设置、打印机设置、打印预览对话框的实现
原文:.NET环境下有关打印页面设置、打印机设置、打印预览对话框的实现我个人认为,开发MIS,首先就得解决网格的问题,而开发工具为我们提供了如DataGrid、MSHFlexGrid的控件。其次,是打印的问题,将业务单据与数据报表打印出来。可想…

Silverlight 2 beta 2 中目前不支持共享 WCF 的客户端类型
在调用多个 WCF Service 的时候经常会遇到的一个问题是,某些同样的类型因为在不同的 Service 里用到,就被重复生成了好几个版本的代理类型,分别处在不同的名称空间下。这样,如果一个操作需要同时调用几个 Service,就会…
Matlab与线性代数 -- 逆矩阵
本微信图文详细介绍了Matlab中各种求逆矩阵的方法。

使用intellij idea制作可执行jar文件
可执行jar文件 一个可执行的 jar文件是一个自包含的 Java 应用程序,它存储在特别配置的 JAR 文件中,可以由 JVM 直接执行它而无需事先提取文件或者设置类路径。要运行存储在非可执行的 JAR 中的应用程序,必须将它加入到您的类路径中…

c# 一些控件常用屬性
Form:ControlBox:移除窗體按鈕(最大化、最小化、關閉組),並從左側移除「系統菜單」Opacity:控制窗體透明度ActiveControl:指出窗體上當前哪一個擦傷擁有焦點BackColor:窗體中任何文本和圖形的默…