操练了一段时间,便开始了对图片进行读取,开始的想法如下:图片也是一种文件,我大可以用FileInputStream类对其进行操作。并且我用这种方法进行测试的时候是可以的(需要注意,将一个图片文件读取到一个byte[]中,再从这个byte[]中向一个图片文件写入的时候,应该调用write(byte[],offset,length)这个方法,否则是不可以把流写进另一个图片文件的)。
问题在接下来的操作中出现了
因为我开始对文件进行读取首先是对于txt测试,首先是字节流,其次是字符流,到了图片这块儿,我也潜意识按照这种方法来操作,结果我通过很多次网上搜索和查看API发现,我极有可能是走进了一个自己给自己设计的很大的疑惑内:图片,可以用字符流来读取到程序里么?
(加一段:
字符流是官方对字节流的一种封装,一种简化,其目的为了令开发者更加好的读取文本。而图片,其存储方式可以理解为字节流的方式,因此,用字符流读取图片是一种自己给自己挖坑然后跳进去再想办法跳出来的行为。因此,用字符流读取图片,这种模式不好的。给大家带来的麻烦,深表歉意!
)
首先,在Java中,提供了四种类来对文件进行操作,分别是InputStream OutputStream Reader Writer ,前两种是对字节流的操作,后两种则是对字符流的操作。
那么,什么是字节流,什么又是字符流呢?
所有的文件在计算机的存储,从物理上看,其实都是二进制的01码。也就是说,字节流和字符流只是在逻辑上对文件的区分。这两种流到底哪里不同呢?编码方式不同。
到此,不再继续分析编码的详细,咱的知识也还没有那么深。
继续回到原来的图片问题,可以用字符流来读取图片么?我测试着没有成功,我也一直期待这种方法的出现
朋友告诉我,可以用二进制文件读取图片 ,我当时懵了,二进制读取图片,怎么听起来那么别扭呢
又开始在网上搜索,最后,也是在csdn上看到了一篇文章,对于我的帮助很大,以我的需要和我的认知程度看,二进制文件读取图片,其实就是用字节流读取图片。
至此,我觉得用二进制文件读取图片这个问题已经解决,其实就是用Java中提供的对字节流操作的类去操控图片文件
十分抱歉 我没有 附代码和运行截图,现在补上:
import java.io.*;
import javax.swing.*;
public class Start
{
public static void main(String args[]) throws Exception{
//源文件,必须存在,路径可选
File sf = new File("H:/javapro/files/source.jpg");
//目的文件,因为要向其中写入,指定文件可以不存在,由程序生成
File df = new File("H:/javapro/files/dest.jpg");
new ReadWriteGra(sf,df);
new UseGra(df);
}
}
class ReadWriteGra
{
FileInputStream in = null;
FileOutputStream out = null;
public ReadWriteGra(File sourceFile,File destFile) throws Exception{
byte[] buf = new byte[1024];
int len = 0;
in = new FileInputStream(sourceFile);
out = new FileOutputStream(destFile,true);
while( (len = in.read(buf)) != -1 ){
out.write(buf,0,len);
}
out.close();
}
}
class UseGra extends JFrame
{
public UseGra(File picFile) throws Exception{
this.setVisible(true);
this.setResizable(false);
this.setLayout(null);
this.setBounds(600, 200, 400, 370);
this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
JPanel p1 = (JPanel)this.getContentPane();
p1.setOpaque(false);
p1.setLayout(null);
InputStream is = new FileInputStream(picFile);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
int b = 0;
while((b = is.read())!=-1){
baos.write(b);
}
ImageIcon image = new ImageIcon(baos.toByteArray());
JLabel background = new JLabel(image);
this.getLayeredPane().add(background, new Integer(Integer.MIN_VALUE));
background.setBounds(0, 0, image.getIconWidth(), image.getIconHeight());
JButton bt = new JButton("Test_Button");
p1.add(bt);
bt.setBounds(10,10,150,25);
validate();
}
}
说明,左上部分是程序运行后的文件目录,通过程序,生成了dest.jpg,左下部分是用生成的dest.jpg填充一个jframe的背景,右部分是对程序的运行
编写环境: EditPlus