JavaIO流的40多个类都是从如下4个抽象类基类中派生出来的。
InputStream用于从源头(通常是文件)读取数据(字节信息)到内存中,java.io.InputStream抽象类是所有字节输入流的父类。
InputStream常用方法:
从Java9开始,InputStream新增加了多个实用的方法:
FileInputStream是一个比较常用的字节输入流对象,可直接指定文件路径,可以直接读取单字节数据,也可以读取至字节数组中。
FileInputStream代码示例:
输出:
Numberofremainingbytes:11Theactualnumberofbytesskipped:2Thecontentreadfromfile:JavaGuide不过,一般我们是不会直接单独使用FileInputStream,通常会配合BufferedInputStream(字节缓冲输入流,后文会讲到)来使用。
像下面这段代码在我们的项目中就比较常见,我们通过readAllBytes()读取输入流所有字节并将其直接赋值给一个String对象。
OutputStream用于将数据(字节信息)写入到目的地(通常是文件),java.io.OutputStream抽象类是所有字节输出流的父类。
OutputStream常用方法:
FileOutputStream是最常用的字节输出流对象,可直接指定文件路径,可以直接输出单字节数据,也可以输出指定的字节数组。
FileOutputStream代码示例:
类似于FileInputStream,FileOutputStream通常也会配合BufferedOutputStream(字节缓冲输出流,后文会讲到)来使用。
个人认为主要有两点原因:
乱码问题这个很容易就可以复现,我们只需要将上面提到的FileInputStream代码示例中的input.txt文件内容改为中文即可,原代码不需要改动。
Numberofremainingbytes:9Theactualnumberofbytesskipped:2Thecontentreadfromfile:§¥可以很明显地看到读取出来的内容已经变成了乱码。
因此,I/O流就干脆提供了一个直接操作字符的接口,方便我们平时对字符进行流操作。如果音频文件、图片等媒体文件用字节流比较好,如果涉及到字符的话使用字符流比较好。
Reader用于从源头(通常是文件)读取数据(字符信息)到内存中,java.io.Reader抽象类是所有字符输入流的父类。
Reader用于读取文本,InputStream用于读取原始字节。
Reader常用方法:
InputStreamReader是字节流转换为字符流的桥梁,其子类FileReader是基于该基础上的封装,可以直接操作字符文件。
//字节流转换为字符流的桥梁publicclassInputStreamReaderextendsReader{}//用于读取字符文件publicclassFileReaderextendsInputStreamReader{}FileReader代码示例:
Theactualnumberofbytesskipped:3Thecontentreadfromfile:我是Guide。Writer(字符输出流)Writer用于将数据(字符信息)写入到目的地(通常是文件),java.io.Writer抽象类是所有字节输出流的父类。
Writer常用方法:
OutputStreamWriter是字符流转换为字节流的桥梁,其子类FileWriter是基于该基础上的封装,可以直接将字符写入到文件。
//字符流转换为字节流的桥梁publicclassInputStreamReaderextendsReader{}//用于写入字符到文件publicclassFileWriterextendsOutputStreamWriter{}FileWriter代码示例:
IO操作是很消耗性能的,缓冲流将数据加载至缓冲区,一次性读取/写入多个字节,从而避免频繁的IO操作,提高流的传输效率。
字节缓冲流这里采用了装饰器模式来增强InputStream和OutputStream子类对象的功能。
举个例子,我们可以通过BufferedInputStream(字节缓冲输入流)来增强FileInputStream的功能。
我使用write(intb)和read()方法,分别通过字节流和字节缓冲流复制一个524.9mb的PDF文件耗时对比如下:
测试代码如下:
这次我们使用read(byteb[])和write(byteb[],intoff,intlen)方法,分别通过字节流和字节缓冲流复制一个524.9mb的PDF文件耗时对比如下:
使用缓冲流复制PDF文件总耗时:695毫秒使用普通字节流复制PDF文件总耗时:989毫秒两者耗时差别不是很大,缓冲流的性能要略微好一点点。
测试代码如下:
BufferedInputStream内部维护了一个缓冲区,这个缓冲区实际就是一个字节数组,通过阅读BufferedInputStream源码即可得到这个结论。
BufferedOutputStream将数据(字节信息)写入到目的地(通常是文件)的过程中不会一个字节一个字节的写入,而是会先将要写入的字节存放在缓存区,并从内部缓冲区中单独写入字节。这样大幅减少了IO次数,提高了读取效率
BufferedReader(字符缓冲输入流)和BufferedWriter(字符缓冲输出流)类似于BufferedInputStream(字节缓冲输入流)和BufferedOutputStream(字节缓冲输入流),内部都维护了一个字节数组作为缓冲区。不过,前者主要是用来操作字符信息。
下面这段代码大家经常使用吧?
PrintStream属于字节打印流,与之对应的是PrintWriter(字符打印流)。PrintStream是OutputStream的子类,PrintWriter是Writer的子类。
publicclassPrintStreamextendsFilterOutputStreamimplementsAppendable,Closeable{}publicclassPrintWriterextendsWriter{}随机访问流这里要介绍的随机访问流指的是支持随意跳转到文件的任意位置进行读写的RandomAccessFile。
RandomAccessFile的构造方法如下,我们可以指定mode(读写模式)。
//openAndDelete参数默认为false表示打开文件并且这个文件不会被删除publicRandomAccessFile(Filefile,Stringmode)throwsFileNotFoundException{this(file,mode,false);}//私有方法privateRandomAccessFile(Filefile,Stringmode,booleanopenAndDelete)throwsFileNotFoundException{//省略大部分代码}读写模式主要有下面四种:
RandomAccessFile中有一个文件指针用来表示下一个将要被写入或者读取的字节所处的位置。我们可以通过RandomAccessFile的seek(longpos)方法来设置文件指针的偏移量(距文件开头pos个字节处)。如果想要获取文件指针当前的位置的话,可以使用getFilePointer()方法。
RandomAccessFile代码示例:
读取之前的偏移量:0,当前读取到的字符A,读取之后的偏移量:1读取之前的偏移量:6,当前读取到的字符G,读取之后的偏移量:7读取之前的偏移量:0,当前读取到的字符A,读取之后的偏移量:1input.txt文件内容变为ABCDEFGHIJK。
RandomAccessFile的write方法在写入对象的时候如果对应的位置已经有数据的话,会将其覆盖掉。
RandomAccessFile比较常见的一个应用就是实现大文件的断点续传。何谓断点续传?简单来说就是上传文件中途暂停或失败(比如遇到网络问题)之后,不需要重新上传,只需要上传那些未成功上传的文件分片即可。分片(先将文件切分成多个文件分片)上传是断点续传的基础。
RandomAccessFile可以帮助我们合并文件分片,示例代码如下:
我在《Java面试指北》中详细介绍了大文件的上传问题。
RandomAccessFile的实现依赖于FileDescriptor(文件描述符)和FileChannel(内存映射文件)。
好的代购app:1、amazon亚马逊(amazon)全球购,从软件的名字很多用户朋友们就可以知道该软件主要是经销海外的产品的。2、eBayeBay是一个可让全球民众在网上买卖物品的线上拍卖及购物网站。
人们可以在ebay的软件上通过网络出售商品和代购。
3、网易考拉考拉海购是阿里巴巴旗下以跨境进口业务为主的会员电商,主打官方自营,全球直采的零售模式。4、WalmartWalmart(沃尔玛)是世界最大连锁零售企业,经营的商品品类齐全,海淘一族可以在walmart海淘服饰、布匹、药品、玩具、各种生活用品。5、NetFlixNetflixapp已经连续五次被评为顾客最满意的网站,本来不是电商平台,近年来新干起来的代购APP。
不靠谱,大多数都是诈骗。在网上做代购,如果没有信得过的人带的话是很危险的,很多诈骗分子利用人们想赚钱和贪小便宜的心理进行诈骗。
由于有些代购产品买卖行为发生在海外,出现问题则在国内,消费者若想直接向海外零售商或境外快递索赔,在法律适用上可能会产生冲突。
另外,如果商品未经过正规渠道进入国内,没有经过出入境检疫部门及海关检验,消费者在投诉时很难提供有效的证据进行维权。
电商代购(PurchasingAgency)指网上找人帮忙购买需要的商品,如名牌包包、化妆品、快消品等,代购地点为日本、韩国、香港、美国等国家和地区,代购服务有全球代购和代购网。代购出现源于当地商品价格比其他地区贵,所以消费者请人帮忙购买商品,代购人员或中介机构购买指定商品并通过快递发货、直接携带给购买人。
客户在网上代购商品,收取定额服务费,免费为客户订购、打包、配送。