搜索
首页Javajava教程Java基础入门之iO

Java基础入门之iO

Jul 24, 2017 pm 01:52 PM
java基础

接着上一篇,继续做学习笔记。学IO这块,突然找到一点好处,好像以后操作电脑,尤其是电脑里的文件啥的,可以很少的用鼠标了。添加、修改、删除啥的,几行代码就可以搞定了。这只是我一个初学者的一点小心思,IO背后的大用处,相信还有很多很多。继续学习ing....

一、缓冲流和装饰模式

缓冲流(包装类),缓冲区的出现提高了对数据读写的效率,它可以用来对流进行包装,在流的基础上对流的功能进行了增强。和底层系统提供的缓冲区有什么区别?底层直接和目标设备交换数据,包装类中,通过被包装的对象。

BufferedReader : 从字符输入流中读取文本,缓冲各个字符,从而实现字符、数组和行的高效读取。

BufferedReader 的构造函数有两个:

---- BufferedReader(Reader in)        

---- BufferedReader(Reader in, int sz) 创建一个使用默认大小输入缓冲区的缓冲字符输入流。

//例子  BufferedWriter 的使用FileWriter w=new FileWriter("2.txt");
BufferedWriter bw=new BufferedWriter(w);
    bw.write("这是一行内容");
    bw.newLine();  //这是包装类提供的功能bw.write("这又是一行内容");
    bw.flush();  //用缓冲流,不要忘了flush()bw.close();  //它就相当于关闭 w,这么写了以后,就不用再写 w.close() 了
//例子  BufferedReader 的使用public static void main(String[] args)throws IOException {
    List<String> nameList= demo2();for(String s:nameList)
    {
    System.out.println(s);
    }
}            
static List<String> demo2() throws IOException {
    List<String> nameList=new ArrayList<String>();
    FileReader r=new FileReader("C:/名单.txt");
    BufferedReader br=new BufferedReader(r);
    String str=null;while( (str=br.readLine())!=null ){
    nameList.add(str);
    }
     br.close();return nameList;
}

二、装饰设计模式

Decorator模式(别名Wrapper):动态将职责附加到对象上,若要扩展功能,装饰者提供了比继承更具弹性的代替方案。当要对已有的对象进行功能增强时,可以定义类,将已有对象传入,基于已有对象的功能,并提供加强功能。那么自定义的该类就称为装饰类。装饰类通常会通过构造方法接收被装饰的对象,并基于被装饰的对象的功能,提供更强的功能。

public class Teste3 {public static void main(String[] args) {
    Japan japan=new Japan();
    NiceJapan niceJapan=new NiceJapan(japan);
    niceJapan.speak();    
    }
}class Japan{void speak(){
    System.out.println("我们都是好学生");
    }
}class NiceJapan{
        NiceJapan(Japan japan){this.japan=japan;
    }private Japan japan;  //组合void speak(){
    System.out.println("清清嗓子");//其他动作System.out.println("晃晃脑袋");
    japan.speak();
    System.out.println("磕几个头");
    System.out.println("发几声惨叫");
    }
}

三、字节流概述

在不考虑负数的情况下,每个字节中的数据,都是0-255之间的值(因为一个字节为8位,最大为255)

如果一个文件中的每个字节或每相邻的几个字节的数据都可以表示成某个字符,则可以将这个文件称为文本文件,其实这是二进制的一个特例。

(你可以打开一个记事本,然后把一张图片拉进去,会发现一大堆的乱码,它就是二进制的特例,图片上的信息有的能与码表对上就被显示出来,有的不能就乱了。这是因为,字节流操作的时候,操作单位都是以字节为单位进行的操作的对象不一定有码表对应。

概述:

1.所有字节输入流类都是抽象类InputStream的子类

int read() 从源中读取一个字节的数据,返回字节值

int read(byte b[])从源中试图读取b.length个字节到b中,返回实际读取的字节目

void close()关闭输入流

2.所有字节输出流类都是抽象类OutputStream的子类

void write(int n) 向输出流写入单个字节。

void write(byte b[])向输出流写入一个字节数组

void flush()把缓冲区中内容输出并清空缓冲区(刷新)

void close()关闭输出流

3.例子,使用字节流进行文件的读写

FileOutputStream 用于写入诸如图像数据之类的原始字节的流。要写入字符流,请考虑使用 FileWriter。

FileOutputStream 的write方法的几种重载形式如下:

//void write(byte[] b)  //注意返回类型是void

//void write(byte[] b,  int off,  int len)

//void write(int b)     将指定字节写入此文件输出流。

//FileInputStream 的read方法的几种重载形式如下

//int read()   从此输入流中读取一个数据字节。 返回读到的字节,到尾返回-1

//int read(byte[] b)  从此输入流中将最多 b.length 个字节的数据读入一个 byte 数组中 返回读的字节数,到尾返回-1

//int read(byte[] b, int off, int len)  从此输入流中将最多 len 个字节的数据读入一个 byte 数组中。

//对于字节流来说,每次读到的就是一个字节,如果是英文,正好一个英文对应一个字节,如果中文,就可能对应两个字节

static void demo1() throws IOException{    
    OutputStream out=new FileOutputStream("c:/file1.txt");
    out.write("abcEnlish中国".getBytes());  //字节流不刷新也能写出去    out.close();
    
        InputStream in=new FileInputStream("c:/file1.txt");int ch=0;while((ch=in.read())!=-1  ){
    System.out.println((char)ch);  //可以发现,如果是英文,能显示出来,但中文会乱码        }
    in.close();
                    
}
//例子,用字节数组进行接收static void demo1()throws IOException {
    InputStream in=new FileInputStream("c:/名单.txt");byte [] buff=new byte[3];  //1024int len=0;while( (len=in.read(buff)) !=-1 ){
    String str=new String(buff,0,len);
    System.out.println(str);  //有乱码        }
}
//例子 available 的利用static void demo2()throws IOException{
    InputStream in=new FileInputStream("c:/名单.txt");byte [] buff=new byte[in.available()];   //in.available();当前流中还有多少个字节可读    in.read(buff);
    System.out.println(new String(buff));
    in.close();
}
//例子.图片的复制static void demo3()throws IOException  {
    InputStream in=new FileInputStream("C:\\image\\lengtu.jpg");byte [] buff=new byte[in.available()];
    in.read(buff);
    
        OutputStream out=new FileOutputStream("E:/tuzi.jpg");
    out.write(buff);
    in.close();
    out.close();
}

补充:

前面,字符流有包装类

BufferedReader,  BufferedWriter

字节流也有包装类

BufferedInputStream, BufferedOutputStream

四、转换流  InputStreamReader , OutputStreamWriter

把字节输入流转为字符输入流:

InputStreamReader    

public class  InputStreamReader extends Reader 

把字节输出流转为字符输出流:

OutputStreamWriter   

public class OutputStreamWriter extends Writer 

1) InputStreamReader

它有四个构造函数:

InputStreamReader(InputStream in)

InputStreamReader(InputStream in, Charset cs)

InputStreamReader(InputStream in, CharsetDecoder dec)  //CharsetDecoder 解码器

InputStreamReader(InputStream in, String charsetName) 

2) OutputStreamWriter 

它有四个构造函数:

OutputStreamWriter(OutputStream out) //创建使用默认字符编码的 OutputStreamWriter。

OutputStreamWriter(OutputStream out, CharsetEncoder enc) // 创建使用给定字符集的 OutputStreamWriter。

OutputStreamWriter(OutputStream out, String charsetName) // 创建使用给定字符集编码器的 OutputStreamWriter。

OutputStreamWriter(OutputStream out, String charsetName) // 创建使用指定字符集的 OutputStreamWriter。

//例子,用缓冲流包装转换流,转换流转换字节流InputStream in=new FileInputStream("c:/1.txt");
    InputStreamReader inputReader=new InputStreamReader(in);
    BufferedReader br=new BufferedReader(inputReader);
        String str=null;while((str=br.readLine())!=null){
    System.out.println(str);
}
//例子 从键盘读入数据,转成大写打印出来public static void main(String[] args) throws IOException {
    BufferedReader br=new BufferedReader( new InputStreamReader(System.in));
    String msg=null;while((msg=br.readLine())!=null){
        System.out.println(msg.toUpperCase());
        }
}

五、 ByteArrayInputStream 与ByteArrayOutputStream

它是用来以IO流的方式,完成对字节数组内容的读写,支持类似内存虚拟文件或内存映象文件的功能。

关闭 ByteArrayOutputStream 无效。此类中的方法在关闭此流后仍可被调用,而不会产生任何IOException。

//ByteArrayInputStream(byte[] buff) 

//ByteArrayInputStream(byte[] buff,int offset,int length)

//ByteArrayOutStream () //没有传参,则默认创建一个32字节的缓冲区,其中的数据被写入一个 byte 数组。缓冲区会随着数据的不断写入而自动增长。可使用 toByteArray()和toString()获取数据。

//ByteArrayOutStream(int size) 根据指定大小创建缓冲区

//ByteArrayOutStream 的  byte[] toByteArray() 创建一个新分配的 byte 数组。其大小是此输出流的当前大小,并且缓冲区的有效内容已复制到该数组中

 

//例子,使用 ByteArrayOutputStream ByteArrayOutputStream byteOut=new ByteArrayOutputStream();
    byteOut.write("这是放在虚拟内存中的数据".getBytes());                byte[] byteArray=byteOut.toByteArray();
    String str=new String(byteArray);
    System.out.println(str);
//加强 从输入流中,读取字符,然后把字符变成大写,写入到输出流中public static void main(String[] args) throws IOException {/* 示例1 用 ByteArrayInputStream 和 ByteArrayOutputStream
    ByteArrayInputStream in=new ByteArrayInputStream("abcdef".getBytes());
    ByteArrayOutputStream out=new ByteArrayOutputStream();
    transform(in,out);
                    
    byte  [] contents=out.toByteArray();
    String str=new String(contents);
    System.out.println(str); */// 示例2 用键盘输入输出流        transform(System.in,System.out); 
                    // 示例3 用文件输入输出流InputStream in =new FileInputStream("c:/1.txt");
    OutputStream out =new FileOutputStream("e:/big.txt");
                     
    transform(in,out);
                    
}                
                
static void transform(InputStream in,OutputStream out) throws IOException{int ch=0;while((ch=in.read())!=-1){
        out.write(Character.toUpperCase(ch));
    }
}

 

以上是Java基础入门之iO的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
如何将Maven或Gradle用于高级Java项目管理,构建自动化和依赖性解决方案?如何将Maven或Gradle用于高级Java项目管理,构建自动化和依赖性解决方案?Mar 17, 2025 pm 05:46 PM

本文讨论了使用Maven和Gradle进行Java项目管理,构建自动化和依赖性解决方案,以比较其方法和优化策略。

如何使用适当的版本控制和依赖项管理创建和使用自定义Java库(JAR文件)?如何使用适当的版本控制和依赖项管理创建和使用自定义Java库(JAR文件)?Mar 17, 2025 pm 05:45 PM

本文使用Maven和Gradle之类的工具讨论了具有适当的版本控制和依赖关系管理的自定义Java库(JAR文件)的创建和使用。

如何使用咖啡因或Guava Cache等库在Java应用程序中实现多层缓存?如何使用咖啡因或Guava Cache等库在Java应用程序中实现多层缓存?Mar 17, 2025 pm 05:44 PM

本文讨论了使用咖啡因和Guava缓存在Java中实施多层缓存以提高应用程序性能。它涵盖设置,集成和绩效优势,以及配置和驱逐政策管理最佳PRA

如何将JPA(Java持久性API)用于具有高级功能(例如缓存和懒惰加载)的对象相关映射?如何将JPA(Java持久性API)用于具有高级功能(例如缓存和懒惰加载)的对象相关映射?Mar 17, 2025 pm 05:43 PM

本文讨论了使用JPA进行对象相关映射,并具有高级功能,例如缓存和懒惰加载。它涵盖了设置,实体映射和优化性能的最佳实践,同时突出潜在的陷阱。[159个字符]

Java的类负载机制如何起作用,包括不同的类载荷及其委托模型?Java的类负载机制如何起作用,包括不同的类载荷及其委托模型?Mar 17, 2025 pm 05:35 PM

Java的类上载涉及使用带有引导,扩展程序和应用程序类负载器的分层系统加载,链接和初始化类。父代授权模型确保首先加载核心类别,从而影响自定义类LOA

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
4 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
4 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
1 个月前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.聊天命令以及如何使用它们
1 个月前By尊渡假赌尊渡假赌尊渡假赌

热工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

功能强大的PHP集成开发环境

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )专业的PHP集成开发工具

SecLists

SecLists

SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

DVWA

DVWA

Damn Vulnerable Web App (DVWA) 是一个PHP/MySQL的Web应用程序,非常容易受到攻击。它的主要目标是成为安全专业人员在合法环境中测试自己的技能和工具的辅助工具,帮助Web开发人员更好地理解保护Web应用程序的过程,并帮助教师/学生在课堂环境中教授/学习Web应用程序安全。DVWA的目标是通过简单直接的界面练习一些最常见的Web漏洞,难度各不相同。请注意,该软件中

VSCode Windows 64位 下载

VSCode Windows 64位 下载

微软推出的免费、功能强大的一款IDE编辑器