Java IO无法读取输入文件?

时间:2012-11-10 03:20:42

标签: java image applet

我刚刚开始学习java,我一直在使用键盘输入来处理移动对象的代码。我现在正试图在后台添加,但它一直出错:

javax.imageio.IIOException: Can't read input file!
    at javax.imageio.ImageIO.read(Unknown Source)
    at game.GameLoop.run(GameLoop.java:24)
    at java.lang.Thread.run(Unknown Source)

我在Game.java中的代码是:

package game;

import java.applet.*;
import java.awt.*;

public class Game extends GameLoop{

    public void init(){
        setSize(864,480);
        Thread th = new Thread(this);
        th.start();
        offscreen = createImage(864,480);
        d = offscreen.getGraphics();
        addKeyListener(this);
    }

    public void paint(Graphics g){
        d.clearRect(0, 0, 864, 480);
        d.drawImage(background, 0, 0, this);
        d.drawRect(x, y, 20, 20);
        g.drawImage(offscreen, 0, 0, this);
    }

    public void update(Graphics g){
        paint(g);
    }
}

这是我的GameLoop.java:

package game;

import java.applet.*;
import java.awt.*;
import java.awt.event.*;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import javax.imageio.ImageIO;

public class GameLoop extends Applet implements Runnable, KeyListener{

    public int x, y;
    public Image offscreen;
    public Graphics d;
    public boolean up, down, left, right;
    public BufferedImage background;

    public void run(){
        x = 100;
        y = 100;
        try {
            background = ImageIO.read(new File("background.png"));
        } catch (IOException e1) {
            e1.printStackTrace();
        }
        while(true){
            x = 100;
            y = 100;
            while(true){
                if (left == true){
                    x-=4;
                }
                if (right == true){
                    x+=4;
                }
                if (up == true){
                    y-=4;
                }
                if (down == true){
                    y+=4;
                }
                if ( x <= 0 ){
                    x = 0;
                }
                if ( y <= 0 ){
                    y = 0;
                }
                if ( x >= 843 ){
                    x = 843;
                }
                if ( y >= 460 ){
                    y = 459;
                }
                repaint();
            try{
                Thread.sleep(20);
            } catch(InterruptedException e){
                e.printStackTrace();
            }
            }
        }
    }

    //@Override
    public void keyPressed(KeyEvent e) {
        if(e.getKeyCode() == 37){
            left = true;
        }
        if(e.getKeyCode() == 38){
            up = true;
        }
        if(e.getKeyCode() == 39){
            right = true;
        }
        if(e.getKeyCode() == 40){
            down = true;
        }
    }

    //@Override
    public void keyReleased(KeyEvent e) {
        if(e.getKeyCode() == 37){
            left = false;
        }
        if(e.getKeyCode() == 38){
            up = false;
        }
        if(e.getKeyCode() == 39){
            right = false;
        }
        if(e.getKeyCode() == 40){
            down = false;
        }
    }

    //@Override
    public void keyTyped(KeyEvent e) {
    }
}

很抱歉编辑我似乎无法在``中得到所有内容,而且我也会修复凌乱的代码,但是你们有任何想法是什么导致了这个错误,有一个文件在src目录叫做background.png,它非常基本,用MS绘制,如果有帮助的话。

感谢。

2 个答案:

答案 0 :(得分:4)

有两个地方,一个简单的沙盒小程序可以获取图像。

其中

  1. 提供applet的同一服务器上的松散文件。例如。这可能用于沙盒“图像幻灯片放映”,其中图像名称以applet参数提供。
  2. applet的运行时类路径上的Jar。最适合通常不会改变的资源(除非本地化图像变得更复杂)。例如。这可能用于按钮/菜单图标或BG图像。
  3. "background.png"强烈表明第二种情况 - '应用程序的一部分。本身”。

    如何找到

    这两种类型的资源都应由URL标识(不要尝试建立File ,因为在部署applet时它会失败。)

    获得第二种情况的URL的方法类似于:

    URL urlToBG = this.getClass().getResource("/path/to/the/background.png");
    

    ..其中/path/to/the/可能只是/resources//images/。它是类路径中Jar的路径,可以在其中找到图像。

    如何加载

    大多数加载File的方法都会重载以接受URL。这特别适用于ImageIO.read(URL)

    虽然Applet类具有内置方法来加载图像,但我建议坚持使用ImageIO,因为它可以提供更全面的故障反馈。

    进一步提示

    提示1

    Thread.sleep(20);
    

    不要阻止EDT(事件调度线程) - 当发生这种情况时,GUI将“冻结”。而不是调用Thread.sleep(n)为重复任务实现Swing Timer或为长时间运行的任务实现SwingWorker。有关详细信息,请参阅Concurrency in Swing

    提示2

    这是第三个千年,是时候开始使用Swing而不是AWT了。这意味着延长JApplet而不是Applet。然后你可以将绘画的逻辑转换为默认为双缓冲的JPanel,并且可以在applet或框架(或窗口或对话框......)中使用。

    提示3

    setSize(864,480);
    

    applet的大小是用HTML设置的,applet应该接受分配的大小并在其中工作。考虑到这一点,声明如下:

    d.clearRect(0, 0, 864, 480);
    

    ..应该更像是:

    d.clearRect(0, 0, getWidth(), getHeight());
    

答案 1 :(得分:1)

@Patricia Shanahan您的评论实际上帮助我解决了同样的问题。

我用过那段代码:

File here = new File(".");
try {
    System.out.println(here.getCanonicalPath());
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

从那里你可以找出正确的使用路径。