深入IO 想学必看!受益匪浅哦~
2018-07-06 01:24:37来源:博客园 阅读 ()
一:IO流概述
我们的程序需要通过InputStream或Reader从数据源读取数据,然后用OutputStream或者Writer将数据写入到目标媒介中。其中,InputStream和Reader与数据源相关联,OutputStream和writer与目标媒介相关联。 以下的图说明了这一点:
二:字符流
public class CharDemo { public static void main( String[] args ) { //创建输入和输出流 Reader reader = null; Writer writer = null; try { //目的是明确数据要存放的目的地。 reader = new FileReader("e:/a.txt"); writer = new FileWriter("e:/a.txt",true); //在文件中写入 writer.write("啦啦啦"); writer.write("啦啦啦"); writer.write("我是卖报的小行家"); //清空缓冲区 writer.flush(); writer.write("啦啦啦"); writer.write("啦啦啦"); writer.write("啦啦啦"); writer.close(); //读取 //创建一次性读取多少个字符 char[] data = new char[1024]; int num = 0; StringBuffer sb = new StringBuffer(); //判断如果文件中有数据,则在后面追加数据 while ((num = reader.read(data))!=-1){ sb.append(data); } System.out.println(sb.toString()); } catch (Exception e) { e.printStackTrace(); } finally { try { // writer.close();应该放到添加数据完之后 reader.close(); } catch (IOException e) { e.printStackTrace(); } } } }
三:字节流
在Java中,字节流一般适用于处理字节数据(诸如图片、视频),字符流适用于处理字符数据(诸如文本文件),但二者并没有严格的功能划分,因为有转换流的存在,使得对于数据的处理变得更加灵活。InputStream和OutputStream分别是字节输入流与字节输出流的基类,它们的子类都是字节流,主要用在按字节来处理二进制数据。废话不多说,上示例!
public class ByteDemo { public static void main( String[] args ) { //创建输入流和输出流对象 InputStream inputStream = null; OutputStream outputStream = null; try { inputStream = new FileInputStream("e:/a.txt"); //true 代表是否向文件中拼接,不删除之前的内容 outputStream = new FileOutputStream("e:/a.txt",true); //先向文件写入内容 outputStream.write("54321".getBytes());//outputStream.flush();自己没有实现 //read方法将返回0-255之间的数字 如果流读到了最后,将返回-1 int num = 0; while ((num=inputStream.read())!=1){ System.out.println((char) num); } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { inputStream.close(); outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } }
四:二进制流
二进制流有两个顶级类:InputStream和OutputStream, 下面的两个类是各种附属类。作为对比,二进制流的关系比字符流的更加多样化和复杂。关于二进制流,LineNumberInputStream和StringBufferInputStream两个类在JDK1.5中,尽量不要使用,因为它们已被弃用。
public class DataDemo { public static void main(String[] args) { //创建输入流和输出流对象 InputStream inputStream = null; OutputStream outputStream=null; DataInputStream dis = null; DataOutputStream dos=null; try { //获取了输入流 txt进入内存 inputStream=new FileInputStream("e:/a.txt"); dis=new DataInputStream(inputStream); //获取输出流 outputStream=new FileOutputStream("e:/public/a.txt"); dos=new DataOutputStream(outputStream); //先读取 int num=0; while ((num=dis.read())!=-1){ dos.write(num); //复制 } } catch (Exception e) { e.printStackTrace(); }finally { //释放资源 try { dos.close(); dis.close(); outputStream.close(); inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } }
五:缓冲流
定义:在内存与硬盘之间创建一个大小合适的缓冲区,当内存和硬盘进行数据访问时,能提高访问硬盘的次数,提高效率。
分类:缓冲分为字节缓冲流(BufferedInputStream和BufferedOutputStream)和字符缓冲流(BufferedReader和BufferedWrite)。
小小的案例,大大的了解~
public class BufferDemo { public static void main(String[] args) { //创建输出流 Reader reader = null; Writer writer = null; BufferedReader br = null; BufferedWriter bw = null; try { writer = new FileWriter("e:/a.txt",true); bw = new BufferedWriter(writer); bw.write("你好!");
//换行 bw.newLine(); bw.write("llll");
//清空缓冲区 bw.flush(); bw.write("222"); bw.write("333"); bw.write("444"); bw.close(); writer.close(); //如果不关闭 后续两句话没法获取 //读取 reader=new FileReader("e:/a.txt"); br=new BufferedReader(reader);//封装 String line=null; StringBuffer sb=new StringBuffer(); while ((line=br.readLine())!=null){ sb.append(line); } System.out.println(sb.toString()); } catch (IOException e) { e.printStackTrace(); }finally { try { br.close(); reader.close(); } catch (IOException e) { e.printStackTrace(); } } } }
六:序列化和反序列化
序列化:把对象转换为字节序列的过程称为对象的序列化。(持续化)
反序列化:把字节序列恢复为对象的过程称为对象的反序列化。
比如说登陆注册,注册就是序列化,登陆就是反序列化!!!为什么呢?注册,就是把用户的信息存储到硬盘中,就是持久化!登陆就是把信息再返回来,意思就是,从硬盘中读取出来,称之为反序列化!
来个栗子更直观一些!
首先来一个实体类
package com.ftx; import java.io.Serializable; /** * @author 岔气的猫 * @create 2018-07-03 15:49 * @博客地址:https://home.cnblogs.com/u/fl72/ * 必须实现Serializable接口,否则在执行过程中,会报错!实现不了序列化 **/ public class User implements Serializable { private String userName; private String userPassword; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } public String getUserPassword() { return userPassword; } public void setUserPassword(String userPassword) { this.userPassword = userPassword; } public User(String userName, String userPassword) { this.userName = userName; this.userPassword = userPassword; } public User() { } @Override public String toString() { return "User{" + "userName='" + userName + '\'' + ", userPassword='" + userPassword + '\'' + '}'; } }
接下来,好戏就要开始喽!
public class ObjectDemo { static Scanner input = new Scanner(System.in); //创建需要的输入和输出流对象 static InputStream inputStream = null; static OutputStream outputStream = null; static ObjectInputStream objectInputStream = null; static ObjectOutputStream objectOutputStream = null; public static void main(String[] args) { //注册 序列化 //register(); //登录 反序列化 login(); } //注册 private static void register() { User user = new User(); System.out.println("请输入您的用户名:"); user.setUserName(input.next()); System.out.println("请输入您的密码:"); user.setUserPassword(input.next()); try { outputStream = new FileOutputStream("e:/user.txt"); objectOutputStream = new ObjectOutputStream(outputStream); //把对象输出到文件中 objectOutputStream.writeObject(user); } catch (Exception e) { e.printStackTrace(); } finally { try { objectOutputStream.close(); outputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } //登录 private static void login() { try { inputStream = new FileInputStream("e:/user.txt"); objectInputStream = new ObjectInputStream(inputStream); //读取对象 User user = (User) objectInputStream.readObject(); System.out.println(user); } catch (Exception e) { e.printStackTrace(); } finally { try { objectInputStream.close(); inputStream.close(); } catch (IOException e) { e.printStackTrace(); } } } }
怎么样,明白了吗?
七:字节流转字符流
public static void convertByteToChar() throws IOException{ File file= new File( "d:/test.txt"); //获得一个字节流 InputStream is= new FileInputStream( file); //把字节流转换为字符流,其实就是把字符流和字节流组合的结果。 Reader reader= new InputStreamReader( is); char [] byteArray= new char[( int) file.length()]; int size= reader.read( byteArray); System. out.println( "大小:"+size +";内容:" +new String(byteArray)); is.close(); reader.close(); }
八:File的使用
public class FileDemo { static Scanner input=new Scanner(System.in); public static void main( String[] args ) { System.out.println( "*************欢迎进入文件操作系统*************" ); System.out.println( "*************1.创建文件*************" ); System.out.println( "*************2.删除文件*************" ); System.out.println( "*************3.修改文件*************" ); System.out.println( "*************4.创建文件夹*************" ); System.out.println( "*************5.查询文件夹下所有的文件列表*************" ); System.out.println( "*************请选择:*************" ); //获取用户的输入 int choose = input.nextInt(); switch (choose){ case 1://创建文件 createNewFile(); break; case 2://删除文件 deleteFile(); break; case 3://修改文件 updateFile(); break; case 4://创建文件夹 mkdirs(); break; case 5://查询文件夹下所有的文件列表 findFileList(); break; } } //查询文件夹下所有的文件列表 private static void findFileList() { System.out.println("请您输入需要查询的文件夹的名称:(默认是E:/)"); String fileName = input.next(); //创建File对象 File file=new File("E:/"+fileName); File[] files = file.listFiles(); int driNums = 0; int fileNums = 0; System.out.println("此文件夹下包含了:"); for (File f:files) { if (f.isDirectory()){ driNums++; System.out.println(f.getName()); } if (f.isFile()){ fileNums++; System.out.println(f.getName()); } } System.out.println("此文件夹下的文件夹有"+driNums); System.out.println("此文件夹下的文件有"+fileNums); } //创建文件夹 private static void mkdirs() { System.out.println("请您输入创建的文件的名称:(默认是E:/)"); String fileName = input.next(); //创建File对象 File file=new File("E:/"+fileName); if(file.mkdirs()){ System.out.println("创建成功!"); }else{ System.out.println("创建失败!"); } } //修改文件 private static void updateFile() { System.out.println("请您输入需要修改的文件的名称:(默认是E:/)"); String oldFileName = input.next(); System.out.println("请您输入修改后的文件的名称:(默认是E:/)"); String newFileName = input.next(); //创建File对象 File oldFile=new File("E:/"+oldFileName); File newFile=new File("E:/"+newFileName); if (oldFile.renameTo(newFile)){ System.out.println("修改成功!"); }else { System.out.println("修改失败!"); } } //删除文件 private static void deleteFile() { System.out.println("请您输入需要删除的文件的名称:(默认是E:/)"); String fileName = input.next(); //创建File对象 File file=new File("E:/"+fileName); if(file.exists()){ boolean falg = file.delete(); if (falg){ System.out.println("删除成功!"); }else { System.out.println("删除失败!"); } }else { System.out.println("您输入的文件不存在!"); } } //创建文件 private static void createNewFile() { System.out.println("请您输入文件的名称:(默认是E:/)"); String fileName = input.next(); //创建File对象 File file=new File("E:/"+fileName); if (file.exists()){ //文件已经存在 System.out.println("该文件已经存在!"); }else{ try { boolean flag= file.createNewFile(); if (flag){ System.out.println("文件创建成功!"); }else{ System.out.println("文件创建失败!"); } } catch (IOException e) { e.printStackTrace(); } } } }
标签:
版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有
上一篇:Java教程
下一篇:Java基础(三)面向对象(下)
- 深入解析ThreadLocal和ThreadLocalMap 2020-06-08
- 深入理解:设计模式中的七大设计原则 2020-06-07
- 深入浅出 Java 类加载机制! 2020-06-05
- 一文带你深入理解JVM,看完之后你还敢说你懂JVM吗?颠覆you 2020-06-02
- 深入理解Mybatis(第一讲)——手写ORM框架(简易版Mybatis 2020-06-01
IDC资讯: 主机资讯 注册资讯 托管资讯 vps资讯 网站建设
网站运营: 建站经验 策划盈利 搜索优化 网站推广 免费资源
网络编程: Asp.Net编程 Asp编程 Php编程 Xml编程 Access Mssql Mysql 其它
服务器技术: Web服务器 Ftp服务器 Mail服务器 Dns服务器 安全防护
软件技巧: 其它软件 Word Excel Powerpoint Ghost Vista QQ空间 QQ FlashGet 迅雷
网页制作: FrontPages Dreamweaver Javascript css photoshop fireworks Flash