#java IO流的简单使用——教你开发一个属于自己的图片格式

java IO流的简单使用——教你写一个属于自己的图片格式

说在前面:本次学习需要提前学会:java窗口的编写、画图板的制作;

1、 简单的I/O知识点:
(1)、保存一个数字或字符到指定文件的简单步骤:

第一步,建立一个OutputStream类以及DataOutputStream类:

OutputStream OutputStream类名= new FileOutputStream(文件路径以及文件名,没有则会自动创建);
DataOutputStream DataOutputStream类名 = new DataOutputStream(OutputStream对象名);

第二步,使用writeChar方法写入字符,使用writeInt方法写入整形数字:

   DataOutputStream对象名.writeChar('|');
   DataOutputStream对象名.writeInt(1);

第三步,刷新,讲流里面缓存的数据写入文件:

        DataOutputStream对象名.flush();

第四步,关闭文件:

   DataOutputStream对象名.close();

(2)、打开一个数字或字符到指定文件的简单步骤:

第一步,建立一个InputStream类以及DataInputStream类:

OutputStream InputStream类名= new FileInputStream(文件路径以及文件名,没有则会自动创建);

DataInputStream DataOutputStream类名 = new DataInputStream(OutputStream对象名);
第二步,使用writeChar方法写入字符,使用writeInt方法写入整形数字:

   DataInputStream对象名.readChar();
   DataInputStream对象名.readInt();

第三步,关闭文件:

   DataInStream对象名.close();

2、 写一个属于自己的图片格式
(1)、写一个窗口,添加两个按钮和两个文本框,两个按钮的文字分别为保存、打开,如下:

—DraFrame.java—


import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;
public class DrawFrame {
	public static void main(String [] args){
		showUI();
	}	
	public static void showUI(){
	    JFrame jsf = new JFrame();
	    jsf.setSize(1000,900);
	    jsf.setTitle("画板");
	    jsf.setDefaultCloseOperation(3);   //设置退出程序方法
	    jsf.setLocationRelativeTo(null);   //设置居中显示
	 //   jsf.setResizable(false);
	    java.awt.FlowLayout jaf = new java.awt.FlowLayout();
	    jsf.setLayout(jaf);
	    JTextField jst_Name = new JTextField("请输入文件名");
	    jsf.add(jst_ Name);
	    JTextField jst_Path = new JTextField("请输入文件路径及文件名");
	    jsf.add(jst_Path);
	    JButton jsb_Sa = new JButton("保存");
	    jsf.add(jsb_Sa);
	    JButton jsb_Op = new JButton("打开");
	    jsf.add(jsb_Op);
	    jsf.setVisible(true);
    }
}

(2)、为窗口添加鼠标监听器,实现画直线功能:
—DraFrame.java—

import java.awt.Graphics;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;

public class DrawFrame {

	public static void main(String [] args){
		showUI();
	}	
	public static void showUI(){
	    JFrame jsf = new JFrame();
	    jsf.setSize(1000,900);
	    jsf.setTitle("画板");
	    jsf.setDefaultCloseOperation(3);   //设置退出程序方法
	    jsf.setLocationRelativeTo(null);   //设置居中显示
	 //   jsf.setResizable(false);
	    java.awt.FlowLayout jaf = new java.awt.FlowLayout();
	    jsf.setLayout(jaf);
	    JTextField jst_Name = new JTextField("请输入文件名");
	    jsf.add(jst_IfsX);
	    JTextField jst_Path = new JTextField("请输入路径及文件名");
	    jsf.add(jst_Path);
	    JButton jsb_Sa = new JButton("保存");
	    jsf.add(jsb_Sa);
	    JButton jsb_Op = new JButton("打开");
	    jsf.add(jsb_Op);
	    jsf.setVisible(true);
	    Graphics g = jsf.getGraphics();
	    DrawListener d = new DrawListener(g);
	    jsf.addMouseListener(d);
    }
}

— DrawListener.java—

import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.Graphics;
public class DrawListener implements MouseListener {
	private int x1,x2,y1,y2;
	Graphics g;
	public DrawListener(Graphics g) {
		this.g = g;
	}
	@Override
	public void mouseClicked(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mousePressed(MouseEvent e) {
		x1=e.getX();
	   	y1=e.getY();
	}

	@Override
	public void mouseReleased(MouseEvent e) {
		x2=e.getX();
	    y2=e.getY();
	    g.drawLine(x1, y1, x2, y2);
	}

	@Override
	public void mouseEntered(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseExited(MouseEvent e) {
		// TODO Auto-generated method stub
	}
}

(3)、写一个类,在画线时将点的位置数据保存,同时在里面写一个画线的方法:
—PointInfo.java—


import java.awt.Graphics;

public class PointInfo {
	Graphics g;
    private int x1,y1,x2,y2;
    PointInfo(int x1, int y1, int x2, int y2){
    	this.x1=x1;
    	this.y1=y1;
    	this.x2=x2;
    	this.y2=y2;
    }
    public void draw(){
    	g.drawLine(x1, y1, x2, y2);
    }
}

(4)、在监听器类里写一个PointInfo:的对象数组,在画线时将各点数据保存:

—DrawListener.java—


import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.Graphics;
public class DrawListener implements MouseListener,ActionListener {
	private int count = 0;
	PointInfo[] point = new PointInfo[100];
	private int x1,x2,y1,y2;
	Graphics g;
	
	public DrawListener(Graphics g) {
		this.g = g;
	}
	
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		
	}
	
	public void mouseClicked(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mousePressed(MouseEvent e) {
		x1=e.getX();
	   	y1=e.getY();
	}

	@Override
	public void mouseReleased(MouseEvent e) {
		x2=e.getX();
	    y2=e.getY();
	    g.drawLine(x1, y1, x2, y2);
	    PointInfo p = new PointInfo(x1, y1, x2, y2);
	    point[count++] = p;
	}

	@Override
	public void mouseEntered(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseExited(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}
}

(4)、为保存按钮添加事件监听器,实现保存功能,为打开按钮添加事件监听器,实现打开功能:


---DrawFrame.java---

import java.awt.Graphics;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JTextField;

public class DrawFrame {

	public static void main(String [] args){
		showUI();
	}	
	public static void showUI(){
	    JFrame jsf = new JFrame();
	    jsf.setSize(1000,900);
	    jsf.setTitle("画板");
	    jsf.setDefaultCloseOperation(3);   //设置退出程序方法
	    jsf.setLocationRelativeTo(null);   //设置居中显示
	 //   jsf.setResizable(false);
	    java.awt.FlowLayout jaf = new java.awt.FlowLayout();
	    jsf.setLayout(jaf);
	    JTextField jst_Name = new JTextField("请输入文件名");
	    jsf.add(jst_Name);
	    JTextField jst_Path = new JTextField("请输入路径及文件名");
	    jsf.add(jst_Path);
	    JButton jsb_Sa = new JButton("保存");
	    jsf.add(jsb_Sa);
	    JButton jsb_Op = new JButton("打开");
	    jsf.add(jsb_Op);
	    jsf.setVisible(true);
	    Graphics g = jsf.getGraphics();
	    DrawListener d = new DrawListener(g,jst_Name,jst_Path);
	    jsb_Sa.addActionListener(d);
	    jsb_Op.addActionListener(d);
	    jsf.addMouseListener(d);
    }
}

—DrawListener.java—


import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;

import javax.swing.JTextField;

public class DrawListener implements MouseListener,ActionListener {
	private int count = 0;
	PointInfo[] point = new PointInfo[100];
	private int x1,x2,y1,y2;
	Graphics g;
	String Bt;
	private JTextField TxN;
	private JTextField TxP;
	
	public DrawListener(Graphics g,JTextField t1,JTextField t2) {
		this.g = g;
		TxN = t1;
		TxP = t2;
	}
	
	public void WriteFile() throws IOException {
		if (Bt.equals("保存")) {
			String fileName = TxN.getText();
			File f = new File("D://" + fileName + ".ant");//后面的点后的即为文件格式,可以随意设置
			OutputStream out = new FileOutputStream(f);
			DataOutputStream dOut = new DataOutputStream(out);
			for (int i = 0; i < point.length; i++) {
				//将个坐标的位置存入,用'|'隔开
				dOut.writeChar('|');  //写一个斜杠
				dOut.writeInt(point[i].x1); //写x1的坐标
				dOut.writeChar('|'); 
				dOut.writeInt(point[i].y1);
				dOut.writeChar('|'); 
				dOut.writeInt(point[i].x2);
				dOut.writeChar('|'); 
				dOut.writeInt(point[i].y2);
				out.flush();
				dOut.flush();
			}
			out.close();
			dOut.close();
		}
	}
	public void ReadFile() throws IOException {
		if (Bt.equals("打开")) {
			count = 0 ;
			String filePath = TxP.getText();
			InputStream in = new FileInputStream(filePath);
			DataInputStream dIn = new DataInputStream(in);
			while (true) {
			//	dIn.readChar();
				if (dIn.readChar() == -1) {
					System.out.println("读取完毕");
					break;
				}
				int x1 = dIn.readInt();
				dIn.readChar();
				int y1 = dIn.readInt();
				dIn.readChar();
				int x2 = dIn.readInt();
				dIn.readChar();
				int y2 = dIn.readInt();
				PointInfo p =new PointInfo(x1, y1, x2, y2);
				p.draw(g);
			}
			in.close();
			dIn.close();
          
			// System.out.println(a);
			// dIn.
		}
	}
	
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		Bt = e.getActionCommand();
		try {
			ReadFile();
		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		try {
			WriteFile();
		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
	}
	
	public void mouseClicked(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mousePressed(MouseEvent e) {
		x1=e.getX();
	   	y1=e.getY();
	}

	@Override
	public void mouseReleased(MouseEvent e) {
		x2=e.getX();
	    y2=e.getY();
	    g.drawLine(x1, y1, x2, y2);
	    PointInfo p = new PointInfo(x1, y1, x2, y2);
	    point[count++] = p;
	}

	@Override
	public void mouseEntered(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}

	@Override
	public void mouseExited(MouseEvent e) {
		// TODO Auto-generated method stub
		
	}
}

—PointInfo.java—


import java.awt.Graphics;

public class PointInfo {
    int x1,y1,x2,y2;
    PointInfo(int x1, int y1, int x2, int y2){
    	this.x1=x1;
    	this.y1=y1;
    	this.x2=x2;
    	this.y2=y2;
    }
    public void draw(Graphics g){
    	g.drawLine(x1, y1, x2, y2);
    }
}

这样即可实现:在第一个文本框里输入文件名点保存,指定路径便会出点指定文件:

在第二个文本框点输入路径及文件名,点打开即可看到响应图形:

更多图像保存的方法和上面类似,按实际情况稍作更改和设计读写规则即可。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值