csdn:blog.csdn.net/Kibaco

微信公众号: 杨正友

学习目标

java传统io如何使用

非阻塞 nio 是怎么回事

okio 的优势与使用

java传统io: 流

从文件读数据到内存里面,方便操作网络数据和本地文件,操作更加灵活了,所有的操作都是利用String来代替

熟悉java io 的基本操作

就是 24_io.txt 如果没有 就会帮忙创建,如果有就不会创建,这个就是用java io做的一个基本操作

try {

// 输出流的管子

final FileOutputStream fileOutputStream = new FileOutputStream("./24_io/24_io.txt");

fileOutputStream.write('a');

fileOutputStream.write('b');

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

复制代码

不是直接操作文件,而是直接操作流,通过一根管子,插到这个文件上,然后对这个流进行操作,这样可以对不同的外部对象使用统一的操作形式,不管是往一个文件还是网络还是其他形式,我都是创造一个String的格式,然后往这个String 去写 或者 去存 然后去读 这个String,相当于在程序内部和外界之间搭建了一个桥梁 ,我虽然把处理单件事件变复杂了,比如:我一辈子都处理文件,或者一辈子处理网络 ,把这个变复杂了,但是整体上有一个一致性,所以扩展性变更好了,由于这个扩展性,他做的事情也变多了,不止是可以读写文件,还可以和网络交互,而且还有其他形式可以和网络操作,也可以通过其他扩展的String来操作

java 文件的 读取操作

资源的持有会消耗内存,所以我们在不需要这些资源的时候我们需要释放这些资源,所谓的释放就是把文件关闭,把文件的关闭本质就是把流给舍弃调,java 7 以下我们需要在 finally处理如下:

InputStream sFileInputStream = null;

try {

sFileInputStream = new FileInputStream("./24_io/24_io.txt");

System.out.println((char) sFileInputStream.read());

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

} finally {

if (sFileInputStream != null) {

try {

sFileInputStream.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

复制代码

java 7 以及以上 在 try () 处理即可,自动关流

try (InputStream sFileInputStream = new FileInputStream("./24_io/24_io.txt")) {

System.out.println((char) sFileInputStream.read());

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

复制代码

所有的流都实现了 Closeable,所有的 Closeable 如果在try 里面做初始化 都会被自动关闭

public abstract class InputStream implements Closeable {}

复制代码

怎么和文件进行互操作,怎么把文件转换成字符?

try (InputStream sFileInputStream = new FileInputStream("./24_io/24_io.txt")) {

Reader inputStreamReader = new InputStreamReader(sFileInputStream);

final BufferedReader bufferedInputStream = new BufferedReader(inputStreamReader);

System.out.println(bufferedInputStream.readLine());

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

复制代码

readLine的本身的意义不是一行读,他会额外读一些内容到自己内部,它本身的意思是增加缓冲,他会额外读一些内容到缓冲

从BufferReader 源码可以看出:

private static int defaultCharbufferSize = 8192

复制代码

默认可以读 8192 个字节,为了提高性能,我们必须设置一个默认值

Buffer 写数据 其实是在缓冲里面放数据,所以写完之后记得及时 flush 将目标东西刷新到目标区

try (OutputStream sFileInputStream = new FileOutputStream("./24_io/24_io.txt")) {

final BufferedOutputStream inputStream = new BufferedOutputStream(sFileInputStream);

inputStream.write('a');

inputStream.write('b');

inputStream.write('M');

inputStream.flush();

} catch (Exception e) {

e.printStackTrace();

}

复制代码

如: outPutStream 没有 flush 不会写成功的,那么为什么Buffer不能自动刷新呢?

因为缓冲是为了做效率, 和文件操作性能会比较低,所以尽量减少这样的操作,把频率降低,把多次io给合起来,这样才能提高性能呢.Buffer 会导致输出不同步这是必然的事情

同样在 try 里面 做数据包装操作,也会自动刷新缓存到目标区

try (OutputStream sFileInputStream = new FileOutputStream("./24_io/24_io.txt"); final BufferedOutputStream inputStream = new BufferedOutputStream(sFileInputStream)) {

inputStream.write('a');

inputStream.write('b');

inputStream.write('M');

} catch (Exception e) {

e.printStackTrace();

}

复制代码

文件复制

java没有文件复制的功能的,那么怎么做文件复制呢,我们要做的是把文件数据一个一个搬

try (InputStream fileInputStream = new FileInputStream("./24_io/24_io.txt");

OutputStream outputstream = new FileOutputStream("./24_io/text_copy.txt")) {

final byte[] bytes = new byte[1024];

int read = 0;

while ((read = fileInputStream.read(bytes)) != -1) {

outputstream.write(bytes, 0, read);

}

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

复制代码

如果想提高性能 我们可以加 Buffer

这就是 Java 的 I/O 原理,核心就是:内存与外界的交互,你可以用 inputStream 和 outPutStream 做对接

Socket 和 ServerSocket 之间的网络交互

和文件交互是 java i/o 里面 和 网络进行交互的,就像和文件交互 用 File

比如: 我做个服务器

try {

final ServerSocket serverSocket = new ServerSocket(8080);

final Socket socket = serverSocket.accept();

final BufferedReader reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));

final BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));

while (true) {

final String data = reader.readLine();

writer.write("你给我输入了: " + data);

writer.flush();

}

} catch (IOException e) {

e.printStackTrace();

}

复制代码

nio 与传统 io的区别

传统io用的是插管道的方式

nio 的 Channel 是双向的,传统io是单向的

try {

final RandomAccessFile file = new RandomAccessFile("./24_io/24_io.txt", "r");

final FileChannel channel = file.getChannel();

final ByteBuffer byteBuffer = ByteBuffer.allocate(1024);

channel.read(byteBuffer);

byteBuffer.flip();

System.out.println(Charset.defaultCharset().decode(byteBuffer));

} catch (FileNotFoundException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}

复制代码

nio 也用到了缓冲 buffer nio 可以被操作的,nio的Buffer是强制使用的,不好用

try {

final ServerSocketChannel channel = ServerSocketChannel.open();

channel.bind(new InetSocketAddress(8080));

final SocketChannel socketChannel = channel.accept();

final ByteBuffer byteBuffer = ByteBuffer.allocate(1024);

while (socketChannel.read(byteBuffer) != -1) {

byteBuffer.flip();

socketChannel.write(byteBuffer);

byteBuffer.clear();

}

} catch (IOException e) {

e.printStackTrace();

}

复制代码

nio 有非阻塞的支持,只能网络才能使用

try {

final ServerSocketChannel channel = ServerSocketChannel.open();

channel.bind(new InetSocketAddress(8080));

channel.configureBlocking(false);

final SocketChannel socketChannel = channel.accept();

final ByteBuffer byteBuffer = ByteBuffer.allocate(1024);

while (socketChannel.read(byteBuffer) != -1) {

byteBuffer.flip();

socketChannel.write(byteBuffer);

byteBuffer.clear();

}

} catch (IOException e) {

e.printStackTrace();

}

复制代码

为什么 非阻塞式 nio 设置 configureBlocking 开关 会报NullException?

Exception in thread "main" java.lang.NullPointerException

复制代码

因为 channel.accept() 没有拿到数据,socketChannel 为 null,还没有发起请求就设置 false了

okio

okio 作为一个外部对象作为输入输出,okio是独立形式存在的.

try (BufferedSource source = Okio.buffer(Okio.source(new File("./24_io/24_io.txt")) )) {

final Buffer buffer = new Buffer();

source.read(buffer, 1024);

System.out.println(buffer.readUtf8());

} catch (Exception e) {

e.printStackTrace();

}

复制代码

okio 和 传统 io 作交互

final Buffer buffer = new Buffer();

try (BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(buffer.outputStream()));

BufferedReader bufferReader = new BufferedReader(new InputStreamReader(buffer.inputStream()))) {

writer.write("哈哈哈哈");

writer.flush();

System.out.println("read: " + bufferReader.readLine());

} catch (IOException e) {

e.printStackTrace();

}

复制代码

java去o操作_Java I/O 和 oKio相关推荐

  1. java去o操作,Java 文件I/O操作

    一.目的 1.学习如何将数据写入文件和从文件读出数据 2.通过实现"图案解锁"的编写熟悉文件的相关操作 二.涉及知识点 1.流 I/O流的方向:参考的是自己的内存空间 I/O流对象 ...

  2. java io文件操作_java IO 文件操作方法总结

    java IO 文件操作方法总结 对于输入输出的理解: 输入输出,以程序为参考点,外部数据进入程序,通过输入流完成.程序将数据给外部设备,通过输出流完成. 文件Io的操作 //获取文件 File fi ...

  3. java底层 文件操作_JAVA的文件操作【转】

    11.3 I/O类使用 由于在IO操作中,需要使用的数据源有很多,作为一个IO技术的初学者,从读写文件开始学习IO技术是一个比较好的选择.因为文件是一种常见的数据源,而且读写文件也是程序员进行IO编程 ...

  4. java web 数据库操作_Java Web----Java Web的数据库操作(二)

    Java Web的数据库操作 三.JDBC操作数据库 上一篇介绍了JDBC API,之后就可以通过API来操作数据库,实现对数据库的CRUD操作了. 下面仅以示例 的方式对数据库操作进行说明 1. 添 ...

  5. java web 数据库操作_Java Web----Java Web的数据库操作(三)

    Java Web的数据库操作 前面介绍了JDBC技术和JDBC API及API的使用示例,下面详细介绍JDBC在Web中的应用. 四.JDBC在Java Web中的应用 通常情况下,Web程序操作数据 ...

  6. java实现点歌操作_Java中linked list集合实现KTV点歌台功能

    Java中linked list集合实现KTV点歌台功能 //Java实现KTV点歌台基础功能 import java.util.*; public class KTV { public static ...

  7. java excel 表格操作_Java实现操作excel表格

    最近老师布置了个任务,用Java对excel后缀名为xlsx的文件进行简单的增,删,改,查操作:虽说是个简单的程序,可作为刚接触的我来说还是有些磕磕碰碰.不过好在还是完成了,进行一个简单的总结. 首先 ...

  8. java byte数组操作_Java byte数组操纵方式代码实例解析

    字节数组的关键在于它为存储在该部分内存中的每个8位值提供索引(快速),精确的原始访问,并且您可以对这些字节进行操作以控制每个位. 坏处是计算机只将每个条目视为一个独立的8位数 - 这可能是你的程序正在 ...

  9. java的日期操作_java中对时间的操作详解

    代码演示: //数据库中去的日期 Date s = list.get(0).getSdate(); System.out.println(s);// Tue Apr 28 00:00:00 CST 2 ...

最新文章

  1. ECSHOP 数据库结构说明
  2. Silverlight中的ControlTemplate(2)
  3. java乱码怎么解决_如何解决java乱码
  4. java 文件流的处理 文件打包成zip
  5. BZOJ 1012 [JSOI2008]最大数maxnumber
  6. js_long.php,protobuf.js 与 Long.js的使用详解
  7. 信息学奥赛C++语言: 开关灯1
  8. 19软件班专业英语学期总结
  9. 联发科推全新P系芯片 聚焦中端市场
  10. oracle+10g+cpu补丁,Oracle 10g打补丁(p5490848_10202_LINUX)
  11. 教学楼电梯调度需求分析
  12. Lua学习(一):luac、luajit编译与反编译
  13. UE4 蓝图入门学习笔记
  14. 中国物联网、物联网卡进入蓬勃发展阶段
  15. Reason: Canonical names should be kebab-case (‘-‘ separated), lowercase alpha-numeric characters and
  16. 在Unity中利用Mono.Cecil将代码注入到Dll中
  17. 语雀 | markdown文档编写常用快捷键
  18. VScode 中运行C++,并用g++命令、CMake、配置launch.josn和tasks.json来运行和调试可执行文件
  19. PPT的常用技巧(1):
  20. 工资3000,靠国际版抖音TikTok月入2W+:这个风口真的很赚钱!

热门文章

  1. emoji 表情 php 转换,emoji的表情转换PHP类库
  2. 大学计算机基础是什么时候学,大学计算机基础教学大纲(72学时版).docx
  3. mysql连接的特性及拖库姿势
  4. Head First Java: Chapter6 JavaCross7.0 答案整理
  5. 可能我也没有想到,我能把写文章这件事因为一个小小的念头而坚持下来!
  6. 基于JAVA毕业设计的客户关系系统的设计与实现
  7. macbook 定时提醒发送邮件
  8. 【Linux】软件安装(三分钟教会你如何在linux下安装软件)
  9. python 日历壁纸_winform壁纸工具:为图片添加当月的日历并设为壁纸 .
  10. NAS,IP SAN以及iSCSCI SAN存储的一些认识和理解