2017java文件操作(读写操作)
java的读写操作是学java开发的必经之路,下面就来总结下java的读写操作。
从上图可以开出,java的读写操作(输入输出)可以用“流”这个概念来表示,总体而言,java的读写操作又分为两种:字符流和字节流。
什么是流?
流是一个抽象的概念。当Java程序需要从数据源读取数据时,会开启一个到数据源的流。数据源可以是文件,内存或者网络等。同样,当程序需要输出数据到目的地时也一样会开启一个流,数据目的地也可以是文件、内存或者网络等。流的创建是为了更方便地处理数据的输入输出。
那么字节流和字符流又有什么区别呢?
1.字节流也称为原始数据,需要用户读入后进行相应的编码转换。而字符流的实现是基于自动转换的,读取数据时会把数据按照JVM的默认编码自动转换成字符。
2.字符流处理的单元为2个字节的Unicode字符,分别操作字符、字符数组或字符串,而字节流处理单元为1个字节,操作字节和字节数组。
所以字符流是由Java虚拟机将字节转化为2个字节的Unicode字符为单位的字符而成的。
3.字节流可用于任何类型的对象,包括二进制对象,而字符流只能处理字符或者字符串,字节流提供了处理任何类型的IO操作的功能,但它不能直接处理Unicode字符,而字符流就可以;
基于以上的区别,那么什么情况下用字符流,什么情况下用字节流呢?
如果是音频文件、图片、歌曲,就用字节流好点;如果是中文(文本)的,用字符流更好;
说了这么多,字节流和字符流处理文件到底怎么用呢?
稍安勿躁,让我们先来看看在java中,输入输出操作的步骤是什么?
1 使用File类打开一个文件
2 通过字节流或字符流的子类,指定输出的位置,注,
3 进行读/写操作
4 关闭输入/输出
IO操作属于资源操作,一定要记得关闭
字节流:
1.按照字节流的方式从文件中读取数据。
package ioInJava.characterStream; import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream; public class CharIo { public static void main(String[] args) { // 第一种方式读文件,因为方法throws了异常,所以在这要捕获异常
try {
CharIo.readFromFileByByte();
} catch (FileNotFoundException e) {
e.printStackTrace();
System.out.println("找不到文件啊");
} catch (IOException e) {
e.printStackTrace();
System.out.println("读不成功啊!");
} System.out.println("==========================="); // 第二种方式读文件
try {
CharIo.readFromFileByteTwo();
} catch (IOException e) {
e.printStackTrace();
System.out.println("还是读不成功啊!");
} } /**
* 第一种方法读文件
* 通过字符流读取文件中的数据
* @throws IOException
*/
public static void readFromFileByByte() throws IOException{
File file = new File("abc.txt");
// 如果文件不存在则创建文件
if (!file.exists()) {
file.createNewFile();
}
InputStream inputStream = new FileInputStream(file);
// 这里定义了数组的长度是1024个字节,如果文件超出这字节,就会溢出,结果就是读不到1024字节以后的东西
byte[] bs = new byte[1024];
// 这里len获得的是文件中内容的长度
int len = inputStream.read(bs);
inputStream.close();
System.out.println(new String(bs));
} /**
* 第二种方法读文件
* 通过字符流读取文件中的数据
* @throws IOException
*/
public static void readFromFileByteTwo() throws IOException{
// 注意这里的不同,File.separator是分隔符,这里指明绝对路径,即D盘根目录下的abc.txt文件
File file = new File("d:" + File.separator+"abc.txt");
// 如果文件不存在则创建文件
if (!file.exists()) {
file.createNewFile();
}
InputStream inputStream = new FileInputStream(file);
// 这里也有不同,可以根据文件的大小来声明byte数组的大小,确保能把文件读完
byte[] bs = new byte[(int)file.length()];
// read()方法每次只能读一个byte的内容
inputStream.read(bs);
inputStream.close();
System.out.println(new String(bs));
} }
2.按照字节流的方式向文件中写入数据。
package ioInJava.byteStream; import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream; /**
* 不要被那么多的try和catch吓到奥,那只是因为不想在main上throws
* @author wsg
*/
public class WriteToFile { public static void main(String[] args) {
File file = new File("D:"+File.separator+"write.doc");
OutputStream outputStream = null;
if (!file.exists()) {
try {
// 如果文件找不到,就new一个
file.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
try {
// 定义输出流,写入文件的流
outputStream = new FileOutputStream(file);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
// 定义将要写入文件的数据
String string = "Hell Java, Hello World, 你好,世界!";
// 把string转换成byte型的,并存放在数组中
byte[] bs = string.getBytes();
try {
// 写入bs中的数据到file中
outputStream.write(bs);
} catch (IOException e) {
e.printStackTrace();
} try {
outputStream.close();
} catch (IOException e) {
e.printStackTrace();
} // =================到此,文件的写入已经完成了! // 如果想在文件后面追加内容的话,用下面的方法
OutputStream outToFileEnd = null;
try {
outToFileEnd = new FileOutputStream(file,true);
} catch (FileNotFoundException e) {
e.printStackTrace();
}finally {// 这里利用了finally总会被执行的特性,索性把后面的代码都写在finally中
String string2 = "Here I come!!";
byte[] bs2 = string2.getBytes();
try {
outToFileEnd.write(bs2);
} catch (IOException e) {
e.printStackTrace();
}finally {
try {
outToFileEnd.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
=====================================================注意!!==================================================
1.初学者一般很容易搞混,或者弄不清inputstream和outpustream到底哪个是读数据,哪个是写数据,这里要说明的是,“读和写”是相对于程序本身而言的,主要记清楚一点即可,那就是凡是需要提供给程序处理的数据就是输入数据,当然就是inputstream,这里的in是要in到程序里面去,那么数据从哪里来呢,自然是从外界(网络,内存或者文件),那么针对文件而言,inputstream就是读文件了。反之,凡是程序已经处理过的数据,当然要流出程序啦,那就是out咯,所以outputstream就是输出的,那么从程序中流出,只能到外界(网络、内存或者文件),针对文件而言,就是写操作啦!(同样的道理可以针对字符流的操作)
【简言之,针对程序而言,in是入,out是出;这对文件而言,in是读,out是写!】
2.inputstream和OutputStream都是抽象类,不能实例化,使用时必须实例化一个子类(其中FileInputStream和FileOutputStream使用最多)对象来进行相关操作。
3.InputStream inputStream = new FileInputStream(fileName);当使用这个命令时,系统会提示有异常抛出,因为我们上面定义的文件程序认为是有可能存在,有可能不存在的,所以在eclipse中,给出了两个解决办法,一个是直接抛出异常声明,由系统自己解决;另一个是用try,catch结构处理异常!
===============================================================================================================
3.按照字符流的方式向文件中写入数据。
package ioInJava.characterStream; import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.Writer; public class CharIo { public static void main(String[] args) throws IOException {
// 定义一个d盘根目录下的test文档,File.separator是分隔符
// 下面这句代码,就算原本没有这个文件,也会在对应的目录创建一个文件
File file = new File("D:" + File.separator + "test.docx");
// 下面这也会抛出异常,这次我们为了代码结构清晰起见,直接throw给main吧
Writer writer = new FileWriter(file);
String string = "今天是教师节!";
writer.write(string);
// 在这一定要记得关闭流
writer.close();
}
}
但是,上面的代码有一个问题,比如,载定义一个string2,再次调用writer.write(string2)方法的时候,会发现test文件中的内容会被string2的内容覆盖,要想实现内容追加到文件尾部,代码如下,其实就是小小的修改,利用它的一个方法!
package ioInJava.characterStream; import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.Writer; public class CharIo { public static void main(String[] args) throws IOException {
// 定义一个d盘根目录下的test文档,File.separator是分隔符
// 下面这句代码,就算原本没有这个文件,也会在对应的目录创建一个文件
File file = new File("D:" + File.separator + "test.docx");
// 下面这也会抛出异常,这次我们为了代码结构清晰起见,直接throw给main吧
// 这里改变了writer的类型,变成了追加型
Writer writer = new FileWriter(file, true);
String string = "今天是教师节!";
writer.write(string);
String string2 = "祝愿所有的老师教师节快乐!";
writer.write(string2);;
// 在这一定要记得关闭流
writer.close();
}
}
4.按照字符流的方式从文件中读取数据。
package ioInJava.characterStream; import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader; public class ReadFromFile { public static void main(String[] args) throws IOException {
File file = new File("d:" + File.separator + "test.docx");
Reader reader = new FileReader(file);
char[] cs= new char[1024];
// 上面定义了一个大小为1024的char型数组,如果文件内容过大,程序就会报错,而不是只读到1024的大小
reader.read(cs, 0, (int)file.length());
System.out.println(cs);
reader.close();
} }
上面的代码只能读取内容不超过1024字符的内容,这显然不是我们想要的,如何读取一个任意大小的文件呢!那么最简单的方法就是加大数组的空间大小了,可以用file.length获取文件的大小,从而定义数组的大小!char[] cs= new char[(int)file.length()];
当然,这不是最好的办法,请看下面的代码:
package ioInJava.characterStream; import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
import java.io.Writer; public class ReadFromFile { public static void main(String[] args) throws IOException {
try {
// 声明一个可变长的stringBuffer对象
StringBuffer sb = new StringBuffer(""); /*
* 读取完整文件
*/
Reader reader = new FileReader("d:" + File.separator + "test.docx");
// 这里我们用到了字符操作的BufferedReader类
BufferedReader bufferedReader = new BufferedReader(reader);
String string = null;
// 按行读取,结束的判断是是否为null,按字节或者字符读取时结束的标志是-1
while ((string = bufferedReader.readLine()) != null) {
// 这里我们用到了StringBuffer的append方法,这个比string的“+”要高效
sb.append(string + "/n");
System.out.println(string);
}
// 注意这两个关闭的顺序
bufferedReader.close();
reader.close(); /*
* 完整写入文件
*/
Writer writer = new FileWriter("d:" + File.separator + "test2.docx");
BufferedWriter bw = new BufferedWriter(writer);
// 注意这里调用了toString方法
bw.write(sb.toString());
// 注意这两个关闭的顺序
bw.close();
writer.close(); } catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
上面的代码我们顺利实现了从test文件中读取全文,并将其写入test2文件中!!
2017java文件操作(读写操作)的更多相关文章
- INI 文件的读写操作
在C#中对INI文件进行读写操作,在此要引入using System.Runtime.InteropServices; 命名空间,具体方法如下: #region 变量 private static r ...
- Android 对 properties文件的读写操作
-. 放在res中的properties文件的读取,例如对放在assets目录中的setting.properties的读取:PS:之所以这里只是有读取操作,而没有写的操作,是因为我发现不能对res下 ...
- C++学习48 对ASCII文件的读写操作
如果文件的每一个字节中均以ASCII代码形式存放数据,即一个字节存放一个字符,这个文件就是ASCII文件(或称字符文件).程序可以从ASCII文件中读入若干个字符,也可以向它输出一些字符. 对ASCI ...
- Delphi- ini文件的读写操作
一.读INI文件示例 procedure TForm1.FormCreate(Sender: TObject); Var MyIni :Tinifile; glAppPath :string; beg ...
- android报错及解决2--Sdcard进行文件的读写操作报的异常
报错描述: 对Sdcard进行文件的读写操作的时候,报java.io.FileNotFoundException: /sdcard/testsd.txt (Permission denied),在往S ...
- java文件的读写操作
java文件的读写操作主要是对输入流和输出流的操作,由于流的分类很多,所以概念很容易模糊,基于此,对于流的读写操作做一个小结. 1.根据数据的流向来分: 输出流:是用来写数据的,是由程序(内存)--- ...
- python使用装饰器对文件进行读写操作'及遍历文件目录
'''使用装饰器对文件进行读写操作''' # def check_permission(func): # '''演示嵌套函数定义及使用''' # def wrapper(*args,**kwargs) ...
- C# System.IO和对文件的读写操作
System.IO命名空间中常用的非抽象类 BinaryReader 从二进制流中读取原始数据 BinaryWriter 从二进制格式中写入原始数据 BufferedStream 字节流的临时存储 ...
- python3文件的读写操作
open函数:对文件进行读写操作前,先打开文件,获取文件的句柄: open(file, mode, encoding, buffering) 参数说明 file_name:一个包含了你要访问的文件路径 ...
- kernel中文件的读写操作可以使用vfs_read()和vfs_write
需要在Linux kernel--大多是在需要调试的驱动程序--中读写文件数据.在kernel中操作文件没有标准库可用,需要利用kernel的一些函数,这些函数主要有: filp_open() fil ...
随机推荐
- 2017年总结的前端文章——一劳永逸的搞定 flex 布局
flex 基本概念 使用 flex 布局首先要设置父容器 display: flex,然后再设置 justify-content: center 实现水平居中,最后设置 align-items: ce ...
- python监控接口请求
#!/usr/bin/env python #coding=utf8 import time,os,sched,urllib,httplib import smtplib import string ...
- [Miller-Rabin & Pollard-rho]【学习笔记】
Miller-Rabin & Pollard-rho 很久之前就学过了...今天重学一遍 利用费马小定理,但不能判断伪素数的情况 基于a的伪素数n: \(a^{n-1} \equiv 1 \p ...
- 有关static静态方法知识的收集
1.何时使用静态方法: 如果某些操作不依赖具体实例,那它就是静态的,反之如果某些操作是依赖具体实例的(例如访问一个特定会员的名称),那它就应该是实例化的. 2.静态方法和实例方法的区别主要体现在两个方 ...
- pandas读取各类sql数据源
大数据分析中,我们经常需要使用pandas工具读取各类数据源并将结果保存到数据库中. 本文总结了一些读取和写入常用数据库数据的一些方法,包括mysql,oracle,impala等. 其中读取数据库数 ...
- Thrift入门
简介 Thrift最初由Facebook研发,主要用于各个服务之间的RPC通信,支持跨语言,常用的语言比如C++, Java, Python, PHP, Ruby, Erlang, Perl, Has ...
- 携程Apollo(阿波罗)配置中心用户管理和部门管理
Apollo是配置管理系统,会提供权限管理(Authorization),理论上是不负责用户登录认证功能的实现(Authentication).所以Apollo定义了一些SPI用来解耦,Apollo接 ...
- 怎样调整XenServer下面Linux虚拟机的磁盘大小
登录到XenServer. 修改虚拟机磁盘大小修改storage 磁盘大小 启动虚拟机 修改分区大小Hex code (type L to list codes): 8eChanged system ...
- 洛谷P1171 售货员的难题【状压DP】
题目描述 某乡有n个村庄(1 输入格式: 村庄数n和各村之间的路程(均是整数). 输出格式: 最短的路程. 输入样例: 3 0 2 1 1 0 2 2 1 0 输出样例 3 说明 输入解释 3 {村庄 ...
- React设计思想
熟悉一个新技术的关键是熟悉他的特色和理念 React框架本身和我们常用的JavaScript MVC框架,如:AngularJS,Backbone,Ember等,没有直接的可比性.在React的官方博 ...