说来惭愧,工作一年多了,对io仍然不是很了解。不仅是io,还有网络,还有多线程。shame!!!

接下来的日子里,先搞多线程,再搞io,再搞网络,半年内一定要完成!

好了,今天终于搞懂了outputStream 的三个write的区别,这里小记一下

1.文档里的说明

write(byte[] b) 
          Writes b.length bytes from the specified byte array to this file output stream.

write(byte[] b, int off, int len) 
          Writes len bytes from the specified byte array starting at offset off to this file output stream.

write(int b) 
          Writes the specified byte to this file output stream.

2.理解

① write(byte[] b) 是每次写b.length个字节,即使最后一个byte数组里面没读满,也会写b.lenth个字节

eg:

FileInputStream in = new FileInputStream(new File("C:/Users/admin/Desktop/js/node.txt"));
byte b[] = new byte[50];
FileOutputStream out = new FileOutputStream(new File("C:/Users/admin/Desktop/js/node1.txt"));
int len = 0;
System.out.println("总长度"+in.available());
while(( len = in.read(b))!=-1){
System.out.println(len);
out.write(b);
}
in.close();
out.flush();
out.close();

原文件内容

写出的文件

控制台输出

可以看出,由于最后一次读取的字节其实只有4个,但是输出的文件却多了很多(46个字节应该),好像是把上一次读取的内容写入了

所以,即使最后一个byte数组里面没读满,也会写b.lenth个字节

② write(byte[] b, int off, int len)

off一半是0

len 就是这次该写多少个字节

把上面的代码改为

FileInputStream in = new FileInputStream(new File("C:/Users/admin/Desktop/js/node.txt"));
byte b[] = new byte[50];
FileOutputStream out = new FileOutputStream(new File("C:/Users/admin/Desktop/js/node1.txt"));
int len = 0;
System.out.println("总长度"+in.available());
while(( len = in.read(b))!=-1){
System.out.println(len);
out.write(b,0,len);
}
in.close();
out.flush();
out.close();

区别在于out.write 方法

这样的话,写出的文件就没有问题了,最后一次读取4个字节,就写4个字节。

③ write(int b)

Writes the specified byte to this output stream. The general contract for write is that one byte is written to the output stream. The byte to be written is the eight low-order bits of the argument b. The 24 high-order bits of b are ignored.

不懂。。。

java-IO小记的更多相关文章

  1. Java JPA小记

    什么是JPA JPA之于ORM(持久层框架,如MyBatis.Hibernate等)正如JDBC之于数据库驱动. JDBC是Java语言定义的一套标准,规范了客户端程序访问关系数据库(如MySQL.O ...

  2. java.IO输入输出流:过滤流:buffer流和data流

    java.io使用了适配器模式装饰模式等设计模式来解决字符流的套接和输入输出问题. 字节流只能一次处理一个字节,为了更方便的操作数据,便加入了套接流. 问题引入:缓冲流为什么比普通的文件字节流效率高? ...

  3. Java:IO流与文件基础

    Java:IO流与文件基础 说明: 本章内容将会持续更新,大家可以关注一下并给我提供建议,谢谢啦. 走进流 什么是流 流:从源到目的地的字节的有序序列. 在Java中,可以从其中读取一个字节序列的对象 ...

  4. Java IO之字符流和文件

    前面的博文介绍了字节流,那字符流又是什么流?从字面意思上看,字节流是面向字节的流,字符流是针对unicode编码的字符流,字符的单位一般比字节大,字节可以处理任何数据类型,通常在处理文本文件内容时,字 ...

  5. java Io流向指定文件输入内容

    package com.hp.io; import java.io.*; public class BufferedWriterTest{ public static void main(String ...

  6. java Io文件输入输出流 复制文件

    package com.hp.io; import java.io.FileInputStream; import java.io.FileNotFoundException; import java ...

  7. java Io流更新文件内容

    package com.hp.io; import java.io.FileOutputStream; import java.io.IOException; public class FileOut ...

  8. java IO流详解

    流的概念和作用 学习Java IO,不得不提到的就是JavaIO流. 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...

  9. java.io.NotSerializableException: test.io.file.Student

    java.io.NotSerializableException: test.io.file.Student    at java.io.ObjectOutputStream.writeObject0 ...

  10. java.io.IOException: mark/reset not supported

    java.io.IOException: mark/reset not supported at java.io.InputStream.reset(InputStream.java:348) at ...

随机推荐

  1. ArchLinux下Shell基础学习

    首先来认识脚本语言:通常指的是命令行界面的解析器.(来自维基的解释) 第一部分:认识Shell 大家可以看到这里使用了#!/bin/sh和!/bin/bash.可是俩者有什么区别呢?下图有解释. sh ...

  2. Windows下Anaconda安装 python + tensorflow CPU版

    下载安装Anaconda 首先下载Anaconda,可以从清华大学的镜像网站进行下载. 安装Anaconda,注意安装时不要将添加环境变量的选项取消掉. 安装完成之后,在安装目录下cmd,输入: co ...

  3. 修改testng源码,添加beforeMethod和afterMethod中的日志到test中(可以不改源码,废弃)

    在使用testng生成报告的时候,只会记录test方法中的日志,但是一般会在beforeMethod.beforeTest.afterMethod.afterTest中做一下数据的处理,这里面的日志没 ...

  4. 2018牛客多校1 - J Different Integers 莫队/主席树签到

    题意:给出n<5e4,a[1...n],单次1e5总次1e6次查询除去区间(L,R)的数的个数 开场5分钟:莫队是不可能莫队的,这道题是不可能莫队的 最后1小时:真香 具体操作没啥特别的,注意一 ...

  5. JVM架构和GC垃圾回收机制

    深入理解系列之JDK8下JVM虚拟机(1)——JVM内存组成 https://blog.csdn.net/u011552404/article/details/80306316 JVM架构和GC垃圾回 ...

  6. TestGc finalize()

    package com.gc; public class TestGc { public static void main(String[] args) { Man man = new Man(&qu ...

  7. Ubuntu 16.04安装IntelliJ出品的数据库管理工具DataGrip

    IntelliJ出品的东西有一个共同特定,就是代码提示做的非常好. DataGrip是除了MySQL Workbench之外的另一个选择. 一.下载 https://www.jetbrains.com ...

  8. JavaScript 刷题一

    最近读<JavaScirpt编程精解>,想把里面的三个大的程序实现,现在记录下来. 问题一: 从下面这封信中,emily奶奶每封信的结尾都会用同样的格式注明哪只猫出生了,哪只猫死去了.现要 ...

  9. 使用java配置来构建spring项目

    java配置是Spring4.x推荐的配置方式,可以完全代替xml配置,java配置是通过@Configuration和@Bean来实现的.@Configuration声明当前类是一个配置类,相当于S ...

  10. FocusBI: SSIS体系结构(原创)

    关注微信公众号:FocusBI 查看更多文章:加QQ群:808774277 获取学习资料和一起探讨问题. <商业智能教程>pdf下载地址 链接:https://pan.baidu.com/ ...