java 字节流读取图片,字符流读取,二进制读取

java 字节流读取图片,字符流读取,二进制读取

这两天在学习java中如何对文件进行读取,首先当然是对最简单的文件txt文件进行操练了。并且,逐渐的了解了Java中IO流是如何对文件进行操作的

操练了一段时间,便开始了对图片进行读取,开始的想法如下:图片也是一种文件,我大可以用FileInputStream类对其进行操作。并且我用 这种方法进行测试的时候是可以的(需要注意,将一个图片文件读取到一个byte[]中,再从这个byte[]中向一个图片文件写入的时候,应该调用 write(byte[],offset,length)这个方法,否则是不可以把流写进另一个图片文件的)。

问题在接下来的操作中出现了

因为我开始对文件进行读取首先是对于txt测试,首先是字节流,其次是字符流,到了图片这块儿,我也潜意识按照这种方法来操作,结果我通过很多次网上搜索和查看API发现,我极有可能是走进了一个自己给自己设计的很大的疑惑内:图片,可以用字符流来读取到程序里么?

(加一段:

字符流是官方对字节流的一种封装,一种简化,其目的为了令开发者更加好的读取文本。而图片,其存储方式可以理解为字节流的方式,因此,用字符流读取 图片是一种自己给自己挖坑然后跳进去再想办法跳出来的行为。因此,用字符流读取图片,这种模式不好的。给大家带来的麻烦,深表歉意!

)

首先,在Java中,提供了四种类来对文件进行操作,分别是InputStream   OutputStream   Reader  Writer ,前两种是对字节流的操作,后两种则是对字符流的操作。

那么,什么是字节流,什么又是字符流呢?

所有的文件在计算机的存储,从物理上看,其实都是二进制的01码。也就是说,字节流和字符流只是在逻辑上对文件的区分。这两种流到底哪里不同呢?编码方式不同。

到此,不再继续分析编码的详细,咱的知识也还没有那么深。

继续回到原来的图片问题,可以用字符流来读取图片么?我测试着没有成功,我也一直期待这种方法的出现

朋友告诉我,可以用二进制文件读取图片 ,我当时懵了,二进制读取图片,怎么听起来那么别扭呢

又开始在网上搜索,最后,也是在csdn上看到了一篇文章,对于我的帮助很大,以我的需要和我的认知程度看,二进制文件读取图片,其实就是用字节流读取图片。

至此,我觉得用二进制文件读取图片这个问题已经解决,其实就是用Java中提供的对字节流操作的类去操控图片文件

十分抱歉 我没有 附代码和运行截图,现在补上:

[java] view plain copy
  1. import java.io.*;  
  2. import javax.swing.*;  
  3. public class Start  
  4. {  
  5.     public static void main(String args[]) throws Exception{  
  6.           
  7.         //源文件,必须存在,路径可选  
  8.         File sf = new File("H:/javapro/files/source.jpg");    
  9.           
  10.         //目的文件,因为要向其中写入,指定文件可以不存在,由程序生成  
  11.         File df = new File("H:/javapro/files/dest.jpg");  
  12.         new ReadWriteGra(sf,df);  
  13.         new UseGra(df);  
  14.     }  
  15. }  
  16.   
  17. class ReadWriteGra   
  18. {  
  19.     FileInputStream in = null;  
  20.     FileOutputStream out = null;  
  21.     public ReadWriteGra(File sourceFile,File destFile) throws Exception{  
  22.         byte[] buf = new byte[1024];  
  23.         int len = 0;  
  24.         in = new FileInputStream(sourceFile);  
  25.         out = new FileOutputStream(destFile,true);  
  26.         while( (len = in.read(buf)) != -1 ){  
  27.             out.write(buf,0,len);  
  28.         }  
  29.         out.close();  
  30.     }  
  31. }  
  32. class UseGra extends JFrame  
  33. {  
  34.     public UseGra(File picFile) throws Exception{  
  35.   
  36.         this.setVisible(true);  
  37.         this.setResizable(false);  
  38.         this.setLayout(null);  
  39.         this.setBounds(600, 200, 400, 370);  
  40.         this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);  
  41.         JPanel p1 = (JPanel)this.getContentPane();  
  42.         p1.setOpaque(false);  
  43.         p1.setLayout(null);  
  44.         InputStream is = new FileInputStream(picFile);  
  45.         ByteArrayOutputStream baos = new ByteArrayOutputStream();  
  46.         int b = 0;  
  47.         while((b = is.read())!=-1){  
  48.             baos.write(b);  
  49.         }  
  50.         ImageIcon image = new ImageIcon(baos.toByteArray());  
  51.         JLabel background = new JLabel(image);  
  52.         this.getLayeredPane().add(background, new Integer(Integer.MIN_VALUE));  
  53.         background.setBounds(0, 0, image.getIconWidth(), image.getIconHeight());  
  54.         JButton bt = new JButton("Test_Button");  
  55.         p1.add(bt);  
  56.         bt.setBounds(10,10,150,25);  
  57.         validate();  
  58.     }  
  59. }  


 

 

 

说明,左上部分是程序运行后的文件目录,通过程序,生成了dest.jpg,左下部分是用生成的dest.jpg填充一个jframe的背景,右部分是对程序的运行

转载于:https://my.oschina.net/u/232879/blog/155444

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值