Java基础系列——IO流
---恢复内容开始---
Java对数据的操作都是通过流的方式,数据的输入和输出是相对内存来说的,将外设的数据读到内存:输入流;将内存的数据写到外设:输出流。
流按操作数据分为两种:字节流,字符流。
输入输出的数据全都是以字节为单位的二进制,字符流后期才出现,字符流出现的目的是让机器识别日常生活文字,编码表(美国ascii,中国GBK)记录了文字和数字的对应关系,从而字节流+编码表=字节流,从硬盘读取字节流之后,先查表,转换成对应的文字,从而形成字符流。(注:国际统一的为unicode(java内置),无论什么字符都用2个字节表示)
字节流的抽象基类(顶层父类):inputStream,outputStream.(数据载体)
字符流的抽象基类 :Reader,Writer.
这些子类的后缀都是父类名,前缀是子类实现的功能。
java.lang.Object java.lang.Object
|--java.io.writer (写入字符流的抽象类) |--java.io.writer
|--java.io.OutputStreamWriter(字符流通向字节流的桥梁,转换流) |--BufferedWriter
|--java.io.FileWriter
1.FileWriter:将字符写入到文本文件(和文本编辑器,word等工具一个原理)
public static void main(String[] args) throws IOException{
FileWriter fw = new FileWriter("demo.txt",true); // 如果demo存在,则会覆盖,如果不存在,创建。如果加入 true,那么不会覆盖,会续写。
fw.write("abc"); //abc写入到了临时存储缓冲区中。
fw.flush(); //将数据直接写入到demo。
fw.close(); //关闭流,释放资源。close中调用了flush,flush可省略。
}
IO异常的处理:
public static void main(String[] args){
FileWriter fw = null; //流对象的创建方式,因为一般都会发生异常。
try{
fw = new FileWriter("demo.txt",true);
fw.write("abc");
}
catch (IOException e){
System.out.println(e.toString());
}
finally{
if(fw != null) //如果要创建的路径不存在,比如F盘没有,那么fw这个流就不能创建,如果这里不判断,就会抛出异常。
try{
fw.close();
} catch (IOException e) {throw new RuntimeException("关闭失败");}
}
}
2.FileReader:读取文本文件中的字符
FileReader fr = new FileReader("demo.txt");
int a = 0;
while((a=fr.read())!=-1)
{
sop(char(a)); //每次读取一个字符,但是以二进制的数字格式输出(0-65535 0x00-0xffff)。如果读取完了,会返回-1
}
/*
也可以以数组的形式来读
char[] buf = new char[3];
int num = fr.read(buf); //num是读取的字符个数
sop(num+":"+new String(buf,0,num)); //这里string里用num可以保证读几个打印几个。
如果存的是abcde五个字符,那么第一次逐个读取abc到内存里的长度为3的数组,然后输出num=3和abc,下次读取时de放到了内存数组的前两位,覆盖了ab所在位置, 第三位读不到但是内存中还是c,所以第二次读取num=2和dec,第三次返回num=0和dec。
while((num=fr.read(buf))!=-1){
sop(new String(buf,0,num)); //buf越大,效率越高
}
*/
例子:复制文本文件 先读再写
public static void main(String[] args) {
FileReader fr = null;
FileWriter fw = null;
try{
fr = new FileReader("demo.txt");
fw = new FileWriter("demo123.txt");
char[] buf = new char[1024]; // 读流读出来以后,放到内存中缓冲区,然后进写流,写流flush或close,写入demo123
int ch = 0;
while((ch=fr.read())!=-1)
{
fw.write(buf);
}
}
catch(IOException e){
e.toString();
}
finally{
if(fw!=null )
try{
fw.close();
}
catch( Exception e){
throw new RuntimeException("读写异常");
}
if(fr!=null)
try{
fr.close();
}
catch( Exception e){
throw new RuntimeException("读写异常");
}
}
}
3.字符流的缓冲区BufferedReader,BufferedWriter(其实就是在类里面封装的上面的char数组)
BufferedReader和BufferedWriter,结合流才可以使用,提高流的使用效率。 数据库的连接池
BufferedWriter:将文本写入字符输出流,缓冲各个字符,从而提供单个字符,数组和字符串的高效写入。可以设置大小,但是默认大小一般够用。
方法:行分隔符newline();由line.seperate定义。
public static void main(String[] args) throws IOException {
FileWriter fw = new FileWriter("demo1.txt");
FileReader fr = new FileReader("demo.txt");
BufferedReader bufr = new BufferedReader(fr);
BufferedWriter bufw = new BufferedWriter(fw);
String line = null;
while((line = bufr.readLine())!=null){ //readLine()是BufferedReader特有方法,其中使用了BufferedReader的read方法,将读取到的字符串缓冲并判断换行标记,然后将标记前的字符串返回。
bufw.write(line);
bufw.newLine(); //换行 newLine()是BufferedWriter特有方法
bufw.flush();
}
bufr.close();
bufw.close(); //关掉的是流,不是缓冲区
}
java.lang.Object
|--java.io.OutputStream
|--java.io.FileOutputStream
4.FileOutputStream,FileInputStream,BufferedInputStream,BufferedOutputStream.流只能操作文本文件,而字节流可以操作多种。
private static void copy() {
FileOutputStream fos = null;
FileInputStream fis = null;
try{
fis = new FileInputStream("D:\\cover.jpg");
BufferedInputStream buis = new BufferedInputStream(fis);
fos = new FileOutputStream("E:\\cover.jpg");
BufferedOutputStream buos = new BufferedOutputStream(fos);
int ch = 0;
ry {
while((ch=buis.read(buf))!=-1){
try{
buos.write(buf);
}
catch(IOException e){
System.out.println("失败");
}
} catch (IOException e) {
e.printStackTrace();
}
catch (FileNotFoundException e) {
e.printStackTrace();
}finally{
try {
if(fis==null)
fis.close();
if(fos==null)
fos.close();
System.out.println("复制成功");
} catch (IOException e) {
e.printStackTrace();
}
}
5.字节流和字符流之间的转换 InputStreamReader,OutputStreamWriter
InputStreamReader将字节流转换成字符流(读取的还是字节流,但是它拿着字节去查表去了,返回的是字符的ASCII值,一个汉字两个字节,如果不转的话,分别输出两个字节值,转换成字符流,输出一个值) 解码的过程
从 InputStream in = System.in; 上 OutputStream out = System.out;
上 InputStreamReader isr = new InputStreamReader(in); 向 OutputStreamWriter osw = new OutputStreamWriter(out);
向 BufferedReader bufr = new BufferedReader(isr); 下 BufferedWriter bufw = new BufferedWriter(osw);
下 String line = bufr.readLine(); -------------------------> 从 bufw.write(line);
简化写法 BufferedReader bufr = new BufferedReader(new InputStreamReader(System.in或者是FileInputStream("demo.txt")));
BufferedWriter bufw = new BufferedWriter(new OutputStreamWriter(System.out或者是FileOutputStream("demo.txt")));
注意点:FileWriter fw = new FileWriter("demo.txt");效果等同于
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("demo.txt"),"GBK");
FileWriter是子类,为操作文件而生,默认GBK,其中封装了转换流功能,虽然看起来是直接操作文本中的字符,但说到底文本还是要从硬盘读取,硬盘中的数据是字节。
6.File类
File f1 = new File("c:\\a.txt"); File f2 = new File("c:\\","a.txt");
File f = new File("c:\\"); File f4 = new File(f,"a.txt");
File f = new File("c:"+File.separator+"睿思"+File.separator+"a.txt"); 分隔符File.separator
具体方法:文件对象的状态获取,创建删除,判断,重命名,获取根目录和容量,目录内容,过滤指定类型文件的过滤器(FilenameFilter接口)等。
7.Properties类(与流相关)
Map
|--HashTable
|--Properties
1.集合中的键和值都是字符串类型。
2.该集合中的数据可以保存到流中,或者从流获取。操作以键值对形式存在的配置文件。
功能:将配置文件以流的形式读出,然后利用properties的方法对其中的键值形式信息进行操作。
1.Properties p = new Properties();
p.setProperty("zhangsan", "22");
FileOutputStream fos = new FileOutputStream("demo.txt");
p.store(fos, "name+age");
fos.close();
2. File file = new File("demo.txt");
if(!file.exists()){
file.createNewFile();
}
FileReader fr = new FileReader(file);
Properties p = new Properties();
p.load(fr);
p.list(System.out);//列出文件内容,测试是否关联成功
p.setProperty("wangwu", "33");
FileWriter fw = new FileWriter(file);
fw.close();
fr.close();
3.记录应用程序打开次数
File confile = new File("confile.txt");
if(!confile.exists()){
confile.createNewFile();
}
FileReader fr = new FileReader(confile);
Properties p = new Properties();
p.load(fr);
String name = p.getProperty("time");
int value = 0;
if(name!=null){
value = Integer.parseInt(name);
}
value++;
p.setProperty("time", "value");
4.返回目录下文件名以.java结尾的文件(附件
public class Test { public static void main(String[] args) throws IOException { File dir = new File("c:\\");
FilenameFilter filter = new FilenameFilter(){
public boolean accept(File dir,String name){
return name.endsWith(".java");
}
};
List<File> list = new ArrayList<File>();
getFiles(dir,filter,list);
File destFile = new File(dir,"javalist.txt");
write2File(list,destFile);
} public static void getFiles(File dir,FilenameFilter filter,List<File> list){
File[] files = dir.listFiles();
for(File file : files){
if(file.isDirectory()){
getFiles(file,filter,list);
}
else{
if(filter.accept(dir, file.getName()));{
list.add(file);
}
}
}
}
public static void write2File(List<File> list,File destFile){
BufferedWriter bufw = null;
try {
bufw = new BufferedWriter(new FileWriter(destFile));
for(File file:list){
bufw.write(file.getAbsolutePath());
bufw.newLine();
bufw.flush();
}
} catch (IOException e) {
throw new RuntimeException();
}
finally{
if(bufw!=null){
try{
bufw.close();
}catch(IOException e){
throw new RuntimeException("关闭失败");
}
}
}
} }
8.打印流 PrintStream PrintWriter
可以对多种数据类型值进行打印,并保持数据的表示形式。不抛IOException。想保证数据形式原样时,用print方法。
PrintStream 打印的所有字符都使用平台的默认字符编码转换为字节。在需要写入字符而不是写入字节的情况下,应该使用
PrintWriter类。
构造函数接受三种类型值:字符串路径,File对象,字节输出流
PrintStream out = new PrintStream("print.txt");
out.print(97);
out.close();
9.序列流SequenceInputStream
public static void main(String[] args) throws IOException { ArrayList<FileInputStream> al = new ArrayList<FileInputStream>();
al.add(new FileInputStream("demo1.txt"));al.add(new FileInputStream("demo2.txt"));al.add(new FileInputStream("demo3.txt"));
Enumeration<FileInputStream> en = Collection.enumeration(al); //迭代器
SequenceInputStream sis = new SequenceInputStream(en);
FileOutputStream fos = new FileOutputStream("demo.txt");
byte[] buf = new byte[1024];
int len = 0;
while((len = sis.read(buf))!=-1){
fos.write(buf,0,len);
}
fos.close();
sis.close();
}
Java基础系列——IO流的更多相关文章
- java基础之IO流(二)之字符流
java基础之IO流(二)之字符流 字符流,顾名思义,它是以字符为数据处理单元的流对象,那么字符流和字节流之间的关系又是如何呢? 字符流可以理解为是字节流+字符编码集额一种封装与抽象,专门设计用来读写 ...
- java基础之IO流(一)字节流
java基础之IO流(一)之字节流 IO流体系太大,涉及到的各种流对象,我觉得很有必要总结一下. 那什么是IO流,IO代表Input.Output,而流就是原始数据源与目标媒介的数据传输的一种抽象.典 ...
- Java基础之IO流整理
Java基础之IO流 Java IO流使用装饰器设计模式,因此如果不能理清其中的关系的话很容易把各种流搞混,此文将简单的几个流进行梳理,后序遇见新的流会继续更新(本文下方还附有xmind文件链接) 抽 ...
- 【java基础】]IO流
IO流 概念: 流的概念源于unix中管道(pipe)的概念,在unix中,管道是一条不间断的字节流,用来实现程序或进程间的通信,或读写外围设备,外部文件等 一个流,一定能够会有源和去向(目的地),他 ...
- java基础之 IO流
javaIO流 IO流 : (input output) 输入输出流 :输入 :将文件读到内存中 输出:将文件从内存输出到其他地方. IO技术的作用:主要就是解决设备和设备之间的数据传输问题 ...
- java基础44 IO流技术(输出字节流/缓冲输出字节流)和异常处理
一.输出字节流 输出字节流的体系: -------| OutputStream:所有输出字节流的基类(抽象类) ----------| FileOutputStream:向文件输出数据的输出字节流(把 ...
- java基础之io流总结一:io流概述
IO流概念: 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.io流是实现输入和输出的基础,可以方便的实现数据的输入和输出操作. IO流的分类: 根据处理数据类型的不同分为:字符流 ...
- 黑马程序员——JAVA基础之IO流FileReader,FileWriter
------- android培训.java培训.期待与您交流! ---------- IO(Input Output)流 IO流用来处理设备之间的数据传输 Java对数据的操作是通过流的方式 J ...
- java基础06 IO流
IO用于在设备间进行数据传输的操作. Java IO流类图结构: IO流分类 字节流: InputStream FileInputStream BufferedInputStream Output ...
随机推荐
- squid 2.7 通过域名反向代理多个服务器的配置方法
详细配置及注释如下,供大家学习参考. visible_hostname squid1.abc.com #设定squid的主机名,如无此项squid将无法启动 http_port 80 accel vh ...
- JS中,!=, !== 和 !的区别和使用场景
var num = 1; var str = '1'; var test = 1; test == num //true 相同类型 相同值 test === num //true 相同类型 ...
- url地址的图片路径
url地址的图片路径: (./images/1.jpg) 中的./指根路径,有或没有都可以: (../images/1.jpg) 中的../指相对路径: (../../images/1.jpg) 中的 ...
- GTest Google的一种白盒单元测试框架 开源项目
GTest为google开源的白盒单元测试跨平台测试框架,含丰富的断言.类型参数化测试.死亡测试.以及其他的测试选项设置.文件保存等,以下将对该项目C++的实现进行简要的分析,作为学习记录备份. 基本 ...
- SQL语句实现Split并合并查询结果
需求是这样的,需要将数据库中的支付方式列(用";"分割的字符串)按支付方式拆分: 首先参考博客园split的文章,我采用方法2, IF EXISTS ( SELECT * FROM ...
- JDK7和JDK8一些重要新特性
jdk7新特性(部分) switch支持字符串 List AutoCloseable接口实现自动关闭,在try()中 新增获取环境信息的工具方法,getJavaHomeDir,getUserHomeD ...
- linux高级编程补充知识
F: 计算机系统结构: ------------------------------- 应用程序 ----------------- | 库函数 -------------------------- ...
- [原创]Centos7 从零配置Nginx+PHP+MySql
序言 这次玩次狠得.除了编译器使用yum安装,其他全部手动编译.哼~ 看似就Nginx.PHP.MySql三个东东,但是它们太尼玛依赖别人了. 没办法,想用它们就得老老实实给它们提供想要的东西. 首先 ...
- ASP.NET 给作为隐藏域的TextBox赋值之后提交表单,无响应?
操作步骤: 给页面隐藏TextBox赋值,然后触发ASP.NET change事件,调用ASP.NET后台方法,调用后执行客户端脚本this.RegisterClientScriptBlock(Dat ...
- MYSQL 按照字母排序查询
select id vKey, name vValue from ib_brand order by convert(name USING gbk) COLLATE gbk_chinese_ci a ...